你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32官方实战经验分享(2020.7.31更新) 精华  

[复制链接]
沐紫 发布时间:2014-1-23 14:58
赞 11 收藏 157 评论278 发布时间:2014-1-23 14:58
278个回答
diandian 回答时间:2017-8-1 14:48:40
签到签到
diandian 回答时间:2017-8-1 14:53:42
围观围观
忘不掉 回答时间:2017-9-5 19:19:50
非常不错!很好的资料!
epochal 回答时间:2017-9-5 21:09:57
版块真好!赞赞赞!
leo121_3006061 回答时间:2017-9-18 11:50:24
非常好的帖子,THANKS!
1401696616 回答时间:2017-9-28 15:25:21
许多问题并没有碰到  只能来签个到
嵌了个入式 回答时间:2017-11-21 08:54:00
厉害了,这个帖子必须要顶一下
带我装逼带我飞 回答时间:2017-12-22 09:14:44
好贴,MARK!
5768340 回答时间:2018-1-13 14:42:54
HI  
; r" b7 i5 h' F   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
  z5 Y# {" l% E8 \8 j% G( O8 M   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************4 ^& R8 Y% ^, U6 I1 ~
  2. 函数名称:Cdfinger_Bspspi_init$ g/ k; ?9 A4 }( M7 O
  3. 函数作用:spi初始化函数
    7 P7 D. C1 v4 M! [* X+ H7 S% Q
  4. 备注:
    - m. F% a2 z9 T2 r5 |
  5. ******************************************/( g3 _# M: m( ~9 Z0 n
  6. void Cdfinger_Bspspi_init(void)6 F1 {3 B4 k4 v: |6 j; a
  7. {9 T+ c" e; i  Z+ Z( J
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    % E1 X* y  d# O7 e9 c
  9.         SPI_InitTypeDef  SPI_InitStructure;
    0 A( E- D# C! q" Z
  10.         DMA_InitTypeDef  DMA_InitStructure;! d7 N. f  v5 W$ a( q. o! Q
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    + r% x/ P: o/ \. P1 K6 D
  12.   0 b% u5 T& @! i
  13.         int ii =0;9 _% f2 R+ v5 N$ |2 H# {* p* e
  14.         $ }# i8 Z3 }: Y2 H: F
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);. ~! L+ r# j) ^$ W" N: t
  16.         /*!< Enable SPI2 clocks */
    1 o$ O* ?% _' l$ ^
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);  v- r) g- i' |9 }) g* u$ \; b/ W
  18.         /*!< Enable GPIO clocks *// Y& |% B' P3 G4 [) K/ l
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    5 l2 C' w) `: t4 J
  20.         /*!< Connect SPI pins to AF5 */
    ! ^2 ]3 i9 A- i' J1 R  }$ H9 e5 [
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);' v, z: j& ^$ z. v' G. ?) G
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);' q9 }7 i; c5 b) y5 e3 J2 j
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    0 d+ q3 g/ u( }: s/ s
  24. 1 M* b0 w* d$ }7 r
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    , s# R* U; \* R, `( s
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    9 i/ h' a1 [% k& d3 C2 o1 A. F
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    . v# g' X/ n: v
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    # G0 P! m) p$ A
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    7 T& q  C. `2 o: m6 `( I  e" `7 K
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);* N/ Y* Y" b  l2 ]* a. t7 [

  31. ( r& K8 B+ F" c0 V7 `9 v5 g! \
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    $ }% m) Z8 d" W/ |
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;$ h( }1 X" j! n+ l4 ^
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;& F: ~$ W' b! g9 P
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. v4 B$ y% q6 B' c# K1 T( P3 h
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;) R7 c! y8 i# |1 O# F6 z
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);+ B6 J# o* F- ]& a3 ?2 g# |  t
  38.         Cdfinger_BspCs_HIGH();
    & G+ K2 g1 k) r5 Y6 X
  39.         //Cdfinger_Bspdelay_ms(1);8 \* V! r! o! I% r1 S, W# b
  40.   //Cdfinger_BspCs_LOW();" N/ W/ m+ l4 A5 O8 t
  41.         SPI_Cmd(SPI2,DISABLE);
    9 k8 s. g) T- B9 Z5 \: Q* _8 c& p
  42.         SPI_DeInit(SPI2);
    9 {% M* [$ Q; Z- ?. f
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;) r9 ?, p$ w. D  v6 i  `+ j
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;" A3 w$ A: f1 v
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    " P  U3 h  {) o6 Z2 M% o) j
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;9 ]5 ]# x3 k- D& q5 \- a
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;. G; M0 ]3 `7 ?- s  [& o
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    ) N" c! i  ?9 G+ M4 Z- u7 P
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    7 b/ h* O; _" V+ c  u
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    ' |5 p% k/ J& |5 L0 }3 f& r
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;0 J; l% i3 x/ M
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    ) K( q% N: W% L

  53. # g8 O2 \- R! K% t, h' E8 D
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    3 P  W: |) I! f6 U9 N
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/' @6 U% W5 n9 }9 M9 O
  56.         DMA_DeInit(DMA1_Stream4);
    % W* B$ H) k* ?+ F2 `1 F, s6 L
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    # f6 t  i: z- u+ X( h
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);" f2 g8 X. [" B* N' n- {% \
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];$ b4 L$ h. ]6 B. b+ k1 E+ ?( S
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    # P% h+ O2 Q, J. y$ c& Z* f2 G) U
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;% B# B& j* T% \
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;+ l$ ~" _. W# h# s9 @0 K# J9 Q
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    - t% T7 }. l4 g# Y6 K" b
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    $ U0 O5 R1 h3 z% P
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    0 H- k) J4 u- A
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;& c3 j+ n  y( n6 p& _
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
    " c- Z) ~5 N  Y) A; Z0 R; N( I
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;6 X# d) F8 O7 o3 |2 d0 @& v
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;5 h/ f, F- h  @
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;5 A4 {$ ^& a$ Z
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;' O* x) ~! @) u9 N$ |- i( @
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);4 L' m8 R1 D" o) {+ I# I
  73.   & v1 V4 J/ m( R  A/ p7 N
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/9 N9 \% R6 U' Z& Y  T
  75.         DMA_DeInit(DMA1_Stream3);6 v1 a# A. @! E% [
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    - U& M5 g, m; r! Q# T: E1 \
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    ! T4 c# \6 l* U
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];* Y: b5 W, Q% p3 q
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;8 p" R' d& f$ W' y: H
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;# c, Q- ]- t- @- l2 [
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    # l% T! W- M2 s- M
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    * A# D& }# ?5 S; d" t
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;2 s  x/ W. S# c4 y' v% u1 N% C! ^
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
      k/ F' m& M2 Q* \! S# x
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;/ N$ K/ v! [$ K5 _: v
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    2 ?, x0 B0 B) P2 X; d' }
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    , u0 c2 Z+ F$ p1 H& S; A5 m/ S
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;2 }# {  `/ y+ n/ @0 i$ x
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;  Z- J1 h1 ?0 g. o2 h  z$ F! R7 n6 B
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    7 O3 H" w4 b2 u/ P# s% e; R
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);: Q$ G1 n9 p& k+ y
  92.         //Cdfinger_BspCs_HIGH();
    : m! K6 h5 d6 ~4 Z: W& [
  93.        
    4 M% \5 R" M4 ]' l& R( X
  94. 1 k: X$ y4 |7 z$ ~7 e
  95. 6 _3 ]; s# R: X4 B. F! e
  96.         //发送中断# w1 r9 N6 g3 ?* e+ k4 ]
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);7 `, Q+ w; P" Q0 q$ {4 A
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    . I' e  o4 y$ s- W* i
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    & Z5 v& O8 J7 k( b, t0 F) D
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;3 s' m7 y" m9 K% u" J3 [
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;, T5 n, m1 C, x# e- o2 x& G
  102.         NVIC_Init(&NVIC_InitStructure);* Z  a. `5 f* \3 Z# W. Y$ M
  103.        
    4 Z0 ]# ?) n5 F7 L% I! u2 `% X
  104.         //接收中断9 B, ~' `: S2 U4 O* R, _
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    & V# X$ w7 k) I+ Q, c' d
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     1 o3 Y) U) @8 h# y8 ~
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    % T; H8 z7 E  ]! b+ |8 h; e* h: G; t
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    $ m" D9 |# l' X6 ]$ r
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;& i* Y) t; V5 w
  110.         NVIC_Init(&NVIC_InitStructure);
    / W( Y0 U% Q5 ^8 p1 A  M7 K% b
  111.         SPI_TIModeCmd(SPI2,ENABLE);
    + O1 {; f) L2 ^; v( [& R. L
  112.         SPI_Cmd(SPI2, ENABLE);6 L. V( f: Q3 k" i# ?; [' z8 J
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);' p9 b% H, {% Q: m8 M
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);8 d$ N% J: O) H
  115. ( K* U! O  k! P5 n; u* p6 d
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    # P- K3 B3 {6 r' @8 ~
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    0 o2 D/ T* j9 A; p$ Z
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    ! g+ m8 V( e" u/ \- `9 b
  119. $ `- j5 v5 i% S7 _" C
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    $ Y+ H" y( A" u9 |
  121.         {) U7 Z1 n, W2 \9 u4 i7 w( o
  122.           if(ii%8==0)
    ; Z% L2 J( s, E
  123.                 {
    4 z3 M3 C5 `, r
  124.                                 printf("\r\n");
    / [. B3 Y, @' N9 [1 |; o
  125.                 }
    % C! [: g: o3 @& z/ G0 [7 C
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    2 B9 D' C- I1 f' y
  127.         }3 i4 l6 ~( h& O% G. y3 x% F
  128.         printf("111\r\n");0 I  @0 j6 I2 t6 f* O
  129. }
    / z; q; F$ y5 g- I

  130. 3 W# U$ x% G8 j( _+ u# @

  131. % D4 l; {. O9 M1 Z
  132. void DMA1_Stream4_IRQHandler(void)' e0 T& P) N3 k! _
  133. {! o+ k+ r# g, d; q( ^2 l
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)) @- ?2 Q3 m5 ~0 X" ~- x2 t
  135.   {
    7 ]7 \" v/ X: I. ^& @
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
    : Y- |! Z/ J1 o+ T
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);0 ^  H: `# t0 Q1 g
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);" A& d3 w( l4 H; y8 `
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    ) ~8 O# D; X% b9 w* X% `9 U- }
  140.   }, P( G( r6 X% q6 W: C
  141. }* g% t7 `0 n% a1 K

  142. + i; Z/ E+ x7 z+ Y8 S) p. a: P+ |
  143. void DMA1_Stream3_IRQHandler(void)- v8 |. [  @& r0 E1 y3 O9 m
  144. {  q+ E# n1 ?, t+ ~* r: A
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
    $ U0 d* G3 |. g* T7 m
  146.   {
    - z2 n3 v5 I' \% g3 J9 t+ g
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));$ s& I2 H  u. `$ U4 P
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);. y+ F/ d- F4 U( F. @
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);! x+ t' @$ c# s: z& U* X; H8 o
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    6 n+ i( P: w( U# N. R
  151.   }( p/ d& I4 G! U4 }) X7 C
  152. }
复制代码
feixiang20 回答时间:2018-1-15 20:53:18
喜欢实战篇
dapan100 回答时间:2018-2-5 17:11:58
多看看别人出过的错,自己就不会犯了
langtaosha 回答时间:2018-2-22 21:04:38
多谢,大神中的大神
天外来客-399848 回答时间:2018-3-16 14:51:55
MARK一下
MouseCat 回答时间:2018-3-16 17:46:27
好资料!!!!
冷眼1121 回答时间:2018-3-16 19:53:51
极好的帖子
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版