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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
7 I1 K3 P" [: f* k/ z4 r4 B4 q" n$ i! V& k4 w

5 U  R$ C# l! N- @社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。$ W% w' W: V! x% {2 Z
7 ~, L8 Q7 Y) ]3 H
提示:点击各主题,进入帖子,可下载ST工程师解答详请
+ n5 o0 i! E- c 2 u# r7 U) X: W

; U% p' H3 L" W; d8 s一、通信接口& [0 J) t3 D. e5 o/ f
, h2 i) B: i* ^, a2 ?
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新; T  ~7 l5 q' O. ?( y* F

/ l9 {% Q' D0 S# w/ g5 r. t& o2. SPI 接口发片选信号导致死机9 C5 d/ y# U5 Y7 C

" h$ J, R2 o; w3 q1 t5 q  [8 \3. USART1不能设定600BPS的波特率$ H4 g# k, [5 J9 V# i
, I4 z6 R3 O) |" x7 J
4. I2C 接口进入 Busy 状态不能退出% i  l  z- N) x
  g* F& u, w! ^+ [$ e
5. 对 Flash操作导致 USARTU接收丢数据7 `( _% c' _9 N. ^
2 R( A1 y/ y7 \8 F. t6 j7 W0 I0 M
6. USB接口易损坏7 i' N7 M/ S; i- z+ G2 `
/ w/ ~8 W4 u; @7 j) L
7. UART发送数据丢失最后一个字节
8 W2 c' X# {0 M5 _4 J1 U : y8 J' \( M1 v
8. 使用 CCM 导致以太网通信失败
3 Z0 u$ M$ b3 j' E/ d$ h4 w6 ~
8 r. H0 `: s/ s2 c7 r  ^& ~9. SPI3 接口没有信号送出
/ Y3 r! B! I$ J3 O! i' H5 C' c5 w * y/ E" {" C9 M) B) j
10. 时钟延展导致 I2C 通信不可靠
; S' X/ p4 J9 Q4 {+ b; Z * x. n9 C- ]1 c" W( q
11. M0的USART波特率自动识别问题& d" t6 A2 ]& Z' q% s

; i& I4 N" T+ M6 S12. WK15 OTG做U盘主机兼容性提高
6 c3 D* G6 }- f2 X6 O+ F0 r: [ 7 G% \0 N8 M( x% G+ T5 o) I0 H
13. 以太网电路设计注意事项
6 T8 }2 R; m" G
6 G5 A% N! h& ~% R; h2 ]+ e14. OUG主机库在BULK传输上对NAK的处理
) F5 B4 N. `3 h1 I; n+ o
$ a! A+ m. ^: @& ], O" v% o2 K, v15. 串口断帧检测
. j9 @+ M) T$ o+ j. \8 m + Q' M  x$ S9 e8 a" _  I' W7 F
16. VCP例程用于数据传输时丢失数据的处理
& s- t, J' F! _6 C* Z
3 [5 Q. \  A( y0 |17. STM8L051F3P6串口UART数据起始位判断的问题
7 [+ {- V% Z6 V& c# Z3 ?+ ~
+ p8 B2 s) t1 F7 o6 b18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号" _' @2 U/ Z; r5 [, W
0 I0 {  a- d2 |9 k. q! \$ W5 W) o* i
19. STM8中UART奇偶校验的使用方法
. y$ W9 |3 X; P! U; [( Z4 x  g . z$ P( y" ]1 m- j  \
20. STM32以太网硬件设计——PHY
) r8 b8 Y! w9 A8 B) Z7 y% u5 h; L0 A) u1 H6 p
21. 一个判断I2C总线通信异常原因的方法5 R, c; W+ Q/ G$ L- U) n  }! S% F; v" }
# t/ I: ^5 ^* x* `0 ]
22. USB device库使用说明! P9 R9 W0 |& Y9 a+ N% o- O( u, F
& W# r- r6 o. \
23. STM32F103上USB的端点资源
. ]; F3 Y; K1 n3 j- U# t: Y7 V: h9 e7 R$ p1 u) h# v
24. 使用CubeMX生成TCPEchoServer程序
  `/ M! E- r7 S5 C8 J
" X4 \: X5 ^/ N25. SPI接收数据移位
! _  N$ Q" Z) G5 ^  O1 T) [
: Z' p) q5 V( d. n. ?' x3 C26. STM32F0中Guard Time的设置
' U$ q! f1 F" y/ F( Z& v
% s; d( ]- `' A( d! {27. LwIP内存配置) d8 z/ j7 r, {- u9 ?

5 S) H& ]7 K' g* I2 V8 ~" G4 q3 x6 S' e28. STM32 USB Device的简易验证方法
) i* @) G, Y. v9 P
7 [% V. G4 @- g29. USART 中断方式接收无响应问题的一种情况及其处理方法
' F! w3 d7 k( l; O/ P1 n( a
2 D) p9 D$ v3 V+ `* I: H1 q( f30. STM32 基于 Nucleo板 CAN总线的建立. }) |' ]& p7 A

& ?) Q; ~9 R) Z2 b2 ]1 H# w31. STM8 CAN总线的IdMask模式的讲解8 |0 X. J$ Z. l+ _  i$ F+ D7 V

9 S8 f- ~3 K, @5 E  M. h. c+ X32. STM32F746ZG USB 驱动不正常 . \& P& F2 Q. Y! r
! }, e1 D; M2 S. A
33. MCU在STOP状态下通过UART唤醒分析
- I+ h6 V: M9 a! t" p, n3 t8 P; I3 z5 R, y1 ?. j
34. 通过STM32CubeMX生成HID双向通讯工程
0 y. X/ e. b& ?! d
- i2 u% H7 b! v2 I; z35. 串口工作在DMA模式下有时接收异常
2 W7 \. F5 S1 Q! f/ L4 s# q
" {3 d0 n3 c# x7 C0 I36. STM32 Bootloader中 DFU使用限制- W3 {/ F- Y/ H( O6 z
; I4 q9 g+ f  l1 }) [0 e
37. UART异常错误分析; Z- `2 E8 ^' G/ K4 p3 w
6 B. H+ R9 i8 H8 P' U
38. 基于Cube库无法检测CAN2的接收中断
; y* e) C6 W$ C" {9 M9 j+ S; ?- c1 i6 S, D* E8 b' ~
39. 基于STM32F7的网络时间同步客户端实现 5 ^8 `0 p; D, J+ [3 P! @  b8 N

7 e! v& U- }5 k" r$ @40. HID与音频冲突问题
9 a# U6 B* d! ]7 u0 b! o. J" g' b9 o5 O& |; D( o7 X5 H9 G
41. 在进行USB CDC类开发时,无法发送64整数倍的数据) {% P, m; G, O' E6 `5 @
6 l5 u+ y5 r  x$ W4 f/ ?% V
42. 从零开始使用CubeMX创建以太网工程
+ I& j9 `  P% h' H
" u4 l2 M9 ?+ q. S: \% ~43. STM32F4xxx的I2C总线挂起异常处理2 d% g; n9 s5 Y& i- M/ E  }

; v- m  T5 L! W9 j1 Q8 m44. LPUART唤醒STOP MODE下的MCU
( ?+ y' d/ d$ e1 H0 _. ~# u1 O- H$ A8 @! ?. j
45. STM32系列 MCU模拟双盘符 U盘的应用
6 H0 D, W+ I4 [1 D: S7 \$ @, q
! e9 k# w3 k. J) h: y- O8 @46. CEC输出的数据和数据长度始终不匹配
3 r* i. t( V/ q! _9 I' z; q
0 V0 z3 G. ?8 n/ r$ r47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析) S5 R, |6 K9 k% [6 w& h1 ?. i

* _, G$ |% D+ \. g; \0 K48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
* s+ y# b0 ?+ S0 e7 |8 Q& R2 \5 N* V3 |. z  ]9 Q6 f
49. 增加UART接口应用时的异常分析
' z7 c) ^/ o2 A. a( X! C
* g/ b7 L+ k1 d2 j' M3 e' V50.UART应用异常案例分析
* w  C+ T& [# X, }, Q1 u3 W
7 j# j$ T6 @* X51. I2C配置顺序引发的异常案例
9 G9 W( t1 W4 Q0 V1 m( o7 W% ^! x/ y1 L
52. STM32 USBD VBUS GPIO5 N: J2 i7 G% j
! \7 ~7 q% {) O
53. USB传输数据时出现卡顿现象% @7 [' g8 g, d1 B' Y) k4 b

5 ~  T+ r9 S) b: ], x/ q$ y54. STM32的高速USB信号质量测试实现
" }# L% Y4 V3 ]  v- i, u' M/ U( j& f
55. 基于STM32 I2S的音频应用开发介绍
( f5 Q3 k# j+ G. n# v. ?* a) S2 S
$ w2 g* X, h( i$ N, E, O4 e9 \9 N; }0 Q56. HID_CDC复合设备在WIN10的识别问题  7 q+ q$ }. J( y- t
* F* h, V% O( t, P. n( p0 e
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  
; w; r# K2 [3 f; I
  O7 E( @7 o, v% w, h! D: L# x% `58. 一个关于LPUART输出异常的问题分享  - p9 V" j! j" x1 X5 e

% s8 S% f% f6 k; \2 x4 j59.通过 DfuSe 工具控制程序跳进 DFU 模式
, F  i/ p0 ?5 h/ w% k

2 `5 ]3 X* R) `: l. B60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)* G4 e! ]  Y( D$ g9 U( `
: f- ^1 s' M# p/ A
61.一个因初始化顺序而导致异常的话题 (2019.12.24)
0 r5 D% Y8 \8 j
6 Z- b0 q! d3 o2 b7 f
62.MC SDK 5.x 中增加位置环 (2020.5.29)
9 r7 R  L0 @7 m6 D& r; ~# D

; \' p! w  v9 G$ ^( ~% N, }63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
% ^) v7 X9 V6 c. D( |* d! q8 {
5 h3 U7 I" _& B7 X! L: Z64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)0 L) t# e0 M$ d& n% R
2 f1 g# c; k8 G8 p3 X6 E
二、电源与复位# q; q- h  J2 E% F* a, d
7 w8 e( |/ v/ g" U
1. Vbat管脚上的怪现象. I4 E5 v0 G% R! c% a  @1 a1 ]
: I3 o( \+ D& X% y) M; v# i
2. 上电缓慢导致复位不良1 V7 v" }) L8 X- E' ~

1 m4 p& a% e# \0 x* Y3. 关闭电源还在运行' G. N0 T# J$ S$ A+ o

) n( P3 w. Q- J/ S: r: k4. 使用STM32 实现锂电充电器
+ x8 ]9 Q! [& W  @6 b$ Z( f
# q+ z6 O( d3 o  r! n3 v( q, V5. STM8L152 IDD电流测量1 [2 u: e  J. I8 K; C# F, K
( m& q0 y! _' A
6. STM8连续复位问题( l! N0 [, c- \1 t. |2 {4 T
% p* L# m& p2 E; Y# U
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
7 {: W; `9 |' T' O$ B: M4 c
( q+ ]8 k% N+ y) T8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流
# x6 }; m. q( G7 O
) P4 U2 J3 u: X) d! ~9. STM32F7与STM32F4的复位序列比较
9 h( j  r! c2 V7 `* D3 Z6 N, Y1 J6 n
10. STM32F107 复位标志问题
0 s4 S6 @( T- O# \8 y
. I0 T# U+ U: v& c3 l# [11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
0 z7 T, b2 G! j- g
0 y  \) s7 h) h1 [2 t$ B% @ 12. Nucleo_L053不上电也能运行
/ H6 b* X2 X0 }1 h5 H! S
% g0 ^. w4 R0 [' W  \- b8 V4 L7 d13. STM32L4中STOP2模式下的漏电流
$ t5 G% \8 l; l6 h9 t4 Z: N) H6 A$ M2 ]
14. 在没有外置晶振时HSE_RDY异常置位
( f1 ^0 K5 C, m
5 n; s! R6 r, P4 B$ H15. FLASH被异常改写   (2018.5更新)
4 d7 \0 A; R9 ?3 N+ q7 l8 O* i8 U5 y) I7 a1 f, O- q4 W# t
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
* F- X) E8 V4 p' \# w" }" J/ g' X) g& t) s- a# }
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)8 c8 L9 E# \- I" O) K- _& _7 A
6 S* a2 O6 t/ q$ k) G9 Z3 c
三、IAP和Bootloader
: S# S& B& \) L3 ~4 B) `* \+ n 9 f6 n6 G. s4 @8 ]! N
1. Boot Loader与上位机通信不稳定8 w. {8 z+ f5 a

! c$ G( e! U6 E7 l5 {! D' }1 d2. IAP+APP 模式下不能启动 RTOS! L4 M2 Z" T- o
; j3 _. R7 S, h3 L
3. 从 IAP Loader 向 App 跳转不可靠; P- G# `: A% o* ~0 H
& [& `* O" f* p8 ]& c6 V6 a! i7 A
4. STM32 MCU IAP例程跳转到APP代码简要分析" o8 V7 I( U# D  e, T
; e4 i( i. j$ |: J2 Q; A
5. STM32F091从自举程序向应用程序跳转的问题与解决0 N) }4 r9 Y' t+ D) s

9 _) L2 |7 L' j* V; k6. STM32F09x不使用BOOT脚实现System Bootloader升级代码! q4 a9 Q, V. K7 T+ N7 b8 P
! t3 D, B* b  g/ ?( }) G' q
7. STM32F0启动模式相关问题探讨7 C3 y4 |$ p2 o/ ^! Z5 P
  m( G& a" Q3 {% F
8.STM32F091空片使用System Bootloader下载代码
, o" M1 E9 X% G. }  K9 c+ `) e  E4 V
( p- C" r5 H; O5 J9.STM8L  IAP 应用程序中编程指导6 e) u8 M6 j( W" [/ p# k# Z: `

# ^( M5 z4 G7 k8 U1 F$ W10. 如何通过STM32的串口实现简易脱机编程器
/ j( W: P8 @- b* i# V
- Y2 m, z. H. Z0 @" V11. 一种从用户代码调用系统存储器中Bootloader 的方法  0 v) f# [0 ]# l+ |0 G5 n3 _+ \
/ X2 g1 D/ X9 c/ w( @
12. 利用 USB DFU实现 IAP功能
( T. X9 @6 U1 b
( a* ?1 W, K6 J3 ]! @13. STM32 Bootloader中 DFU使用限制
& f3 Z  {8 Q5 @; `. @$ z3 `
+ `5 E' u1 n( M7 y/ K- P' U/ q14. STM32L011x和STM32L021x启动模式注意事项
+ I, F0 a5 g+ r1 @  Z! L3 ?
3 G. h5 u. R8 {  m7 q15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
8 P0 J. @/ v# S/ A  N5 M: B  p) ~" q/ [; j6 @8 {$ _+ z
16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级 1 D* w# h3 U6 B8 R; D5 {, X7 u

; ]8 h5 o! U) |0 D6 ?0 c( S  o17. 如何使用STM32NUCLEO 板来测试串口Bootloader& D  M, I: D3 Z3 g# U; B' F3 X2 f
7 E5 t' {- r0 x
18. 在STM32L011上通过I2C接口实现IAP2 Y8 e9 `7 J8 J& Z8 j

" o0 o* N+ p: _" B7 B8 ~6 n19. 在IAR中实现通过将程序在SRAM中调试的方法
" ~3 P8 q* v" }
( S+ [' X8 Y2 ]20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题- C* w6 f  O) I. c/ ~7 G& O% t

7 `$ f/ y% s. m5 {" y2 c21. USB DFU IAP 例程移植的两个话题
) y! ]: a* h7 h/ e: C7 {: c4 q# s4 ?! p" x. l# a$ a
22. STM32F769双bank启动, @' V0 m+ P" p. h+ S

* j2 y5 f* u3 G/ W! C: F23. DFU加载 工具 DfuSeCommand的使用0 \" _+ l5 y) E5 U! D# n
8 r& ^. ^! N) e$ c: j
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
5 F+ ^! [8 E7 T! i; i. s% }# \4 ^, S8 M; p6 Y1 K& _7 Y' S9 w
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新), W2 {% n1 G, g& [/ P

7 Q# Q3 i# }; J( L26.STM32 Bootloader异常复位案例(2019.4)' B( V/ d: z$ J" l0 s4 D! s

4 F- V/ A/ g* [* {4 K( h" j
四、存储器
: Z3 y# }2 L. ?9 L+ r9 S
1 A6 n2 b$ k, `+ f! m' }4 k1. 对 Flash操作导致 USARTU接收丢数据
( Z) R+ F, W- o* C- X5 f% h
1 E( k5 H. }4 }6 m7 i! Z% W* ^2. 使用外部 SRAM 导致死机
$ j% j: ^/ Z' j5 ^6 d. |0 P" u& z # O/ g3 K& [8 q/ |0 y/ o8 N" n
3. SRAM 中的数据丢失
' ^* B+ m  `/ W" l3 w' T  \ , c+ E# ?4 D" C; c
4. 干扰环境下 Flash 数据丢失# b% C; |  O: u  p
& j. @. d- l3 N
5. 使用 CCM 导致以太网通信失败
8 Z9 j/ i$ d" j" D; I' A" ^; `* f( I
) t, D+ ]0 z% f; L. x6. STM32F429使用外扩SDRAM运行程序的方法
5 U! i" l0 N5 r
2 a4 a4 ~. x+ T, B7. 使用STVP实现对STM32L1系列EEPROM预置数据% Y9 X4 f/ u( `2 C' [7 l: {* @! `
7 K, ~  z' k6 V, q$ y
8. FreeRTOS RAM使用情况及优化方法
2 c& O, R7 A) T% T
/ w) X% @7 l3 Y7 G! j9 k' \9. 在IAR 6.5下如何将数据存放至flash中
5 J2 K' N$ U- A& u' }# O" ~4 F7 V0 {& Y/ b5 u' n: K* a/ q' e0 A
10. IAR下如何让程序在RAM中运行
( O! T+ J9 Q' k; y. d1 T3 q% P! J % D& S( k* L5 v# r$ @
11. RAM上电后初始值问题
( @) p: e2 Q* \" Z9 I" H3 g2 h
2 N: l! G6 L! F- P( {5 l3 W! t12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计- m. k6 V! n. |2 `0 ]3 z- J
, @; I5 u3 Z9 d+ Z5 c
13. LwIP内存配置
1 b) V2 B% E; N
+ p( ^: F2 r6 I, `14. STM32F2高低温死机问题
5 ]# Z8 l& Q6 ?, ]5 A+ i" l  Z
/ t7 |; D5 p5 k0 j6 L15. 使用STM32F427的CCM RAM时遇到的问题( q! Q5 {; b, d7 i5 A6 z. R
$ o0 Y8 j/ x7 x" e
16. 利用QuadSPI外扩串行NOR Flash的实现  
7 P2 n; S! [6 c  X  T  f5 v3 y0 C& ]9 u
17. STM32擦除内部FLASH时间过长导致IWDG复位     
% B0 q7 D7 _! A6 G4 g* k
& I+ {: n4 G7 I3 l* T
3 x, X; e1 H4 {
18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
3 m' x6 p/ S! C( l# X* |5 D2 l% s
+ y( J' q" z' i5 r& r五、模拟外设2 Q5 U9 G. s0 C6 P$ i

9 M" C4 M1 T% ]1 C& @) n1. ADC对小信号的转换结果为零
6 o, ~* ]  f3 a% Y
/ y) f' G' Y( z$ i( x. x6 K% R2. ADC键盘读不准
; q2 I7 ^8 R% w* x6 c+ [
! o! e8 F5 T1 P2 K3. 扫描模式下 ADC 发生通道间串扰
( }! m- n8 i$ P6 a( V' P: p& v
) f* n( E8 H. I& Z) T6 v6 x4. DAC无法输出0V的问题分析解决8 C* p# w0 K' V

) B) g1 s' c" h! F$ A9 A' O1 O5. DAC无法输出满量程电压的分析解决& n1 u# J- \$ }/ {0 `  E$ J

4 q9 ]! l, |! H6. STM32F30x 的ADC 采样的傅立叶变换: K& l$ j8 z! \0 K. P
$ j3 r. t: Q3 h$ _& a/ R8 Z
7. STM32 F1系列 DAC的示例详解
2 `  ?* D: k7 H! K5 L* I! j
6 k. E. {; F9 n0 e" H8. ADC 连续模式采样浮空引脚问题& r# W9 E( e3 r  H- u

5 ]& [. K, l7 ^; ]+ m9. PWM硬件间隔触发ADC
" ?2 X$ h9 [6 e& }! W5 I
( B3 `1 I1 }, y( @10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC3 n3 O& H/ z% j# Y& o+ }

  _' d, G, z' E6 f, _) T11. STM32L4 系列中ADC 通道配置上的区别& `0 e. \+ L1 _& v4 a

2 `+ U' n3 ~6 l' y4 k; p& q$ v7 b12. STM32 ADC模拟看门狗及其应用
( ?" w( Y& q; n5 m1 Z* W0 w. A! @8 K  y( e3 x& c# Q. c' b; {+ C8 i
13. STM32L053 comp2 比较电压无效问题 # r2 s- o) i% K; A; ?. ~* H- a$ }
' N  B# l* [* ^, o) P
14. 运算放大器OPAMP在STM32L4上的应用( N* G% W3 X2 P# g0 D+ I
* F2 N: S1 N0 f- d$ _
15. STM32 OTA例程之ESP8266使用
. \9 v' X. J0 q- ^' w: }  [$ x
6 g$ w$ g# y* j16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)4 F: F7 S4 Z. |0 r
; n2 o7 M- o) G4 e5 A
六、计数外设/ G" I" g/ j. z( y

% s. p& j, @$ D1. Watch Dog 失效# e) @3 K8 E. u" L3 V) u) }; D

% s% ~' X9 y& H. c4 _2. RTC计秒不均匀
: _8 s1 |1 E0 r& S2 l- A ! d! m3 \' Q* [" I' q- e) f- N, S
3. 软件启动模式导致 IWatchDog 失效! i" q; }% y6 b8 c& t6 z% U' H: p

' K4 P1 N$ h( u7 k1 ?' N- P+ V! z% W4. STM32F030R8 定时器移植问题
4 \8 O7 w! a1 p$ c8 a
* @$ B" n* t& T  M, {( Z5. STM32F0使用RTC Tamper的几个注意事项
7 T3 l5 u" R: A& Z8 T* S8 ~$ z6 @/ L9 Q+ q' C. ^$ r) }
6. STM32L053可控PWM脉冲方法之DMA2 _2 G! G) f- _+ Z/ m9 ]  K) I
( K/ V# [( u+ O) S2 Q$ s
7. CounterMode,OCMode与OCPolarity关系: q3 o, ?( P+ e

- b! [- D8 \. g8 i8. STM32L053可控PWM脉冲方法之DMA7 O. K( c& \; i* L% B+ x) I2 ^4 T

5 I: E/ x  P% y- P" p9. STM32F1通用定时器示例详解—TimeBase
0 O$ i8 |. N: d9 f1 f+ k% Z* t* }4 ?! n: O
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals8 v1 m* [5 P" `& V: g  z* y) C
' }/ R* o- X5 q' c1 F
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生* O$ p# L  W1 k4 I. ?7 n' C' U" j

7 J" G  w: c0 w1 H  `5 T! Y12. HRTIMER的多种Fault事件联动机制( G; c  W) C9 \1 g' K0 I) D% N
6 a. _8 H, [; F( s
13. STM32通用定时器 示例详解 —One Pulse; x" x2 y4 V2 F1 y: C1 b
; M: _" n4 }5 {% e' R. ^, D# E
14. 如何用LSE校准STM32F4内部RC振荡器
5 T/ A3 H& m( H* q! a, _6 S
3 g/ C# U8 Z$ ^: Y0 F% M15. 一种使用Timer测试HSI实际值的方法: {) j& n4 b5 P
0 ], }- b0 {# y( m, T% V' k$ `; |
16. FreeRTOS定时器精度研究+ U; L4 z0 H' A" |5 U- y6 ~& `
: Q* Z& b0 L: i& n8 O; h
17. HRTIMER产生多相相移信号' `: |( c3 ~& Q4 I
9 j0 L+ s% m" x' `  D( X0 h
18. 窗口看门狗启动时异常复位问题# ?& e" F2 Z! V) T8 ^7 Z

; T5 Z4 m4 O: d19. PWM硬件间隔触发ADC  C( U* S& s5 E7 y- I/ s

2 H( x7 a. I: N: F20. STM32F030低温下RTC不工作
4 D. N' j: p0 ]1 M
9 m" u, D+ ^+ D1 |21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   / p; x5 N" f! V" g& u, w+ F: ]
9 e+ x, ?( a! F
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
! z8 w2 H7 L# R* i3 W' _) e% x4 \7 S4 [5 s; t- K
23. 基于STM32定时器实现定制波形的示例 (2019·7·25) $ P6 D# R+ ?6 |( m9 n0 e. m
3 @8 Y. c, d  M
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
3 B0 s& m0 K$ F* W* T! K* f

0 l* Q' k& i' u' @6 n6 [0 p9 W. c3 G25.MC SDK 5.x 中增加位置环 (2020.3.31)
2 p, S4 S. M" S
  w# |* |) i* x
26.STM32高精度定时器PWM输出话题 (2020.4.29)
- j4 C) {/ ]/ X. c7 d; a9 x3 g7 `: D4 u1 V* ~  Z! Y& s; y

  L# G& U; e' b/ W3 B2 S27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)* A: B$ ]6 A* q7 m: a3 g4 [

) ?7 N5 o- H/ s七、内核3 E7 _& g: H' Y9 U, K; J8 E1 \

# n: O8 o* F3 n8 w1. 使用指针函数产生Hard Faul
) d! f% ]& v! o. X/ N7 n- R
* R: S9 l/ G- B4 x" F* w2. 调试器不能通过JTAG连接器件' m9 }4 d, Z. C+ M8 d
, V/ Z. l& W4 d0 ]( X/ e
3. 鬼魅一样的Hard Fault( D$ z! c/ y7 s* T4 \
! ^- N6 V' @, D4 j  R8 C9 J7 v
4. 进入了已屏蔽的中断[! [8 Q9 I+ U! B' p- [+ H! E

; @) S" Q5 v& H' h2 L5. 浮点 DSP 运算效率不高
5 r- t* ~% t5 E# e- W2 X# m+ U6 O9 J
6. STM32上RTOS的中断管理
$ g2 A  u0 G0 k7 W# S
* c( \: U( F7 o% G" z% I7. STM32F7与STM32F4的复位序列比较
& O: Z8 G8 Q. I" g% M  w9 g; ~; t, x- y- ^6 P: ~: Z2 J9 |
8. STM32F30x 的ADC 采样的傅立叶变换
( [7 f$ f8 e' c. V( M6 K% G; G( r1 E- r) f6 }
9. EXTI重复配置两次导致误触发中断的问题
& x9 {, H  ?1 v3 d6 k+ A  ^
' Y8 {7 _: Q4 W10. STM32F3xx/STM32F4xx使用浮点开方指令
) s$ f, t: ]# x5 D5 d- {' `* O2 B' \* f7 l/ `# t
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响+ Z* ]/ o6 Z; }3 A8 E5 v- ~5 @9 Z
/ C9 u7 N6 x" a
12. STM32F7 MPU Cache浅析  
5 C* z9 k  K( d$ |9 N+ }# Z
/ y5 b4 Z! ^  l" c13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)6 \& B# B3 B# U0 Z; F7 x: R

9 h' v5 B' x0 p14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)9 w3 T! H! r3 T+ M

/ t+ K. l' @: H# r. }; b* F
- f: O  w  [1 [4 s' P八、系统外设
8 X" L9 M  c: @( R6 o0 n! H
: X4 L. L/ `0 X: f1. PCB 漏电引起 LSE 停振" T1 `+ H  R1 {. ^
" j( M! ]4 M4 {& U
2. 时钟失效后CPU还会正常运行
! e# j1 \. I6 c( Q ! p  u) u/ n8 s; T% K
3. STM32F2中DMA的FIFO模式
( W# U- w' F2 i) A# U3 q- E
' O2 }# k2 g7 t& L4. STM32L053的GPIO翻转速度的测试+ k/ b% ^: \: R: Q
) o& Q9 M7 e. N5 |3 D. {' J' \, Y- {4 O
5. STM32F4xx PCROP应用$ `- n2 w) H7 j  l1 w
0 I; r% @0 |/ S1 Q; o& g
6. STM32L053的GPIO翻转速度的测试
: V4 Q) N7 C% h4 z% J8 v. ~( Z. m9 h; w
% N6 `' J# P, T7. 如何在IAR中配置CRC参数5 G/ b  {& B0 t) Z9 X) W  Z+ E: [  v/ H
% i& A% s2 J5 V" V& [
8. PCROP区域函数无法被调用的问题与解决& Y# `; C% E3 I5 g

7 G& k! v5 r. O& H4 I4 ]7 x- _; x9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题# ?5 G( u, V$ U, |, W

# p6 l2 R: V2 k) ]. f( L, C/ X: k- |10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计9 k: y1 {; |7 b4 j2 J' w
* ^& p/ E- Q# T) O- U$ |
11. 如何用LSE校准STM32F4内部RC振荡器
/ d4 {! W6 O6 D6 z/ y- W( P: A4 V+ s7 G9 @. j9 D* @+ X
12. EXTI重复配置两次导致误触发中断的问题  % d1 m" E& A* M

- r9 U7 b6 f, H; s0 T" n+ O9 ^13. 时钟安全系统的应用(LES篇)  
; A6 }2 ~- P* }( @$ M. O0 C
% \, C3 ?; @3 k2 ]) ~8 e
14. 利用DFSDM开发PDM麦克风应用介绍  
) w0 v% f, h1 {4 x

3 [- K: {; o  _) F$ g15. STM32H7的FMC外设在DCACHE使能时运行不正常 . [# Y: ^+ T  E6 R

1 \- j6 c, y: T& c16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)% b* d" {7 R: {( d+ x# r5 Z. ?

  }" `" E# M" w* V) C# w- I) v
# C3 v& A7 ^5 s/ o2 h- \% z4 y' K九、标签和收发器; L+ x- u* d0 o7 y0 t/ V2 ]

& g1 \$ x) H$ `8 _- K1. CR95HF的初始化步骤
$ O+ P$ }2 T* a2 A0 y, b( O
; b$ b1 ]% X0 n8 B- Q/ B+ t$ [# Q/ x# d$ r& E4 v6 H
% C2 T. u3 m1 W' [# F. h* A
十、生态系统
7 c0 V9 s. `! C 7 u$ i! i' K2 C2 p1 k
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题. X. d& e7 C. z3 F  _0 A
% O  M* p+ y4 b5 K* w
2. MDK Logic Analyzer 功能在STM32中的实现问题
7 q! c0 A- w+ D& u/ X) B' x# t
2 [# k5 p5 N$ N3 I4 i  J& ~3. 在IAR6.5下如何将数据存放至flast中
6 f* n5 q% U/ P- o* u* m & V! n1 \+ @+ [& B5 d7 ~
4. FatSL移植笔记
8 i' m7 {* b% O  L  z4 t8 m ) t0 H7 ~# I$ Q4 Q
5. Keil中使用STM32F4xx硬件浮点单元9 r' _. l# y# D/ T

" }1 v! @$ [# o: L9 h: e# }" V6. 如何生成库文件(MDK和IAR)# d7 a* e+ d% ?9 C; [

  J0 Z/ a6 ~2 @3 }+ v7. Nand Flash文件系统解决方案* d  r+ L6 E  i7 r+ d
* {2 S2 G% _, }" A( U. g
8. STVD在调试时弹出“Cannot access configuration database”的解决
3 g# r" K! R( |: i
8 V3 v* k6 F" m% g6 p9. RTOS低功耗特性的设计原理和实现
. e3 Y& C# a- n6 N0 b" t2 p
! F, I- B7 K: \10. IAR下使用J-Trace进行指令跟踪1 Y5 O0 c/ ]& k; O: m
2 p1 `: Y( T- V6 A1 h
11. STM32上RTOS的中断管理$ K' K# b- H; a: K
/ C- K' @  T. q6 @: A( z
12. IAR下如何让程序在RAM中运行+ A$ @. w" c) P# F" c/ I$ M* D  s+ I
5 h  r9 a1 g& B# L. x
13. 如何在IAR中配置CRC参数. X/ S2 n- ?* ?8 A0 r8 z9 R
4 o. ?6 v) M( k, Z1 B
14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册5 q. D' ~7 U: E
/ G& ?& v5 j- |, M: N/ H
15. 使用mbed进行STM32开发及STM32F0的时钟问题; ~- q' `) Z9 P, I5 M  S$ K
/ S7 D5 f3 p1 g& F& n
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能/ X  P+ k5 \2 B1 i) c4 W
+ w5 D. a4 f- `" o3 v8 o8 q" s! s
17. 多任务系统中的不可重函数使用注意事项5 v; `( s! O0 I2 Q1 q
" G* ^$ M# N' K) Q9 B* ~5 h
18. STM32 utility的hot plug功能
2 z2 n/ @4 T+ R! A! S; d) D
, @- W7 j# t6 T; f% \8 g; C19. 如何将CoreMark程序移植到STM32上
$ [3 W$ g* i) g% C& K
6 o1 k  G- g& X! U9 D$ M2 r# [) [/ y: m20. FreeRTOS定时器精度研究
1 N2 B" o: R: S/ Q& \1 v! N
- f0 _. T7 T7 d' U$ `$ V- |21. 如何使用Eclipse和GCC搭建STM32环境9 k5 I1 j( G5 Y6 N+ g$ b

$ h3 S7 V! K) x6 h, o8 e8 p. e, S22. 如何建立一个基于GIT的STM32库
1 B' ~3 E$ p2 ]$ C% D+ H  A  @& U( H- S$ f
23. 从零开始使用CubeMX创建以太网工程9 R& D# J6 x3 i) y8 B; k% Q( }3 P

; k# w$ B5 N' g4 p24.从STM32Cube库向标准外设库移植FatFs文件系统6 z3 @+ R$ [; X" O
# d: n7 y' V8 {( h0 m  D9 Y' j
25. 基于 STemWin的屏幕旋转& O) k+ k# |$ `6 Q0 [

! y8 l3 T! ^- @* X26. 编译软件 Hex文件烧写 # c* k3 |% u/ ]: J

/ n. T! e, t6 P- R! F5 s) Z' K6 t27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 , k' U  \- I  O# ^( K

3 ~# E8 ~) H- V6 K2 P28. USB CDC类入门培训& N+ I6 y6 L2 E  u& h

. o8 R1 ~1 k+ T: F; S; \29. USB DFU培训
& M6 _: |+ Z! |* z$ c2 k' X$ G; G4 p5 R. t- y
30. 用于量产烧录的拼接Bin文件操作3 v5 Q" W1 F0 K% L
* G+ y1 P- p$ Q6 O4 j; _8 N
31. STM32免费开发环境该用谁% ]* p* `: L8 E& X' c! {* J) Y6 B

. G0 Z) Y( k/ K5 {2 `1 u. w32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
; |* u& b7 u% x2 k- j' }& ]9 s6 l1 j& K. a
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)/ n% P$ X$ N8 o0 ^

( m3 Q1 K+ R$ _( u) j5 t34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  & j  J6 s1 P2 f6 S. e

9 T1 d( Q- Q& E35. STM32 FOTA 例程之 cJSON使用   . O' C! E' l+ E
) f& a" m& R/ s% d8 q9 b
36. STM32F769DK 云端固件升级例程使用说明
8 A% l0 ]! |; X/ Q8 x
: s/ x2 _# N+ i9 q1 t
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 ) p5 P  L$ C- G8 D, q8 C( A0 Z% j
- g( X- V) g- @- R+ [8 V) u! D- `
38. 基于 STM32 的阿里云物联网平台方案
7 Z: b$ ]! c9 R& C; x/ R5 i- O2 {% W. t
39.AliOS 任务上下文切换原理分析  
; A3 L9 W5 p( \* ?/ _! T0 x. F  T; W" T7 I: g2 f
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  
( ~; F$ M$ a5 F! X1 F1 x, J+ D& C8 n+ O- x' ~
41. STM32F769DK 云端固件升级例程软件开发文档  
; \) \7 i' c( ^; G3 E; `5 G

* Y0 q7 O9 T# K" \( {! ^$ ^* N42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
- d* a0 ?1 E. `) @* X
* X9 T% t3 m! b9 q1 s43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
6 m, @9 X) e5 I( b6 X- G% c, B! H3 X5 y1 h8 U; f% v
44.零基础快速入手STM32MP1 (2019.9.19)
+ F6 W6 L5 V$ S( i6 t% Z1 S- {
/ j0 c5 {- e  [" G1 f& Z45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
. s% O- l/ L2 H1 I* Z- y
+ Q& ^4 h3 s6 I8 Y- ]. [十一、调试) N& z3 _, @" x! ~, d* \

. Y$ N' K: B3 Y8 I0 f& y1. 关于STM8S SWIM Error[30006]的分析
" K3 g3 F! k  t( F8 }$ ` ) _; Y" |3 c0 S. E2 ^1 P* V) _
2. STVD在调试时弹出“Cannot access configuration database”的解决
/ b; t: R+ m3 p3 L# j2 T; L ( u1 H2 H; }, {7 q( k# p. e8 W
3. IAR下使用J-Trace进行指令跟踪
3 U8 u* w' v5 r8 W, s 3 F, c) }5 P. ?& d
4. 菊花链 JTAG STM32. f! C& S' ]; D$ d. y- E
; U8 g" Y4 s  m0 ?* M9 ]  x+ I) `
5. STM32F411CEUx 能下载程序但不能执行
5 F7 M8 ^" ?; I: S- u* g) r/ M/ R( V% u) w
6. STM32F103C8T6 程序上电跑飞
2 U& W, V- e; m& y& [0 d
7 e8 ^% Q* h2 r1 e: m% t7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
  l( p+ l# K/ ~; b; a1 [% u. q* f  ?, R: T' I( }' K+ e
8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
* k  X" \! ?8 y5 y8 u
: a# [/ B6 a! s5 o3 x4 k. x8 i1 p9. SWIM协议的GPIO口模拟! `3 O% ?5 a3 q7 Q9 I" F) i& ]  ~
7 g5 m. g6 M( x$ p( G: H1 U
10. STM32F091空片使用ST-LINK烧写后复位不能运行用9 w' J" G% k0 i3 f

/ h8 ^: S. Y  g& L11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)) p: G6 a' \4 ]7 n7 |1 h9 d6 F3 Q& y
; X6 }  |7 u5 J1 N7 X0 D4 ^- e- F
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24), ~8 Z% p' Q9 {4 v1 X  Q5 t
$ Q0 ]' b* C8 d5 {
13. X_Cube_ClassB代码移植 (2019.12.24)2 l- y+ e0 Y  b6 Y5 h: O, y

* [, C. f# e5 p5 S
  j$ M* i5 B* a7 n' |
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)
0 L3 B; C/ l- `* u, Q( w2 i8 h0 }/ ]! o7 D; @3 }0 s
十二、人机调试1 x4 N! q8 j/ F8 t' E

, p' \, V: J; k( K+ N5 [1. 一步步使用STemWin在STM32上开发一个简单的应用# \( ~5 r7 b5 m( L

/ {' O& d3 h' F2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计4 [. J, w( W8 L& {6 X" {

' _1 _. |: P0 f3. GUI方案中ALPHA通道处理介绍
7 @+ H6 \* l& R! T, i0 e& g: g0 _# z( y- }
4. 基于FMC8080接口8位LCD的STemWin的移植" M+ x; D$ |# K# }- R, ?5 \
  [$ T7 y# Z( X; o+ z6 d
5. TouchGFX中Callback模板实现原理 (2019·9·12更新)' O) h( c, @( }! F( L

: m* n. c" P4 H: x$ j6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)
/ u7 |8 p; R. C* L! D
$ Z$ E. z, K/ k7 P3 {7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)+ ^5 n  O4 Q' C- D; S

) @: R8 @7 j. _8 u7 `' x" w8、STM32L5中如何关闭trustzone (2020.5.12)+ S$ A1 @9 B+ F9 q. E& j
. `  r7 V* q; _+ L* O
十三、马达
8 t9 G% U9 s# c- m- F$ w9 N/ M0 v, B+ f* Y1 Y0 p) U0 ?; D2 c
1. 电机控制同步电角度测试说明  P- l/ J+ j+ i0 q
2 u5 L" @" [( u* \
6 I/ o! f& D' i! L' U3 h) M

& q5 M$ B4 m* g+ e3 n- B3 c十四、安全
. }1 ^0 J( _: o9 J
, q' W0 T9 P  x) }* B7 H
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)% e/ ]3 |+ |' f! h( N- Z0 d' S
2 J+ x- [& |" k+ Z$ X
4 A3 ?- R4 C% q9 N4 v
十五、其他
' l6 W2 _' w- ~

: I# y& D: v" r# k3 R6 _% G1 V1. 跳不出的 while 循环. d! I$ y5 s" e# B1 ^9 s" h
, w3 s. ~0 o5 c0 M& r- ^+ A2 m
2. 外部IC连接NRST导致MCU内部复位信号失效的问题
/ u! r" g4 b! s9 }: R
! v9 t  ~* P* I4 ~# W% h3. 潮湿环境下不工作
* p- r& K7 @- {3 F% b
! l1 u4 J1 ?# a) V+ C4 Z4 M/ D' A4. PCB 漏电引起 LSE 停振% I6 l7 ^7 R- I4 G* A) K! [/ I

8 W6 z  N; ^8 Y+ q/ `% W# a5. STM8L152 IDD电流测量' ?9 @4 g) {6 H1 |
( H$ X2 m3 {8 ~8 }" V7 I7 h! {
6. 使用STM32实现锂电池充电器5 D: H7 J2 [- v
* ?/ L( T8 l& y- U; e9 ?
7. STM32_STM8硬件平台基本检查
. U4 z% n  l; M$ f) A- _5 T0 t: w/ E3 u% P4 X" H5 }) D4 I
8. 验证STM32F401在STOP模式下的电流/ m8 p2 x! ]% j6 x+ R' R

$ `. b! `' o' N2 b( ~5 w# A9. P-NUCLEO-IHM001 电机开发板串口调试指南' ^! f0 x! x! ~5 ^7 J
8 @! w' r: R  `9 j
10. 一种计算CPU使用率的方法及其实现原理
; Q1 R; W$ N3 J/ I0 \" I
# S& }2 ^1 B( r, `0 I! Q) S8 j11. STM32 RTC不更新原因分析7 T' r, t/ k2 K# q7 t

1 J: D* j8 x% _' C6 {12. 关于ST库函数的代码性能对比
% e9 }) K. r* Y/ F& w. ?8 c0 C8 m* B# Z4 R
13. 在IAR中实现通过将程序在SRAM中调试的方法
$ g5 Q* |: t1 S2 G. [" r
; e2 V3 @( ]. M14. M95xxx EEPROM写保护配置1 I  [& U- O% D

; ~) B$ a9 u3 \6 T" n% z15. 4SRxx的GPO的属性  e* y) G& A) U! u4 Y8 H! k
# t2 u/ [- ^7 l6 z- e+ X6 }& a& `
16. CR95HF的初始化步骤
3 D% W8 c) _5 e0 h5 F' D% u8 Q8 ^/ }" u6 U' b' {9 r
17. 电机控制同步电角度测试说明  
5 A+ q( j* \5 a3 P1 D3 f. s3 Z1 P0 L
18. STM32+BLE通过 Notification与 Android应用程序通信的例程
, [8 ^% \2 }6 h
- k4 J- x' q4 h0 t/ p4 p. _" V' c( C19. M95xxx EEPROM介绍
8 P5 |1 h0 `4 a# l! z% r; k! r, [6 G' s
20. STM32 DFSDM测量温度应用
6 z' r$ Y0 h* U# e" d9 l, ~7 w; T
21.代码实现PCROP清除
0 f$ t5 ^( c* i6 `8 I8 P5 M3 \
22. 理解与应用MPU的特权与用户模式
- Q) b3 }( F3 C8 r1 \0 P' i1 }8 s/ K6 B+ D; L2 T5 L! j2 v
23. 用于电机控制单电阻采样PWM变形信号产生9 A! W: U1 u8 P# z

4 R" X4 ^/ v+ h8 Z: M24. STM32L低功耗模式唤醒时间测量
5 @. W( Q( c$ m% b5 C
) Y& H8 J5 D0 [, \' S25. X_CUBE_SPN7程序电机启动抖动问题
. F7 _+ T! z( y! A+ ~: `5 v7 F. E: B- S5 L! \
26. 发现STM32防火墙的安全配置
  E6 q2 d+ O8 _, y( T" y( [5 k# y1 J* {& b5 H% z
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改9 f" H- c! `0 N/ P1 D8 _

( s) F3 m; a- P" P+ e28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)$ B6 w4 L+ G% p. A/ T1 G# P2 o% T
1 A& Y. O8 A* V# P
温馨提示:

) N0 U8 r" }7 q2 M$ ?: c
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。

" r# W: w5 h" P. U+ w
* B/ Z1 n! ^' C5 R
6 X  b& [6 B! Z/ b# e
3 q$ s% q! |/ Y: u; n2 r5 i& k8 |$ O+ J# k  |* E$ G5 f' Z, ~

1 d1 i7 @  e6 v5 r
, J6 ], e/ k( a) W
  J' E- `1 F$ y+ \$ k6 K2 W0 L
6 g+ q, a6 v% b. @% N6 ~' P1 W3 B3 @+ T- }$ V2 j1 i
+ b8 Z* r* n. o2 B

评分

参与人数 6 ST金币 +6 收起 理由
t525 + 1 很给力!
dsctsam + 1 很给力! 赞一个!
北极熊 + 1 赞一个!
wangziwei111 + 1
tian0yan + 1 很给力!
电子星辰 + 1 很给力!

查看全部评分

11 收藏 157 评论278 发布时间:2014-1-23 14:58

举报

278个回答
michaeldeng 回答时间:2016-7-26 19:35:55
非常好的帖子,THANKS!
Paderboy 回答时间:2015-5-18 07:01:19
好详细,多谢分享
% v  W1 T/ X* r4 Y9 \9 Z' J
5768340 回答时间:2018-1-13 14:42:54
HI  . ^# m  d; }; [
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
* k+ ^" C7 L/ B$ A: a6 W   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    0 q. N4 C; I8 w" s" P
  2. 函数名称:Cdfinger_Bspspi_init
    8 d* o: \2 R/ W) v. q
  3. 函数作用:spi初始化函数8 Z3 R$ |: k: d7 d9 @9 X- F6 F5 T: A
  4. 备注:! E/ W7 T; `2 ~' ~# {
  5. ******************************************/: Z4 T0 D$ b2 C  `* O7 r, q
  6. void Cdfinger_Bspspi_init(void)5 {; ^" u% [+ V  A, u1 d7 P8 n9 e
  7. {
    " p- }) ^& X; z2 u
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    & Z- {) D8 P  [6 w# w
  9.         SPI_InitTypeDef  SPI_InitStructure;% {3 p8 V. ]' b6 Z( d7 [/ v. ]4 H7 L$ z
  10.         DMA_InitTypeDef  DMA_InitStructure;
    ; ^- q7 I, u6 {4 e  V8 X: q: m
  11.         NVIC_InitTypeDef NVIC_InitStructure;* J5 |3 x/ X9 d/ m
  12.   
    5 x/ V) r% P2 Q8 J- i+ S1 t
  13.         int ii =0;$ h, m( R2 a. S7 F
  14.         * x% z  t$ b2 ?
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    0 ~- c5 r+ D( z
  16.         /*!< Enable SPI2 clocks */
    ! l  d4 R7 {/ U3 t4 e% S8 I2 F
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    ! f7 T) f* z: `  ]$ g! w5 O0 l; L& J
  18.         /*!< Enable GPIO clocks */
    1 o4 U. E3 l4 t+ }( w' J; |5 f
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    4 N: R9 y$ ^8 _' ?  a
  20.         /*!< Connect SPI pins to AF5 */
    9 T0 I+ D$ I6 C: b& E) [
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    " y' w8 k7 ^; z1 B6 T5 r) z' l
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);' l8 H) M6 E. C9 ^* {1 V/ r: @/ S
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);1 _7 e" }5 H, G. d0 q
  24. 8 m% \: G+ n, B8 |
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    ( C* R4 a* F  T- c
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;# b% Y& I0 X2 ~  Y5 {1 g
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    4 D9 L- e; R1 c! y
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    . z5 l+ _% V  ?" F$ C! P& P& V
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    # \3 e8 K- d- j) u$ f# }
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    % t3 {; j! N! E' h" `+ t+ d
  31. 7 a9 H4 E" f+ w) u& |
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;" }9 R1 E. g" z- c
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    " }4 X6 P/ C6 p+ S
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    - @* w: b; y0 d5 d4 I$ f+ W
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    * B! F0 z7 I' C
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    ' J2 s% l. [  r( v2 V, e; s# B
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
      b8 |5 a$ e9 Q' L5 R9 S$ f  E
  38.         Cdfinger_BspCs_HIGH();8 Z4 L+ ^7 D+ M
  39.         //Cdfinger_Bspdelay_ms(1);
    0 a6 G, Z6 l6 k
  40.   //Cdfinger_BspCs_LOW();) [2 S  ^$ |3 p( v  T+ [
  41.         SPI_Cmd(SPI2,DISABLE);
    1 Q1 W" ?* Y; ~6 R& w4 ~, B
  42.         SPI_DeInit(SPI2);) g7 x) Z4 W8 ?5 u+ \+ R
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    ; M" Y3 m8 J0 W, E- t0 e6 p
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    * l0 g3 f* _& \/ b) a5 V8 ]
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;" d+ q$ s+ m; _1 w
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;4 z" o, t* c0 }) h) z; N5 g
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    . q: ?2 g- ^) m' h) {
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;% b! J% \8 }0 X$ ]7 v' I$ l
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;  C6 ]2 Q* `" g+ K2 A4 Q8 t: Z) S
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;+ d; `* [0 f" V- p3 t3 ?7 z0 l
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;5 U. C/ \' n* |5 U
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    ! t7 C) ~' d1 `+ E6 s  I# u1 |

  53. / n6 i4 Y: ^' V! Y
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);% Z$ R5 U6 z' {# ?0 n
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/- E* q5 p; p3 d: n4 {3 _' T
  56.         DMA_DeInit(DMA1_Stream4);8 j+ r/ X- S# k" V6 h) `
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;+ h( s9 f/ J/ b+ B$ t+ z) _
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);8 e8 Y, q0 z( a# M0 E' N
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];/ P1 i7 c5 A6 D9 O9 ^' `" b( q
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;8 E& C9 e3 x: F* `
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    # T1 [5 u' z! [* |# h- `1 M
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;: l* x; f$ A+ e$ n( M1 U
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;' K* d, H# E& I1 l1 ?
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    4 k0 u# R3 n' m, ]8 }/ d
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    + C+ M; e" {9 Z5 j( ?" D6 @
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;% y& b# G$ g/ `  k/ ~2 m& X* d9 M
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
    7 U" X, d- b( f7 n% s, }
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;$ n- V( s; X- B
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;" D+ r) s: H4 }$ x
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    ; {3 R: M9 u9 T! }0 |
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    " ~4 X4 d0 E  ^  {9 x
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);5 b) v. l/ o( u% |' u
  73.   
    8 v8 C' q  G& Q) ?
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/' y  \9 v4 ]) `: J$ ^# P2 k
  75.         DMA_DeInit(DMA1_Stream3);- c! T, s% w" n3 [7 ~4 g: r$ p  _
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    , n  r3 l  ?% ?* p( L: z' f
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);4 j0 L/ i2 m9 {. {4 V. ?7 ?# u
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];) u& \& i' [" f; x; G0 |* \8 i
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;+ L( d. N' M" c  a
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;, J7 u' I% K# x9 q' t, X% O  }
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;& j- A$ ^1 {5 {$ G7 l
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    2 b4 x- a+ y4 B
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;2 b. U+ V1 Z( h6 a6 d
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;' B) b7 C! K9 N! ?
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;/ U7 B3 U" H- C- m! K7 d9 N
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    0 d  J' I4 L0 R* D/ i0 v
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;* m0 W( u& X9 {3 ^& O# y. p! c
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    9 Z9 l; P( y- h. y0 v( o+ Q% o
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    3 n# \% P) o# z  J  S
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    1 p' z. u0 @5 _8 q$ e% A% B" ~. R- A
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    ! x/ [% ~2 G- W9 @0 [+ R
  92.         //Cdfinger_BspCs_HIGH();
    $ k8 {) b4 k; T! }" Q
  93.        
    5 j9 O/ o: M: z

  94. ( G) e6 O; \. j6 i% m2 E! X
  95. . n5 M8 F: u) A
  96.         //发送中断5 n4 v0 u( e2 P5 @
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);7 r/ ^2 K, N9 _8 u: h$ _
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     2 W+ t* b" c* D& K8 G+ c0 k
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    % u4 E1 a! t; H1 U* t6 ]+ m
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    0 [* w1 t  O. K
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;$ q2 w& {: l, p: u1 c
  102.         NVIC_Init(&NVIC_InitStructure);
    8 O6 R# z- ^2 ~5 {
  103.         ; O. K) B2 f$ Z+ P( K
  104.         //接收中断  W* z9 o5 \9 y
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    ; ]# Z4 X4 d9 w" E: H& l
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     3 b1 Z( s, l4 ^1 t; N& O% h
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;6 Q# B9 M2 ~# X& x
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;7 H6 g- T8 F, K7 j8 [7 m
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    , E* M& I1 O4 X: c3 d0 ?
  110.         NVIC_Init(&NVIC_InitStructure);, R6 n; u& p# @6 `9 l2 X5 w
  111.         SPI_TIModeCmd(SPI2,ENABLE);
    7 @) z& Q3 P* j' i
  112.         SPI_Cmd(SPI2, ENABLE);: s) ^3 [8 p8 }1 |' V& Q: `" d, M
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);' J* u$ H7 g& Y: \2 p- ^6 \9 e
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);# r0 E  w. Z: i

  115. * ^, P  a% W3 d, v& r3 q0 l
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);2 p, T/ k- q+ `) s
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);3 k/ a5 S% V, o7 K* G) r1 ?
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    : Y; l5 M" N9 V4 a  U, [

  119. / i  x4 ]& i9 V
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    ; P0 D, n1 x: `# D; m7 K+ E
  121.         {; h1 V3 E. S1 `# ]0 d" U4 L) T. B0 H
  122.           if(ii%8==0)- B( k; D+ c( j' N) Y- ?  j
  123.                 {) g: \/ ^% r" k6 X1 ]
  124.                                 printf("\r\n");& W  m& Y9 {& v
  125.                 }) ^, ]$ m! [9 ]1 u
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    $ O; _- c* c2 n. W  p: E1 _* M' Q
  127.         }
    " u! D! x. l; I2 c0 V8 W
  128.         printf("111\r\n");* [6 u7 r% C$ U' g$ P8 g
  129. }& F' T* |2 F; d+ Q3 p
  130. ' g' O9 j3 C; N) D0 q  R' \

  131. $ E, S! ^  f7 b5 P4 E+ r4 E0 Q
  132. void DMA1_Stream4_IRQHandler(void)8 w/ D0 x4 J0 \0 Z/ d
  133. {  W+ A- \" s/ W2 X% k" q
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
      O( N/ b, O1 L, a# H0 ]+ X
  135.   {
    . E; u& T: A( D: Y9 X
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
    , l3 b7 l2 ^. O) U& H& m) `/ }
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);8 Q# p: p! ~8 c5 S% ^  t* [) Y
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);( r5 C" ~/ K$ h* y4 U6 f8 h3 x
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);) ?; M6 }1 ]; i( K3 g2 ^" T7 z
  140.   }
    - @, O6 D  M: E; Q8 _7 z
  141. }
    # w0 o- E. {: C6 G! H

  142. ' x9 b! O8 C) y9 ~' k8 l5 h0 k
  143. void DMA1_Stream3_IRQHandler(void)/ Q0 a+ j6 U. k$ C: E- ?, t
  144. {
    ; ^( ^+ g: r, I! q
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
    9 \% l' w& ]6 a9 K9 H
  146.   {$ z) i$ B$ o/ i
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));, a# }  L0 u+ R( `
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    # e/ l, S* E; m( _
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    2 ~$ n  ]' ^5 S8 V1 v/ r6 M, Q
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    8 `* b- S2 l4 `+ G! k
  151.   }
    0 E( n# |' \; V, t& y
  152. }
复制代码
lovelifett 回答时间:2014-1-23 15:10:56

回复:【ST MCU实战经验】栏目开通!官方解答应用问题,欢迎下载!

楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信; ^+ m# g2 U5 |: D/ F$ {6 B3 [
以下是全部代码:
1 R) D) z  C. ]* O# z+ G9 U#include&quot;stm32F4xx.h&quot;
" G7 D0 W, }* G  Y3 Jvoid RCC_Configuration(void);
5 t* d: O$ F; v( q5 H7 a4 X! wvoid GPIO_Configuration(void);* L% ~% @( s: y! z( {+ y+ O
void SPI_Configuration(void);
, u2 e- l5 V0 D$ mvoid Delay(int nCount);0 p9 \$ l9 J4 t7 j' O8 \
int main(void)
5 `* u& r+ |; z! X  d# f{  RCC_Configuration();3 T& ^4 ~0 ~) H; t  J# x
  GPIO_Configuration();
8 M3 f# S! j! v' C$ I  SPI_Configuration();( b) O' v( j6 g2 r( R
 while(1)
+ O! E! y7 ]) r4 R3 @ { int data=0;
: d; m; F$ \9 j- h& P; V* s; E5 s  SPI_SendData(SPI1,0x55);
, _7 O2 d* F+ ~3 \' V" L  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); & I" f! R' ]. v# z* u! T1 y
  data=SPI_ReceiveData(SPI2);) u4 x2 A, P2 V
  if(data==0x55)' _$ u% N8 n9 ]" S5 _* R
     {  while(1)/ B: e, U/ Y' _  M
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);$ t4 a" ]8 o& ~# w1 f4 b
                Delay(0xfffff);9 [3 p8 g# g2 u5 ?  N
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
# v% Y% G! T. p  {9 E6 N                Delay(0xfffff);
6 ~6 A- n; C) C6 ^) R4 K+ M   9 p: g: }' X  m
             };
3 l) _1 |- i) Q8 n' ~& d1 e     }
4 p% B' b0 l# _     else while(1)
$ t- `5 g- V! f$ U8 w  o5 v            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);1 D3 u' k: k! ~2 X6 a. a
               //Delay(0xfffff);5 B0 Q0 }1 `8 t2 q7 E: k
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);1 f2 e6 {% q# _! w3 M- R  T
               //Delay(0xfffff);
& n$ S, p2 w) x  J6 l2 L0 B1 K  
" A% x% g! Z% L3 f            };8 d. L" ]9 y$ _8 K$ C+ f0 e: @# Z9 }+ x
 }
: l. n; S. v  d, f}' }0 h4 ?% E% O9 U: S* x( e2 v* h$ W
void RCC_Configuration()$ c2 B1 s- B" Q. e" i6 l
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);1 {+ m4 c2 {% U+ j5 T( W
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);/ I4 y! Z: n6 |
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   ) k( }4 h9 T! e& _
}
9 {7 U3 w. m% Z# p) X& t7 H4 Vvoid GPIO_Configuration()$ l7 \# u2 s4 D# O' T! g
{  GPIO_InitTypeDef GPIO_InitStructure;
5 f' H! _/ `! O! d9 _! b2 z% }  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
" e* t8 t1 ?! k- o  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;9 ?6 [' ], @1 U
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
: {# p( F; J+ f6 ^3 C; Y4 R, k. I  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
/ B7 e3 }. U" d6 j& X+ n+ r  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;) B: B) c2 w, }, z  y! M$ I
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
4 q& A( h' A$ ~4 o. H  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;; d  {! ?3 g6 F8 H9 o" ]
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
6 T# ~) p+ v' u9 h  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
0 a- K7 q* k8 c  d2 J  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;9 A' [) W3 P( u* C$ n* D3 l
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;$ x. u4 U* `- L% t# |
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
! I1 c: V2 I( {  M" I; C  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  K" Q' K: c4 F8 l  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
9 V/ H) g0 @7 e* u8 l- {1 A2 E7 _}
, V* P0 D' [7 [" f6 l# Vvoid SPI_Configuration()+ d; r0 e3 U, q$ \6 ^2 q" ^+ Q$ u
{  SPI_InitTypeDef SPI_InitStructure;4 F. p" F% t5 v( K' k
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
9 X3 W" a" C! Q- f  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
$ E6 w) d7 {  n  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
' l! ^6 ^( ]5 y' ~4 z! W+ [   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);# S" f7 d" }- E. l. k& m  q0 U4 V
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);, A0 {: Y+ J# |( s* W/ ~, _7 m
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);# `& k' z) o4 B1 ~/ R8 X
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
! F8 o& J/ b% e5 Y  {  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
! i4 {, o$ j( a4 n# J  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
) a0 D/ q: R+ x9 s7 Y1 d" p) {  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;: s; D6 {. f& q. W$ o
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;0 O' x$ b! l( c! G& D& ]* p! R1 r
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
9 h% H/ Z# F0 |8 ?6 Y% A9 q& E   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
3 A0 @( [5 P. Q   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;* y! w, B2 Z5 f
  SPI_Init(SPI1, &amp;SPI_InitStructure);" m; M/ [+ ]# g- P3 P. W  P2 U
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
; u0 ]1 I2 e8 F6 J9 V9 B+ y   SPI_Init(SPI2, &amp;SPI_InitStructure);
- i: o% m# f; L8 K, g4 ]4 d   SPI_Cmd(SPI1,ENABLE);
  S- `' B# s2 ?- ]3 K- [   SPI_Cmd(SPI2,ENABLE); / O" w* ?4 C6 _- |
}
* u: \  }' m$ u/ Jvoid Delay(int nCount)
3 `; e0 |7 G* F% T7 T- @{ int c1=nCount;
6 \! s8 c1 G: U. |# M1 I* q. ? int c2=nCount;3 e+ ~2 }; ?& j$ h! c
 for(;c1&gt;0;c1--)
+ g, C$ f3 N& [2 l5 l' {" e  {6 Q1 _* K" A: T  l# _+ k1 X0 J
  for(;c2&gt;0;c2--);3 \  C6 J* Z5 i+ [/ C" c. g
 };
1 z( P8 F: ^# M: J, v/ B}
# @9 |7 _/ o2 d3 j' ^先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

回复:【ST MCU实战经验】栏目开通!应用问题,官方解答,欢迎下载!

回复第 2 楼 于2014-01-23 15:10:56发表:2 M& e. b) S$ s7 `9 x$ _! @+ C
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
! J  N  h- M$ Q以下是全部代码:
: [$ z5 z' o# a/ z, G1 u! Z#include&quot;stm32F4xx.h&quot;
: @" D0 H; i! mvoid RCC_Configuration(void);
: E. F- `7 W. a; b% }$ h* @$ Mvoid GPIO_Configuration(void);, d3 O, f# V. r6 c+ T) |
void SPI_Configuration(void);- N* l% @. H& y8 ~: Y6 i- r
void Delay(int nCount);  n4 ^4 V5 E, ?8 A: i7 c
int main(void)  Y: K* C+ N3 W( K( m9 E. }6 z( U: A
{  RCC_Configuration();5 _6 b$ ]8 A* x4 u' N. o
  GPIO_Configuration();3 J* q  G- O/ q0 w7 ?; k( N$ F
  SPI_Configuration();: @; d; @* W6 V/ [
 while(1)- N- k5 o; G: x; e! S# J' K
 { int data=0;) \$ v/ [# f4 O3 f
  SPI_SendData(SPI1,0x55);9 O3 j( h7 o3 w4 c8 i% U, H4 r
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
  @1 {, [9 b) I. f9 H, t0 \  data=SPI_ReceiveData(SPI2);5 U7 ]* M5 c, u1 {
  if(data==0x55)7 w. r: I3 C# ?# x  e
     {  while(1)
1 @8 ^$ ^& l! a$ y+ o. |. o# L             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
* }. R( }: s5 L1 c6 D  n                Delay(0xfffff);
, W$ w+ Q  v% Z3 L( f                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
- n/ j4 G1 r- g$ e                Delay(0xfffff);- y; `2 l% U) k
   ; ^: A8 c6 \4 u3 B& X8 w: Z
             };
( r0 `3 A0 B: `" R     }
7 V, S4 n5 z/ w6 ]! U     else while(1)! R7 p5 e* m: w0 t
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
! m* W+ w: m) H1 ~* S$ O! b               //Delay(0xfffff);0 w( S% \+ ], ~
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);/ J0 \1 F' \& y$ v+ R! ]: \
               //Delay(0xfffff);
5 m+ \& q4 ^; F) i# x   / x* A* h7 X5 Z3 ?6 e4 z
            };
/ w+ u% w9 e; f) G  f+ r: ? }& M% g" F& Q1 \0 A0 ?8 |& l$ r: L
}
, S3 [# x% z) ]+ p' T( V# W; _6 gvoid RCC_Configuration()
0 E! J& q' T4 L. [{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
* G3 O1 x( c' ?  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);+ R2 m6 T- X" ]$ f, _
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   6 n" K* \  f1 z/ L' L
}
9 \! Z' G8 K7 L) Z# x( q1 ~4 T3 Gvoid GPIO_Configuration()' f# u1 W8 t4 E: m  u8 C9 Y
{  GPIO_InitTypeDef GPIO_InitStructure;
$ v. j7 O1 S1 w7 T, U* B  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;& f9 _0 c0 ^' Z/ b+ g
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;% D( |% o2 ]/ t. y; L5 g1 |. A' l
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;! B4 u/ n* |+ t$ F) h+ R
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;3 ^1 g2 }+ H( L$ t1 G
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;( k; C. I& w4 D  o" ?
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);) f( Q7 O" T6 o: J
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;8 W( _, g+ I2 U
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
! [0 ~+ U3 s* w& I, R  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
5 R- R4 t+ X3 V+ y. S% l( E  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
& }' [2 ^$ V1 h  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;1 ]. N  U! \; i
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);* \. a+ l4 m% W) g: g7 L% R
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
0 p8 ?3 K9 _8 [  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);" [  |) w1 \' k( B& s2 ^
}
9 i* M' z) ?( {2 P$ Hvoid SPI_Configuration()# u- y) f9 t, G
{  SPI_InitTypeDef SPI_InitStructure;; A$ S: }/ j6 E
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
$ [8 `5 T& k/ h2 g7 }  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
+ g5 W* P; x% f! C% S- x  u  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
1 ]; f8 G( y* q& ]   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
0 K' d: z6 w+ d  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);+ l. ]/ G5 C. y9 I
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);% V; ]4 @% C: J6 g; ?& I
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;) g1 {: p. ^" g* R% G% H
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;" n) l. D7 B, c: \: O
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
: H+ ~' O8 C/ U1 Q' j% W  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;% f, M# u) G( l2 w! D! u4 ]
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
" U8 y9 z* m5 @8 \' q" o  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;0 R5 m8 r/ e* D8 ~& M
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;& k# }1 @( l! W6 c
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;8 Q' @1 @0 M3 J9 e7 e: _2 K0 K
  SPI_Init(SPI1, &amp;SPI_InitStructure);
$ Q0 o/ Q& [* E& L9 ~. a  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;# e; i8 L6 q9 P$ ^7 G; p0 m5 J' a
   SPI_Init(SPI2, &amp;SPI_InitStructure);4 Q3 C! f: Q3 ?+ L( s; J+ f
   SPI_Cmd(SPI1,ENABLE);1 `+ X! w# v0 g3 [6 T! i- T* K' L
   SPI_Cmd(SPI2,ENABLE); 8 t3 Y1 L8 C: b
}" G- B9 e0 _+ `* T0 c
void Delay(int nCount)
4 G% i' I3 h3 s{ int c1=nCount;( K( J$ h7 e7 K( E# E
 int c2=nCount;
- ^& o+ L) K( A$ T2 j: ?5 E for(;c1&gt;0;c1--)
+ f" m4 t$ p: v# @  {
7 U! S6 `4 W/ N( ~+ a# d  for(;c2&gt;0;c2--);% E9 r5 h" b8 T' U& X# T* N! H/ E
 };1 i- p; J" `# f. N, a& O
}$ }3 E3 E( q  s  i/ }! C
先谢谢了~~3 ]' a5 z  m( }7 V' T9 \) ^+ z
 / \6 j( i) ]8 w3 `: D5 F" l
) Q$ x$ M4 l3 T0 S# ~8 V1 n
楼上的问题,看我帖子给出的提示哦~
lkl0305 回答时间:2014-1-24 09:53:43

RE:【ST MCU实战经验】栏目开通!应用问题,官方解答,欢迎下载!

非常详细,具有参考价值,支持
21GPRS 回答时间:2014-2-14 11:37:16

回复:【ST MCU实战经验】栏目开通!应用问题,官方解答,欢迎下载!

 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
沐紫 回答时间:2014-2-26 17:13:44

回复:【ST MCU实战经验】栏目开通!应用问题,官方解答,欢迎下载!

回复第 5 楼 于2014-02-14 11:37:16发表:
3 ]( ]/ g6 P, \2 i9 E6 b5 y 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。) X8 w. w) {; i; J- X
 : c$ L, W' j* G7 k5 c! O
6 D& m2 N' K+ D0 M3 f6 i
多谢支持!!
abner88 回答时间:2014-3-9 13:43:20

RE:【ST MCU实战经验】栏目开通!应用问题,官方解答,欢迎下载!

ST社区做的确实很好 版块引导很好 资料分区也好
stm32f103vc 回答时间:2014-4-3 18:52:58

RE:【ST工程师 MCU实战经验30篇】之USB接口易损坏

非常好的帖子,希望可以及时汇总更新,收藏了
renqinglei 回答时间:2014-4-4 18:00:50

回复:【ST工程师 MCU实战经验30篇】之USB接口易损坏

非常不错哦,支持下
renqinglei 回答时间:2014-4-4 18:00:51

回复:【ST工程师 MCU实战经验30篇】之USB接口易损坏

非常不错哦,支持下
Jack·Owen 回答时间:2014-4-13 08:09:50

RE:【ST工程师 MCU实战经验30篇】之鬼魅一样的Hard Fault

都是精品。大大的支持
gougouyx 回答时间:2014-4-16 14:40:33

RE:【ST工程师 MCU实战经验50篇】之鬼魅一样的Hard Fault

谢谢汇总,
anan555 回答时间:2014-5-7 17:49:29

回复:【ST工程师 MCU实战经验50篇】之浮点 DSP 运算效率不高

  
! L1 z6 j" @/ N  {鬼魅一样的Hard Fault) y% F) O4 }1 h3 E1 W" r/ o+ J  y
 
0 G  y4 r5 r8 `* A! B该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。! ]6 l" |$ |  p9 m* U7 D
 
; o9 Y8 t1 g5 {9 `5 t咋解决?
chunlei233 回答时间:2014-5-7 19:50:50

RE:【ST工程师 MCU实战经验50篇】之浮点 DSP 运算效率不高

哪有这么多问题啊 只能说是所编的程序有问题
steven陈 回答时间:2014-5-7 22:07:20

RE:【ST工程师 MCU实战经验50篇】之浮点 DSP 运算效率不高

DSP是MCU的短板啊

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版