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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
阅读主题, 点击返回1楼
赞 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  + H, [4 S* V3 w' T* a
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
* b  l# u* j% N: ~6 L' n8 F2 y  W   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    # Z, ^9 u0 T# i1 ]- p( F
  2. 函数名称:Cdfinger_Bspspi_init
    9 P: F. Y2 E, ^. ?1 D- B  f
  3. 函数作用:spi初始化函数5 B+ _" x1 A6 W3 P2 a
  4. 备注:# ^: O7 [; X9 a6 u
  5. ******************************************/
    4 r- n; Q4 a( o: X4 R
  6. void Cdfinger_Bspspi_init(void)* k9 e! c+ f+ M$ \/ M
  7. {1 @7 w9 x1 n% s0 T, c) q. A
  8.         GPIO_InitTypeDef GPIO_InitStructure;; H8 [7 e4 Q2 K/ J
  9.         SPI_InitTypeDef  SPI_InitStructure;, E# d" m: e) ^. k$ ]/ `# _0 ^
  10.         DMA_InitTypeDef  DMA_InitStructure;
    6 T/ m8 y2 e/ n+ j
  11.         NVIC_InitTypeDef NVIC_InitStructure;6 `6 {0 R  t0 E
  12.   
    " T* O% ^2 {4 ?
  13.         int ii =0;
    6 K: L+ |+ ?9 M- j- N8 V+ T
  14.         , b9 I( n5 d( m" Z' R
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    . i( p' `5 e  q: E; H7 f: D5 L1 u
  16.         /*!< Enable SPI2 clocks */
      d) m# o6 c8 o4 z5 c5 R& b. j% U
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);( ~4 r" k& r! A( I2 |' S
  18.         /*!< Enable GPIO clocks */
    : t' j& m# E) L' Q5 X% y
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);) B+ D8 u5 n: V; |9 n2 X  i& A
  20.         /*!< Connect SPI pins to AF5 */( @6 U6 i6 J& \) |) ~% Q
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);! p5 t6 g% ?# G
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);5 \: v7 n/ z6 t+ n: f. _3 \0 H
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);3 Z: q& W) Z7 |, A/ ?2 a

  24. $ k" {! k& ^9 u. u" Z3 R' ^! g/ b
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    7 O2 M! M: r% Y9 u/ k8 c# e/ l
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: v$ }) W) F# V2 ]8 s* I8 J% i* i, |
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    - @5 V4 |$ p5 F0 Z" e
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;8 l% G/ p  V; K2 v1 i
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;9 P4 C1 T( }; Z+ [# B
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    9 @9 c1 z' k7 k# V5 h$ q% V
  31. 8 I- W# `1 _( K" U2 U& h% |
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    ; x  I& y' i5 E: B0 ]6 ?2 h! N6 t
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    ' Y* L- P6 }( o* g
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    : e: n$ {9 S2 G2 c1 J
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    4 {% y( _+ k8 D' ~
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;4 ~* ^6 _1 L6 p# W
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    ; ?9 q& |$ b# B6 }. b# q. k$ O$ @
  38.         Cdfinger_BspCs_HIGH();5 I- L% f" }. ^* Y" J' O7 Z$ N5 G2 R
  39.         //Cdfinger_Bspdelay_ms(1);3 B$ c7 T! j* c
  40.   //Cdfinger_BspCs_LOW();4 z, ~; p2 m* ~! V
  41.         SPI_Cmd(SPI2,DISABLE);
    + z, r' G  c* b) O8 R# K1 u
  42.         SPI_DeInit(SPI2);
    3 F2 {3 C( i1 W' S% ]0 e
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;! N+ W( C: `* ]9 j! ~3 t5 \
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;0 T, l1 x9 b# d$ U! m9 ~/ X
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    ' C2 E! Y, h. Y) n9 Y$ ~$ H
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;9 z8 A7 Q. i1 L2 ]* i) j) A: u- D! }3 W
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;$ X9 t8 c: V' u
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;8 _5 l( J7 c2 p; V% [1 D
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;% g& V  s. A' a2 G# M5 ]
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;0 N: d+ o3 K0 x6 L! R, N
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;& l) j" y% X2 E  O/ I0 D6 K  y
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    * e- S$ G- S) D2 A5 p* d- _, N

  53. % P- d5 J4 `, S1 T: s
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
      Y$ \$ [5 L4 m* I) O
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/- e" _; W  w' z# J1 c
  56.         DMA_DeInit(DMA1_Stream4);/ Q; m0 F! n- k" C( X
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;9 H1 c, @6 [0 j4 c* w
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);6 a+ e& K+ n! d' @8 Y2 x# Z9 h
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];5 A; _  w) l& x/ r
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    3 m  g. _9 U4 P$ u- R/ r, K
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;; A" K  O" m7 E$ ^% L* z4 M( w
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;
    ( f2 F8 s- t, d! U' r2 y
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  z5 H2 M* q! Q) m
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;% J1 H8 O4 u" g$ p6 s" `
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;* d! T. M# w2 k
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;- W) `  A# z* ?8 n6 u
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;  {. K/ D4 E2 O
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
      a$ P7 F, F: N' ~! t2 }, d$ F# B
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    7 Z# p9 P! Y6 e/ c6 L
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    8 h) o* j* _0 b- B
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    0 v$ t; g$ ?2 y2 L( T+ U5 u
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    : r9 U8 M7 B$ y+ g4 Y. w
  73.   
    * W$ C# Y) @5 `. v: q! ~
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    : X; P- X" o: m$ k. ~2 p  h
  75.         DMA_DeInit(DMA1_Stream3);) A! t+ r5 P6 e0 b2 }9 a
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;. h) r  B' v. A! a" ]. O
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);+ a7 ^! o4 u  ?# q  J  m
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    1 F6 o+ w5 M2 ^
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;( Z" W$ ~; [! Q, G: g7 Z% D5 F8 n, @
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;+ |& k; {  E2 w  V+ b; Z3 \# ]6 {
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    6 W2 W9 h+ K+ U" r/ X8 g3 }0 P
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    ) k1 Q8 o0 S  F! I7 N" I
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;' B0 {  s0 ~( l  J/ ?6 \' D
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
      H( K+ }: m) i7 r+ \1 i) `( T
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    & C/ A, A' s( f) Y6 ~
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;! ^+ ]2 g0 s$ J! q3 q( s# p1 I2 [
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;  K" T) |9 x8 x# W& H" Z$ x
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    7 M* b' h* Q" B6 k% S
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;  q- l8 U; [2 E
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;7 e: G1 G/ m& [: ]  }+ o) y
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);- P7 i9 u1 t% \% k" C% ~, f, D
  92.         //Cdfinger_BspCs_HIGH();  V* P& E( p3 \2 Q3 Q0 W: T6 Q4 r
  93.        
    $ o9 ?$ K: C% V4 Y- `; p9 a# B
  94. ( t9 j( Y: I+ d  i1 R0 a$ u3 J

  95. $ x2 I: T: Y% \* f0 m' d- E+ F( ?
  96.         //发送中断
    ; h0 O7 x7 c- e! v; A8 ?( B0 i/ Y% B
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);# @6 h6 ^1 b, I; _) d% y. w. x3 D
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     / a; o9 r: K+ w  b. F% a6 C/ ?
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;# V. L& G6 ^% e
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    * H( c: k% I4 P
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  X! H& x* B+ a6 h6 S
  102.         NVIC_Init(&NVIC_InitStructure);1 ~- W- P2 W4 Q6 ^4 |9 _
  103.        
    / l/ j% r" L: b( E$ K% L# G$ }/ {  x
  104.         //接收中断
    $ T  H6 Z8 d5 e- Q
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);# @# I8 @, K7 y6 c
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    3 \1 |; z! O: k1 C1 ?( ?0 g
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;$ o+ g9 J: t# W& P1 J
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;9 A4 L9 B; c4 d9 u* C
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;) g. V. S1 I0 g+ s
  110.         NVIC_Init(&NVIC_InitStructure);( T* c$ o# Y8 {" B; V
  111.         SPI_TIModeCmd(SPI2,ENABLE);/ B0 ~! Q7 w. o6 {2 i2 a4 j
  112.         SPI_Cmd(SPI2, ENABLE);
    6 g' Z: E- _' |1 M- E
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);8 H3 w! L) V) x9 y7 H& N
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    ( h- G& ]3 }9 D0 l" W6 W

  115. 3 c# I0 w$ l) B8 E  i
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    7 d) A8 i8 d$ C' y9 D* L" q0 I( J0 Q
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    ! u. i, C; v& v" u( h3 J
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);; L  w9 U7 g3 M, F7 t8 V
  119. 0 k+ x3 D. z6 Q" s* L
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    " N* u3 F+ ~, w" g7 a
  121.         {
    # x6 z3 x  @9 l7 H1 i
  122.           if(ii%8==0)
    8 ^6 _1 ~# d! p" C# Z% W
  123.                 {
    4 [) x- v6 k4 h/ X: Y+ W5 x
  124.                                 printf("\r\n");
    0 u, ~  l( X% B
  125.                 }7 x! N; B3 Y$ D* z
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);% b: ?1 l% h8 c( U* x
  127.         }; Y% m* b" F7 X4 s$ D, H1 b
  128.         printf("111\r\n");
    - E; m9 G( `0 n& d0 _0 P( W; o' c
  129. }
    , z7 A( q  t! M% X/ K6 n- K! v3 B$ `
  130. / g+ }$ ]) i7 S  X0 [# J9 e
  131. : j) g0 h5 V5 f/ Y2 M6 _4 B; g. {8 _
  132. void DMA1_Stream4_IRQHandler(void)3 ^2 k* u+ [3 H0 q
  133. {1 Q  _" n$ U# x- J0 u
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    , y' D- T0 n3 w* j- h1 b
  135.   {
    * [  T: q4 P6 F: Y. G$ S+ ^7 Z
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
    % G; K# K8 e8 a5 J+ f
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    2 @! E7 H% l& w0 v7 q0 y' j& z1 q
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
    ; }7 M) }0 a# k
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    1 C7 h5 @5 F5 Y$ e# g0 f
  140.   }- d: Q( e/ c" ]! k
  141. }
    2 C8 }  q  j7 e7 j

  142.   ^8 I# J5 i" z% X5 R
  143. void DMA1_Stream3_IRQHandler(void)
    ! O8 I$ ~; S' \- O) ]4 p
  144. {' X) C. x8 Z5 b$ w3 c& @" ?, A1 U, v
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)8 b' P* o# T- S9 J0 {
  146.   {
    . l$ @% L/ z) V2 y
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    ! E, @! |, M& K& ^
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);+ p! l( @$ Z! {8 v8 b
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    5 q" G* j" s( I# v3 U
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    , z( K! U0 q- z0 r' S) l( B
  151.   }" q) d5 K7 ~/ G# ^8 k6 b5 Y
  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 手机版