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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
. m, m: w$ u& b2 W
9 x, A: R3 J! P. J) |
4 g" B" I1 v2 V( S1 c! {社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验后,可直接下载文档以及程序。也欢迎大家回帖交流。
$ ~3 z2 K5 H; ^5 `9 S, B# W, i $ k7 a; T/ x9 ]# v, U( D, E8 Z
提示:点击各主题,进入帖子,可下载ST工程师解答详请
, x4 x; [8 ^. I4 i% K* y7 @5 S
. c# B( ?% @) i0 v* X& N5 k; t! v. Z
一、通信接口
  {7 c7 ~0 R& F- V6 @1 G# b' ~0 }
$ m8 B" V  s/ a. _- s" O; l1. STM32F2x7_Ethernet(FreeRTOS)驱动更新
: p, o+ b/ l* d5 n* y! D ) \( j' O# g3 u3 ~* I5 u8 N
2. SPI 接口发片选信号导致死机5 I6 Z" t3 \5 W

# U( `2 j! k. \( I/ s: w3. USART1不能设定600BPS的波特率% C5 ~+ U! `/ B4 M& ^. K
& g9 C% k' m. a1 j; ]# `
4. I2C 接口进入 Busy 状态不能退出
1 C. u- m. [' m& y3 c1 W 2 a5 A2 h9 |' ]: a
5. 对 Flash操作导致 USARTU接收丢数据' R% w3 t' P# ?  D# t
- S' {# ]5 I, W0 N4 X
6. USB接口易损坏
3 ~, k6 a' l- M# m% K4 P
& p6 q* ?& e- k8 ^9 P& T' @, G% R0 O7. UART发送数据丢失最后一个字节; F$ z2 y7 C) P9 ^' E  G

$ N2 d. j" B; @9 d8. 使用 CCM 导致以太网通信失败
5 y) D; @2 a; p; o7 Z + L8 ?6 P. s/ p- z( h7 N
9. SPI3 接口没有信号送出
2 F% r+ s* B- w: \2 l
3 I8 o3 z) D% b3 s5 B10. 时钟延展导致 I2C 通信不可靠# n2 F8 b- ]/ t. R

3 A  A6 Y1 E: _9 `11. M0的USART波特率自动识别问题! w& S5 t& g4 O6 j9 R
& j& ]2 p; x) J7 W  g( C( K
12. WK15 OTG做U盘主机兼容性提高
) F. f1 ]6 g0 B7 o! S/ T
% v4 X' k+ g* J/ M1 v" ?13. 以太网电路设计注意事项8 Q5 k1 Y4 h# q5 U* U% Z

$ Y) v& Z/ V" X- L2 y14. OUG主机库在BULK传输上对NAK的处理
, G0 Y- R4 P! |: v 5 V) m& ]/ H$ w$ z! a& r: Z
15. 串口断帧检测
1 X7 T- ^) E3 r9 \: c& f/ ^
$ Q( q1 O4 p1 j! x5 Y  c16. VCP例程用于数据传输时丢失数据的处理& u0 x5 t5 W! c: X: {( k

8 k- G0 d3 M) ]* d17. STM8L051F3P6串口UART数据起始位判断的问题9 {' O( [0 i7 X: u' y' l. w7 s
5 x0 P/ O. d( Y9 a1 M$ m+ {. _
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号
3 }$ y- J3 T% ?" a
0 }+ S3 Y  y" x$ W* z8 \19. STM8中UART奇偶校验的使用方法3 N, m( n! M) W  g$ `, w( E! Y
0 Z" n# u. ]$ l: C
20. STM32以太网硬件设计——PHY# D2 J* W6 l) o7 s/ O* K9 n/ I: _3 ~

2 T: e# R6 M: O4 r$ ^1 x( a6 r21. 一个判断I2C总线通信异常原因的方法- Z7 \$ J: B: c+ z/ u9 k7 b4 ]

0 c: A; C# C% _! G22. USB device库使用说明
' d6 e  |; w! K* T$ n- U; ^# ]4 Y+ ^2 n$ s) g7 e1 k: h$ F1 {% D
23. STM32F103上USB的端点资源
  g' E- x9 Z% W" O) F5 p* f  U! m) }9 [! j/ L! a
24. 使用CubeMX生成TCPEchoServer程序& Q7 a) O, Y) V$ W- N" q

- b5 X- d7 y( d6 A  r: m4 C' f25. SPI接收数据移位
! Y# X8 S1 Y+ Q1 M" M 7 S1 j9 ]4 y; O* E. A: {
26. STM32F0中Guard Time的设置1 \7 \0 P, B. w% x5 d
: _& z: \$ o% X* t9 j$ q% [& h- V
27. LwIP内存配置
2 C4 D7 g1 m2 W8 z3 @' h/ L" B. u4 `& U. b; q- [2 u
28. STM32 USB Device的简易验证方法6 y* m6 k" f3 v2 P2 q! k8 o

" v: r% o* y+ x( G6 K4 e& v29. USART 中断方式接收无响应问题的一种情况及其处理方法
% L8 S: I% W" Y' @( ^* l
) T# Z/ G( s( _  Q: P/ L, s30. STM32 基于 Nucleo板 CAN总线的建立2 T1 S  k. t# x# a, l

: s% i" E2 I4 k3 T8 @31. STM8 CAN总线的IdMask模式的讲解! A% Y% a9 i& G9 C

) M5 Z. j  V9 L' F2 V2 @- u7 C32. STM32F746ZG USB 驱动不正常 4 c' P/ Y/ [% v6 M; a

/ ^$ J- L% a- o33. MCU在STOP状态下通过UART唤醒分析
6 h* {8 @2 V; `" Y+ R  T* x
& \% P" c/ w9 V; G1 {34. 通过STM32CubeMX生成HID双向通讯工程
1 v8 H% z2 A5 q5 J7 P! S+ k: W. f# i
: ~( W% w  b) `5 R, c5 x35. 串口工作在DMA模式下有时接收异常 . {2 ^- G# n' v% Y5 G

& d: H; R6 Z8 P9 V6 A: W36. STM32 Bootloader中 DFU使用限制' C5 `' W* ^  @# Z/ b9 `$ L

9 \2 S9 Q* V) ~# t37. UART异常错误分析
# k  |8 I+ t* r1 ~
  S% C3 W* G4 D! r, P+ d% ?- Y38. 基于Cube库无法检测CAN2的接收中断
1 H! G8 n" A6 k8 I/ ~- ?6 a% ]. m! l0 P; J
39. 基于STM32F7的网络时间同步客户端实现 / C" `" B& }0 ^: M

5 D8 E" V  S9 ?* c- u40. HID与音频冲突问题 3 g! g7 @1 Q, o  Q

+ J0 ~7 y0 i% a/ k  |8 n5 o41. 在进行USB CDC类开发时,无法发送64整数倍的数据
6 z; B  p% B+ H8 b: S$ Y
5 t. \" u; X# }* _( ?/ t! v: a42. 从零开始使用CubeMX创建以太网工程
. x; |3 W3 d! G' e. {" C1 {6 {2 t; a1 ~" d& l. x1 t: }/ v& A
43. STM32F4xxx的I2C总线挂起异常处理/ n* F, i9 _' u

9 V3 ~2 @6 Y' d3 j5 [44. LPUART唤醒STOP MODE下的MCU% q7 |  `" `7 j* N1 w9 [9 \6 b7 \
2 I' \; V; p8 G. o
45. STM32系列 MCU模拟双盘符 U盘的应用) n. d* x+ X, w
, q: S+ h9 c+ r, H/ f* m# @, D* m0 R
46. CEC输出的数据和数据长度始终不匹配5 h$ W8 \9 W/ [

7 v1 q( s. \6 ~- z7 v: w) P" g. F47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析* |) P4 d. A% W; J9 _/ p& y

) v5 U5 [8 Y$ E4 K3 H1 ]8 S48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)5 t8 E- l5 h5 I
; j& m/ N* i1 k0 e$ m
49. 增加UART接口应用时的异常分析
- E" W. S$ ~; `& f3 t8 X* J$ d# Q, ^: H# ~
50.UART应用异常案例分析
8 i# N( E5 Q) [5 t4 [
3 i+ d; Y* w. z51. I2C配置顺序引发的异常案例2 _  I* W- ~) d. [0 I% A2 a$ L5 {" z! A
6 W6 ~' V$ m1 x
52. STM32 USBD VBUS GPIO" [1 q' i; Q/ c+ g5 P
/ y  V# c, H/ y) O0 w; \' O
53. USB传输数据时出现卡顿现象! f' F0 R8 N' ?- {& E6 E- C: C3 Q

. [0 h* O5 l5 L- k$ r54. STM32的高速USB信号质量测试实现
4 ?8 T0 @- y9 [, ?6 n0 ^3 l! u5 ]' z2 p
55. 基于STM32 I2S的音频应用开发介绍2 O9 O6 E5 ?+ |% I& [4 o
( g% }. d6 T+ B) X) w7 }$ D
56. HID_CDC复合设备在WIN10的识别问题  & k, T' R8 e3 [
, d  u$ U2 F: U# [. V0 _" [% G% Z9 R
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  
) y5 |. I$ S) n. C; Z; k3 G% N6 ^
+ H" s9 f5 m/ V  v" R58. 一个关于LPUART输出异常的问题分享  * I- r$ M% p/ P1 q2 K! j3 U# n* J
- E* ]4 Z$ H3 |1 a1 ^- ]8 n
59.通过 DfuSe 工具控制程序跳进 DFU 模式
, ^4 q4 E% z* e

- A: M/ [: i7 a# p  U1 [$ G3 F60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
  q/ ~7 V/ d' m
; v, w% Z7 j' {- ], A. g% x
61.一个因初始化顺序而导致异常的话题 (2019.12.24)5 k" G% E6 m1 Z4 R8 h* Y" K

& @2 B2 h0 ^6 r: {8 m62.MC SDK 5.x 中增加位置环 (2020.5.29)" m3 ]3 k3 e4 o& W# ]) d5 y

4 t6 s! O7 Q3 i, }6 Z% j; }- y63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
) Q' G' {! k/ {1 z1 p* k: D8 ?. U3 [* ?  M- e% c6 F% ?0 i
64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)4 H: Y- S+ J: @0 \5 j# }3 A

3 k6 z# W. c# y2 y: v9 H二、电源与复位
( [2 d5 A. s5 J$ I' Q; `) T2 c8 z* I. W 8 i, ?1 B3 t8 {
1. Vbat管脚上的怪现象$ {% o3 |. E( g, h6 m' i
4 Q: F# h; H+ S- ?1 L/ |
2. 上电缓慢导致复位不良
* j2 m3 m+ n( F) k 5 ^- E; @! w& u: T+ B- Y
3. 关闭电源还在运行
0 o) X+ i- @) M2 T- o: w& C
" B$ @; k  w0 Y+ b4. 使用STM32 实现锂电充电器
7 x" z4 a# p, x3 G& s
" n8 e" i. l! Z9 x, D0 @5. STM8L152 IDD电流测量, j/ a. m0 R. D  C
' q8 Y/ a0 z+ K( @7 M
6. STM8连续复位问题4 Y, Q; P; h4 a' A1 i. D( ?# ]

  R* Z; V4 v9 J& O8 _( f! L7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
7 k6 T5 F7 G6 A( v; X+ T; @+ f7 E: z! C: t% S- Q5 S( N' S
8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流
8 h$ l' X. a2 t
' g9 E7 q' i% {: P0 s( a- T- O, X& d9. STM32F7与STM32F4的复位序列比较; O3 |9 l9 c9 q0 F2 z) z- ^, E
' ]8 s$ z! Q* p1 G' [9 j! N  c
10. STM32F107 复位标志问题 2 J* j# q4 S. z. N
5 G$ L% r+ v+ Q8 k1 @7 m9 X7 g
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
( Y2 S# D& W4 D9 x6 X$ U' Q1 D
. b3 [% w% S/ H4 ^. Q, n# D2 P 12. Nucleo_L053不上电也能运行! y. }) h- c0 B: L6 u- S/ p
1 C% w9 |5 a# _5 D
13. STM32L4中STOP2模式下的漏电流& y7 u6 M/ k* C" q5 _) K

4 k7 I( J; G( @3 x5 k( C: X14. 在没有外置晶振时HSE_RDY异常置位
* u( F2 U& M4 G5 ?2 ^: e& I) Y* i
0 p$ T& W' b3 s4 b& b2 x15. FLASH被异常改写   (2018.5更新)9 ?- j; p! e# _+ S
% n! _% F2 J& |; f* Q" g
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
1 O0 ]! a/ W( `& \* K3 q- \: s
! B' B$ l5 H0 F3 V( Y( W& @7 \  I17.一个 STM32 芯片异常复位之案例分析(2020·2.27)* h, d4 R5 ?! J; u- Q% l
# r8 U) [, P' ~, n) M6 J  h
三、IAP和Bootloader: c/ a8 m$ ?; V: d

  v/ G9 c5 Z0 X- f1. Boot Loader与上位机通信不稳定1 P# S9 c3 s+ [# f9 U, `7 _: S  n

- x8 @! s+ ?/ ?1 Z5 K$ B2 B2. IAP+APP 模式下不能启动 RTOS" ?, T! L3 S4 k* E2 C
8 T, G: S* Y% v& J
3. 从 IAP Loader 向 App 跳转不可靠  p' b/ `7 _* y& @* Q+ s

5 G+ _5 ?5 E: |- l; C! I+ M1 O; g4. STM32 MCU IAP例程跳转到APP代码简要分析! y4 t% E3 I$ R9 N4 O2 f- V
4 I; N! G! j* y% n' O/ u0 K
5. STM32F091从自举程序向应用程序跳转的问题与解决
* v) }6 C7 L2 N, g1 T, D% v0 L4 \2 [, @2 p+ y! P- B
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码: D4 K* m- V* S; R

8 W7 B7 f& T( F% R: Y7. STM32F0启动模式相关问题探讨: \0 z% ?& S+ e( q+ ?& U& w' J; J- ]

* k' p4 F8 p2 I! A4 Z* ]- r- V0 O8.STM32F091空片使用System Bootloader下载代码8 H. X8 I. z7 _5 u* Q9 P$ {) I

2 p- D! {" F1 s9.STM8L  IAP 应用程序中编程指导  C. `6 m0 a- X5 N
- Q! u9 f0 i1 Q  t. f" X5 Y
10. 如何通过STM32的串口实现简易脱机编程器
. }1 z% `# r3 b
, U3 r* @4 d/ M0 C: S/ X! b! ?11. 一种从用户代码调用系统存储器中Bootloader 的方法  & ?' T1 j3 o* f# n! C# N
7 `6 E: G3 {5 Y
12. 利用 USB DFU实现 IAP功能
9 R8 u) u" q- y8 w, R$ V- @* i
" U! f# L" w+ Z( `( ]7 Z+ ?13. STM32 Bootloader中 DFU使用限制1 c( z/ W) y1 }+ H6 ?
; I9 b# D8 q, z) P1 Y% ~
14. STM32L011x和STM32L021x启动模式注意事项
! H% Y; l# w7 c7 _; @1 r1 I: j( I8 ~0 B4 g! ^2 I, A4 Q
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项 - L/ x/ v7 }* @# p9 ~

6 q1 `& `$ u1 p. k0 a, ]16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级 ; _7 p9 Y& ~6 o" [
% W5 T! r  |9 R( Y: s# N
17. 如何使用STM32NUCLEO 板来测试串口Bootloader6 {+ D/ m7 ]+ E( q
/ h2 l5 Z& r! `+ m1 T4 S7 U8 N1 Y
18. 在STM32L011上通过I2C接口实现IAP
6 ?/ a. M4 E4 f) k. y
  |) A5 [6 j: u8 O8 ^8 h( t. F19. 在IAR中实现通过将程序在SRAM中调试的方法  @: z) L4 n" e

! E5 m: l1 H3 a20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
: x# }% X$ a/ j% ?" O# Y7 S/ Y& S: d9 j8 h
21. USB DFU IAP 例程移植的两个话题2 H$ y) x% G2 _. f5 g

6 N; u- X% \6 w. X# E22. STM32F769双bank启动9 V5 K' w2 g4 n* ?0 T1 O
: Q6 F0 b. h" h  @. b
23. DFU加载 工具 DfuSeCommand的使用/ \3 Z& ^4 Z6 q: x
* G6 ?; I: x9 ]5 o3 E
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
7 ~7 n* a3 d  {3 N4 F6 u3 p# @0 z; S5 s* C. @
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)
$ Z9 C4 a. ~) f) d/ ^4 m0 r
: t( G5 e. H. d2 K% \' k8 v26.STM32 Bootloader异常复位案例(2019.4)9 q# k& P7 K' q- w# U" e8 r+ Q

& t* n; S* q  v. Z6 H
四、存储器, K% W1 e1 k  u) {( m
- v: B, v6 l1 u( B- \
1. 对 Flash操作导致 USARTU接收丢数据( B5 y1 u3 |/ V1 n' K

" ], _/ }8 |6 R, p9 y2. 使用外部 SRAM 导致死机
: K( \8 E. [% Y$ `1 \1 s $ D5 n3 q, H6 O' @3 P* u" r- e* I0 g
3. SRAM 中的数据丢失3 e1 q7 I1 ^* T5 u9 v1 L

5 k" T/ D8 I, t& ~4 m+ N4. 干扰环境下 Flash 数据丢失
& i# h6 f& P7 e. R3 s" I* Y 4 X$ A' {( o% f
5. 使用 CCM 导致以太网通信失败0 t6 X6 E8 p+ \( I+ W% o: Q  X" W2 [. B9 N

4 F" G1 M! y8 J: n: m( w8 @8 Y6. STM32F429使用外扩SDRAM运行程序的方法
; V6 Q0 Q2 K7 p9 _
* i  `5 L' q7 p* i% k0 b; \7 L7. 使用STVP实现对STM32L1系列EEPROM预置数据" y. R- D6 ^  t! l* Q3 l
5 D6 Y; B7 b  g# @. v9 y: O2 u8 K
8. FreeRTOS RAM使用情况及优化方法6 Y9 @6 Z. I3 I
& {- ~7 C+ T0 \- x
9. 在IAR 6.5下如何将数据存放至flash中* X9 H! S- e8 C& M- K+ b7 w

1 e7 |- n* I8 R% N10. IAR下如何让程序在RAM中运行# ]5 o# n5 A! U) S( e- B

" [/ c& d9 q' W+ y- S3 U11. RAM上电后初始值问题
  W7 p% Y) c, E  s; x# m: T8 Y% x% Q
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计. q. J  y, o4 C
( C2 n3 l3 ?8 G7 N
13. LwIP内存配置6 U3 ^* r3 ]8 E

" U# x" U; K2 r14. STM32F2高低温死机问题
. L' y1 l9 s/ C, t3 \. G; H. h; v$ ?! V5 _
15. 使用STM32F427的CCM RAM时遇到的问题3 _; A: `% T% Q- ~8 U  W

! q4 J1 Z4 J- M& \6 I16. 利用QuadSPI外扩串行NOR Flash的实现  * a, p  A( ^, D3 J- U
% X6 R" @8 E  ]5 J, ]# m3 ]
17. STM32擦除内部FLASH时间过长导致IWDG复位     1 p4 l& {: ~& ~6 b& J  l
% O- H: ?- K  }9 Z- ~* @
! I' b" \0 v/ g3 i
18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
+ Q: }3 H$ ^, p! S/ X8 N4 y& N2 V4 [+ }, ?& u2 v
五、模拟外设
* N) Z7 A  S' ^2 H% O3 d: B' m
/ L9 c: b1 i$ Z" P% K: i5 c. a1. ADC对小信号的转换结果为零: E: _; q( D& C# j  Z2 R

4 a+ H4 g& N1 j1 U) a$ J2. ADC键盘读不准
' J6 W4 _- @* x7 X
/ W) t3 i# O9 R# U/ [! w3. 扫描模式下 ADC 发生通道间串扰
- K2 Q$ V+ ]( m + l+ n9 O, M/ M3 w( R. b& @7 x
4. DAC无法输出0V的问题分析解决
! V6 N( ~- ]( m  b0 i ; w0 I% t- M' r1 \5 {
5. DAC无法输出满量程电压的分析解决
4 i' B3 x5 g* ` " @6 [' d* H  P3 a# T$ Q% F3 V
6. STM32F30x 的ADC 采样的傅立叶变换$ D& P; T( I" v6 P1 `! o9 w

" P- Y4 L" ^9 ]. a7. STM32 F1系列 DAC的示例详解
- y9 k6 e, p5 M' \
4 J! x" y' |$ N4 Q  x8. ADC 连续模式采样浮空引脚问题
- U' }5 n% y( V% {  G# K* x
7 E, C1 n; b: `  c: d. L9. PWM硬件间隔触发ADC
( V# o5 a* {8 N
1 m3 v3 c8 I$ w: l% [! a$ Z, n10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC4 o+ J# k' X9 }( M* Z) D

$ @" U1 C7 _0 r3 n0 {11. STM32L4 系列中ADC 通道配置上的区别
: g7 r% v8 V, N" g# t9 {& @& b4 U  K  q! K5 p$ u
12. STM32 ADC模拟看门狗及其应用/ E0 ?8 u. f, g5 k

# e) R5 T% S5 f  W13. STM32L053 comp2 比较电压无效问题
0 A) V# F0 W( M- R3 M6 c! @* |, b6 Z# [4 ~
14. 运算放大器OPAMP在STM32L4上的应用$ ?' d7 E3 ?  @( k

/ i: b. P5 S* |9 F" i9 V15. STM32 OTA例程之ESP8266使用 - }) Y% g! \' S7 Y
0 ]! `) a/ e+ h& ]& `) E
16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)7 n7 w9 U' c) j5 w2 P- K
/ W+ ]# H4 |; S, r% |0 k
六、计数外设3 X0 F+ x/ Q, J, H* |

3 g4 i0 F3 X7 ]; J1. Watch Dog 失效
( W1 v; \/ z. i8 U) {( W 1 \( K/ z# t3 T2 b
2. RTC计秒不均匀
  C- I! {) n, p! ~( F4 y# H. P6 B & {/ y, k5 ~/ d+ x& j9 K
3. 软件启动模式导致 IWatchDog 失效3 O, U6 V1 a# ~3 m
9 w+ n& M" }2 Z' s
4. STM32F030R8 定时器移植问题
  p( T: h# I; I( e) ]* e9 J- M) M# r1 t- P' Q
5. STM32F0使用RTC Tamper的几个注意事项
1 ?" x, e& @6 z7 k9 M+ M& ~" s. L5 s2 P9 X7 ?& @3 Q) D9 G* j
6. STM32L053可控PWM脉冲方法之DMA/ ]2 b/ ]  W4 t9 V; `/ _  f$ d

5 l# d9 L( p! K7. CounterMode,OCMode与OCPolarity关系
! R" q: X9 {% w. o' t( P  {5 T  _9 A7 I4 V; `9 y8 f) _" n
8. STM32L053可控PWM脉冲方法之DMA
7 L1 R6 L$ z, H6 e2 N# o# }4 _
7 u7 c' U4 C% z7 @9. STM32F1通用定时器示例详解—TimeBase" F# o2 A" r9 p
8 E" s( }0 ~) G8 m) S( V- A
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals+ e: {1 B' z! F2 a1 ]- \2 p
6 B/ ?" O0 ]* D# D+ d6 n
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
& D5 u0 d! I) g9 b$ x. m" l6 w3 y+ t0 H. C9 u: y5 V
12. HRTIMER的多种Fault事件联动机制
8 v# L9 q1 `$ ]3 a $ p+ E( \. _9 a2 w: y: s+ q. b
13. STM32通用定时器 示例详解 —One Pulse
' u2 U# _. }5 p( M6 P8 D7 `
1 {: A& C6 L5 D& C% b/ y14. 如何用LSE校准STM32F4内部RC振荡器- ^& x) w- \7 S9 a4 z4 ~$ y! q  R

! @7 @+ b, ]7 G+ c; k# t: S, H9 v/ i15. 一种使用Timer测试HSI实际值的方法
+ ^2 o0 ]1 [- y8 H$ U$ G1 R' c+ u; }! A6 T
16. FreeRTOS定时器精度研究
  M0 }: R) M6 X2 b, [9 w4 S0 F$ ], D6 C: c- u
17. HRTIMER产生多相相移信号
. \" I+ k% _. `
, t4 E8 Z  W( b. C18. 窗口看门狗启动时异常复位问题# V! D: m7 d! s5 t! @: y& m. [

5 o. O4 W- f- H, j! p" G1 ?; A19. PWM硬件间隔触发ADC2 o6 {2 U7 H5 L( v3 I
, T& C( ^% Y& i3 V$ r
20. STM32F030低温下RTC不工作& c8 Q# z% s& |" V1 d

) J7 A7 h& O9 [3 V, {+ S( t3 ^21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   
+ i: U) \1 H, e! ^4 m, d* z) `# y& S+ n/ U- E& R
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
+ d0 A. n1 f, B4 X, F. B1 ^) W$ e: ?% ^" N) {% ~% _2 @
23. 基于STM32定时器实现定制波形的示例 (2019·7·25) ' q) n- n0 I7 T
5 _. L, x# d% A. f* X4 |
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)/ P6 e) j+ j' K: J7 q+ U

5 v0 N' e" Q  W4 c8 l25.MC SDK 5.x 中增加位置环 (2020.3.31)2 r4 k4 e+ Z! J& b
9 ]9 E2 J( ?1 }, a" m
26.STM32高精度定时器PWM输出话题 (2020.4.29)6 @7 F7 X/ `) E5 n  j8 S, y( P
! @) P5 V" A" b) T2 K* u( ?

& }, p2 C5 P5 B/ {1 f  o+ c2 i27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12): A0 ~' f( A( w7 c

" }5 p, N: |4 P七、内核
3 B! w" D  a7 h- p- Q & |2 o7 ]3 x$ l' ~, ]
1. 使用指针函数产生Hard Faul
# L, e1 F3 Y: f0 Z! T  B1 _
+ r* t6 a7 r+ w4 J1 E8 K5 ~  X5 A" Z2. 调试器不能通过JTAG连接器件2 U0 L$ S9 \, J8 h
" `% L$ g8 E' ~5 L$ q2 y+ @
3. 鬼魅一样的Hard Fault4 |, I# J6 D8 O$ P# L8 H
+ g2 f9 [9 A2 |# T& O+ U/ @
4. 进入了已屏蔽的中断[
1 \" k7 k2 C4 g+ p& k3 ?
) a& v% y/ J( M# @: E7 \5. 浮点 DSP 运算效率不高
0 T& }" S, H1 T0 ~* ~+ B( ~  M! ~& u: c2 @2 D" @1 B& \1 }) P; g
6. STM32上RTOS的中断管理
- w& r  C4 [" y; s; e& a+ Q0 R8 V6 {' }) c# t9 `
7. STM32F7与STM32F4的复位序列比较
7 o  v" m0 x5 |3 A8 B* I3 w5 F8 U& N$ j, ]2 H* V
8. STM32F30x 的ADC 采样的傅立叶变换
: k- V& L% R5 Z9 ^0 ]. t; p# f
7 k" I% B! y9 I2 Z; g1 z8 n9. EXTI重复配置两次导致误触发中断的问题
; L% T' C' j) i9 [* `' X% y% a/ x$ Y+ Z7 Y" a0 N3 M7 s
10. STM32F3xx/STM32F4xx使用浮点开方指令
" [& h( u8 W1 N. G
' U" X. ?! b  T$ k11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响% ~% S0 d" s* }
) w' ^3 t& F* d. b" k2 ]
12. STM32F7 MPU Cache浅析  
4 W& h7 V+ z3 O- ]6 A- @8 C0 g9 o2 ~* r
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)) L6 y& y; C8 v1 r  L0 ?! Z& s5 Q

( |! w7 _8 T8 B- A5 J+ _. r7 G14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)4 a4 f" |# ]& _: V0 p

$ n6 U! g) ], E
2 k1 L* ]$ }3 Q4 @八、系统外设3 d- A6 d7 v0 U! D, R- K

) a% J8 X: F, B; X3 C7 v8 h1. PCB 漏电引起 LSE 停振
0 B' J; Z6 _  E. l) V& v; @  `
7 R7 q( V% Q& R  G! j4 p2. 时钟失效后CPU还会正常运行, W! k0 h2 G* j  [3 [

& v  u2 I% ~, y. H- C+ J! i3. STM32F2中DMA的FIFO模式
; ^: x5 p" s/ C$ C" n& e1 [, E4 e( `5 K. S% q% i0 {
4. STM32L053的GPIO翻转速度的测试
9 C9 m5 Q, q: A! l
  e! u, L5 F+ O& d5 ?. h5. STM32F4xx PCROP应用: |$ F6 G- }1 A* f& I0 t" {# W( v3 s

; u% a) l- M- l9 I. B* ~6. STM32L053的GPIO翻转速度的测试. L) S2 T3 l8 U, D* l' y# I
2 i' C# }) d$ F, a- @% ?
7. 如何在IAR中配置CRC参数
, ^/ _9 g. ]( o
$ M5 C: a. }0 O8. PCROP区域函数无法被调用的问题与解决
( s  p0 m$ Q7 B% l4 w / z9 |% ^. ?4 }) b7 F) u
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题  d0 @2 D0 r# \% F

! c" U# }$ [; @- f10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计2 i; o5 g/ W! [& A

; b5 a5 u) |$ M; K11. 如何用LSE校准STM32F4内部RC振荡器" R1 q" W1 X0 L4 X6 I  l$ ], m( G3 C

9 j% e: k& k# V4 @5 ^7 @& D12. EXTI重复配置两次导致误触发中断的问题  " W+ u- E8 g6 a; I% R
* K8 }  \! }& z( C+ F/ e6 T
13. 时钟安全系统的应用(LES篇)  
0 k) x! q" u, Q" T1 |" W) u: d

* B7 l+ C) g6 m8 E; |
14. 利用DFSDM开发PDM麦克风应用介绍  6 G2 e, _2 u5 O2 l8 v
6 G" I6 v' x8 P2 u7 L: E$ B
15. STM32H7的FMC外设在DCACHE使能时运行不正常 4 W( e  ]: W' J& ]7 h! [& J; ?
7 G6 \! s- ?" E
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)
5 V0 I" P9 e+ l, A* P6 h0 Q# O! M% a" ?0 L( W9 ?5 G# O

3 r( `- x" T7 o9 x4 R7 V九、标签和收发器
% C5 @$ L8 o1 ~  }! p+ z, O 5 _6 ~7 Y2 |* O. K! H
1. CR95HF的初始化步骤
8 ?" x1 v5 {: {
/ d9 j$ M0 T7 Z# u3 Z& n/ h. i/ A2 q9 j. Y

- X6 E: I7 Y+ P十、生态系统* P$ p+ Q% ]- ]  u$ Q

8 U5 x# j+ B4 ^9 s3 ?) N' `1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题( p! x: V4 i3 L

5 t2 V0 ?1 k' F, P! c2. MDK Logic Analyzer 功能在STM32中的实现问题
) y# L4 Z& _) w7 {9 w( G
! V! [+ D, T% T8 K: Q" {* y3. 在IAR6.5下如何将数据存放至flast中7 U8 {4 ~; r4 |# p2 Y9 T0 ?' Q; F, ]
) O8 N+ C0 z# ?% x
4. FatSL移植笔记1 C4 r1 b- V3 C& H  \$ [& Q

3 F9 _8 T$ ]+ F8 e6 o- |: l/ E) s5. Keil中使用STM32F4xx硬件浮点单元- w7 i3 ?$ k, {  w6 K  a  V) S. x5 T
$ a- A) b8 X- h, W" n
6. 如何生成库文件(MDK和IAR); R1 e1 m8 m' J6 G. s" `% p: p
, X: i' i- M6 w6 P& y! b% l
7. Nand Flash文件系统解决方案" ^) p9 t; [6 z6 C9 G
$ `3 W  s( \; `: G2 m7 d2 n
8. STVD在调试时弹出“Cannot access configuration database”的解决
" U( P* _  Y9 v8 ^5 \9 |  s
% A0 Z& K0 }8 P/ ?8 `9. RTOS低功耗特性的设计原理和实现. P+ K3 p9 s" G6 }& E9 x% _+ ~

0 W6 N- X6 ~9 @10. IAR下使用J-Trace进行指令跟踪
; V; S, _! H/ P& w+ u
" r, u. l' a& i5 {4 z* r11. STM32上RTOS的中断管理
9 g, x) N& Q2 s! t! R# U
; ?; ^; \" a  r: K( g+ Y7 U12. IAR下如何让程序在RAM中运行
. c. [' H; F  P& _4 U. r
7 [' P  U6 N7 i9 e$ K/ Q13. 如何在IAR中配置CRC参数
9 n* ]+ W% ^& M0 z4 [5 @1 X/ z( T) g% h+ y. I
14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册' K" v) `) b& E9 v
6 X: M3 i$ n+ D/ A6 @
15. 使用mbed进行STM32开发及STM32F0的时钟问题
+ U- O+ h( |8 u  K0 G6 _* `  N( I+ c8 _+ R/ N+ L
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
2 U1 j* m' a. ^3 b
3 F; L- d' C- z' s4 J# S) j7 N6 |' n17. 多任务系统中的不可重函数使用注意事项: N6 M/ K4 S3 b% f* [

5 T, A9 x. x8 s- E18. STM32 utility的hot plug功能
+ ?% |; T* [$ V/ o+ ^$ r
  A  e* i0 T% }  h$ R! O19. 如何将CoreMark程序移植到STM32上1 G# o- C3 Q: D1 k! p

% E% n' H4 K' Q0 ~0 ^( J- z+ B, e# e( {20. FreeRTOS定时器精度研究8 s# g7 S* i+ ^4 c) m: ~
0 F" i4 b6 b0 @* j
21. 如何使用Eclipse和GCC搭建STM32环境- t  P0 r  z: E

' b! X9 `+ K9 m& m+ T4 f22. 如何建立一个基于GIT的STM32库
$ v) \9 @( B" R+ h. g# A% b* J# v4 n/ s. {& a9 s5 @
23. 从零开始使用CubeMX创建以太网工程
& T' Y* I% F( \( M
) b% n' g+ V8 I& M: \24.从STM32Cube库向标准外设库移植FatFs文件系统
; o9 k: S! L3 O# v/ D! k; V( @9 K1 O$ s( p( p0 J
25. 基于 STemWin的屏幕旋转
: s0 p7 P9 l  r" k7 B+ U8 n2 y$ ]3 ]8 Q" H- |7 V
26. 编译软件 Hex文件烧写
$ x1 y. ]3 \& K! D4 d
) D# k+ l0 u% w( v8 |27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
: F( ^6 v1 }' |
- _+ d" h. T) n& D) l28. USB CDC类入门培训
6 b  g* S) }& u$ c
$ W* ~7 J8 m- k29. USB DFU培训
0 x3 Z6 x; @% T! ~2 y7 i3 p+ }. C  s+ `) s: ]0 E
30. 用于量产烧录的拼接Bin文件操作
& R2 e; J5 Y' \' C. b/ W% c
9 Z0 D, B& T/ u' M31. STM32免费开发环境该用谁6 n# J' U0 w0 J2 J8 |6 d
* a! g& r$ H* r. Y! ]& f' v( v' Y% ~
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
# k  Y2 s- }0 L6 u( a# G
" |- L! K, |  o) C2 L* B33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
/ Z2 |* E) ~4 _$ Q
! o  C! u7 a) R, E34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  + ?' X* {" ^7 u

! Q, J& E* h1 s% k* Q( w9 o35. STM32 FOTA 例程之 cJSON使用   
! C5 j. u" S+ r8 A. q7 Q  Q# o# ^, C1 B
36. STM32F769DK 云端固件升级例程使用说明
) c, j( Y$ p" X* @3 b( F
0 ~/ l3 M5 F- r& q+ |$ b
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
8 t  n% m4 `$ D' a0 T. k6 Y! f0 V( U$ m" f
38. 基于 STM32 的阿里云物联网平台方案
/ [( h, `) J0 L' x- H; m! k7 q) P/ g7 J& t8 k" F! f# w
39.AliOS 任务上下文切换原理分析  
) z7 u# e8 Z: d+ F- Z8 _3 n% k% w: Q. K+ ]. [! H) ]" L
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  4 B8 p$ u5 J4 E6 c, ?( T- Y
$ D' r6 s- d: g
41. STM32F769DK 云端固件升级例程软件开发文档  
: A" E& t" b0 \3 r$ I3 S8 ^" p

. ]& v3 p' S+ A( `+ P6 O42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)/ f; `# A8 D' Z5 `7 K* q/ B
& s6 I2 s2 \# D2 B
43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
8 e( }  \3 K! k) B  d! q# i9 }- e
44.零基础快速入手STM32MP1 (2019.9.19)
* t$ W7 |  G  j2 N- U
+ g! l4 C( J& X& r. H45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
& t! I( k; v0 K4 t6 q
+ q! H1 `; L) r3 v5 e* W3 T十一、调试7 d6 \! z( T4 S* [$ J

0 @$ t: Z) e& d7 J  q' {1. 关于STM8S SWIM Error[30006]的分析- v1 K. `& c. D6 ]3 s# I* R6 R

& f6 U, A; z2 v9 b2. STVD在调试时弹出“Cannot access configuration database”的解决& ^7 b" q/ w  q

4 b& J5 _& |3 w! G; y* e8 r3. IAR下使用J-Trace进行指令跟踪/ S: x, q& N8 p& T  U
& k! j) O6 H( L$ n' r/ S
4. 菊花链 JTAG STM32: o' J1 r$ n7 g% \4 o6 O

: y# N. f. ~5 @1 Y6 ^6 q. k4 A5. STM32F411CEUx 能下载程序但不能执行
) H4 A9 G: |& d9 `% x% {& D* E: X4 ]: A( I/ N! Y
6. STM32F103C8T6 程序上电跑飞
% |& G" k* U! q: E
3 k3 \; y7 d7 O. Z7. 使用STM32 ST-LINK Utility 设置读保护后不能运行6 J$ n& ]) e1 |/ i8 Y; ~$ K0 R  b

5 c( }& _% k( C9 g0 e" ~8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
8 b0 |6 I" l: U  ?- Y) j+ I6 T; Q& z
9. SWIM协议的GPIO口模拟7 t  q: B% B3 e% Z$ r
8 K6 F! u; L0 p2 k9 ^" |, o) v7 \
10. STM32F091空片使用ST-LINK烧写后复位不能运行用
0 ^" ~/ N6 E. ?9 x% o7 [9 X8 r! k
* l7 X" W2 ~3 [; R7 v/ Z11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)) e9 I* p4 B0 j

0 l1 o3 V9 A+ e" q! R12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)# q/ p) T# b/ q0 E% m8 U* q; K

5 v" e, o$ m, [9 u5 _0 d) X4 \- B1 `# k13. X_Cube_ClassB代码移植 (2019.12.24)9 L+ N2 g3 |) L8 N; ]+ h/ r
; X5 a8 ?% M1 J1 [( K/ u) X5 O9 B
2 I3 \/ ~' g- E1 N) N1 G. K
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)5 p! N: p2 c, s" K4 S- g
0 I: U5 b' F+ t, A+ z# @
十二、人机调试
! `% H0 @" n& d' N4 b' C& E$ H1 L9 b; |6 V% N1 G3 \, I
1. 一步步使用STemWin在STM32上开发一个简单的应用/ g' q0 ~, t; @$ Q

# w9 r" y. t) E2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计" @/ {. x4 Q; `+ i) x
& x, D( w- T8 m) w& ^# ?
3. GUI方案中ALPHA通道处理介绍4 n# R5 Z% b7 R) _
: _5 U7 b* @3 A$ o  R' y, o
4. 基于FMC8080接口8位LCD的STemWin的移植
6 [5 x" K  p7 o& T$ u# m$ ^7 W! U! l$ I0 I1 D; r  c" W, t
5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
# h& b5 g- A2 K; f
1 t, l5 K8 {. `0 H: u6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)
+ H5 L3 ]) Q0 r: p( ]; f9 ?" L. ~  E$ |' I1 C
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)2 W$ h- T) |$ W4 O; ~' x

3 |- S, Z& _2 n8、STM32L5中如何关闭trustzone (2020.5.12)
; V# m1 D& `. A! I( S' @  V/ x3 x/ y8 c6 k
十三、马达
# O+ f1 ]9 j6 P' Z) U: M3 r
% N, `; K* `2 a. T9 T, P8 w- e( Z
1. 电机控制同步电角度测试说明: _4 D( h2 H6 ]: G. x6 t
  @4 }  j% T" H/ a9 B
8 }7 ^- J3 _  d

3 O& N$ Q- z8 Y! m5 U3 Z2 P+ B: M十四、安全! Y9 o& a$ X, c8 A8 i' K, J; f
! o/ P7 E( B9 _2 u3 z. {+ F. g' d
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)& I9 k- f, g9 k, s# J' D- V- v, W
& L% r7 R; V) L) t& `7 _; i
5 p- O  r: X( M
十五、其他
% f, r' y3 ]! C) K2 I: ?
' O  _  A2 v' s, W" ~! F; b
1. 跳不出的 while 循环2 o5 ~# J2 ?( j3 y0 s/ w. P

: ~; i7 B$ y1 x, R2. 外部IC连接NRST导致MCU内部复位信号失效的问题* x0 T8 k: ]& c8 ]/ ~& K

& m4 k$ m+ _# t. }+ t; }3. 潮湿环境下不工作# a( s9 l0 M( t! M9 Y2 x
+ R0 {) N, N+ T; F
4. PCB 漏电引起 LSE 停振! T6 b2 W) v) ]1 S* Q! s. K

2 s2 c1 m1 k. F$ V$ R# B5. STM8L152 IDD电流测量
1 }3 H& |# k4 S/ t$ M* h" U
3 w* x) L- v8 L3 E# L/ M- D6. 使用STM32实现锂电池充电器
1 [4 M" C  X) t0 T. N; _
+ M: U% M2 y7 X! E7. STM32_STM8硬件平台基本检查. I# Y) T1 M$ g% X( m& [
7 t3 ?$ R# h$ C
8. 验证STM32F401在STOP模式下的电流8 ], D7 b2 y: \$ x2 P

. @) e! r' u0 R9. P-NUCLEO-IHM001 电机开发板串口调试指南
3 ^+ B* u1 H  h3 r- W
4 F( q; a8 \& i; {' N! q10. 一种计算CPU使用率的方法及其实现原理, Y3 \- c0 q& {+ |0 U

4 N3 \3 ^3 Z0 A( R: A6 G: Q11. STM32 RTC不更新原因分析
, u, h6 |4 D+ U. R
5 I/ K$ U4 ~  X: L8 P% C/ Q12. 关于ST库函数的代码性能对比0 M( V) {7 ?+ {

, W. I  M7 x8 M$ h; W! W13. 在IAR中实现通过将程序在SRAM中调试的方法
2 r, W) N4 k8 E2 W8 x; V5 z9 c& t! W. f
14. M95xxx EEPROM写保护配置
% E: Y3 D& n8 N2 v0 }9 Y
; t( q) W6 a3 O0 D* Y# c15. 4SRxx的GPO的属性
  ^) Z3 `) I4 W. Y+ l
* N! P0 E1 n3 A3 x. G3 f16. CR95HF的初始化步骤 4 u( `3 ^  j& p0 J

' L3 E' G3 ?1 G( _: b/ i5 m17. 电机控制同步电角度测试说明  
0 B: u" a7 Y" q/ U0 r( Q2 T9 `  p* J9 C/ U+ |* {1 s8 h
18. STM32+BLE通过 Notification与 Android应用程序通信的例程
* C+ [# y+ r. F7 ]" C1 J8 M: ?5 X( ?. y$ i
19. M95xxx EEPROM介绍! ?& N0 L/ U5 G3 S5 |

2 j9 _  C8 u6 N* Q% {$ k6 Z6 w20. STM32 DFSDM测量温度应用 2 B9 ^8 p* p+ D( ]8 l! V+ N
2 p5 U- [% b/ o1 e6 @. s( r" @7 ~
21.代码实现PCROP清除
- q) F$ e) l) T& V# j$ k1 S! O5 x/ [3 R
22. 理解与应用MPU的特权与用户模式# e9 W" r( b; Z8 I  P

0 X; L' c" B& [* H' W23. 用于电机控制单电阻采样PWM变形信号产生( s* @+ o: O( Q. S

4 m0 F0 ^1 z  B+ s) \24. STM32L低功耗模式唤醒时间测量
: M* c1 o$ R- ~5 y
0 S3 i6 {9 H- y, v- S6 F+ m25. X_CUBE_SPN7程序电机启动抖动问题: w; o5 G" G8 E1 o

- g+ R. u5 \' K6 x# W" J: m1 c/ ~4 e26. 发现STM32防火墙的安全配置# P) [9 _1 T3 C
  N, k4 e8 c$ H* K
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
  {) e2 B( c$ y5 r$ v( _. x$ E
" I" ]5 M% }: }6 l9 B, c* g28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
  i/ M4 ], m& x0 v7 M  k9 y4 P' N
* G7 e2 e$ q- S; i! m- a0 C( p
温馨提示:

* j. Z  i- {& b8 |' Q; l
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
6 s$ {3 Y' D4 R6 s* |# ]
: d  O' i2 P# Y# V9 Z

% U  r/ F2 y3 Y, v) o1 f0 ]6 K& \5 S" ^4 P+ s  m. W8 F
5 p4 W5 x+ n' I+ p5 K

6 o0 C0 r" }% B/ ?
! r4 \# |2 i9 l( u0 c& P/ b
6 H7 N0 Z9 g7 c$ e
) M1 ~9 M7 C! E: [& u
% f+ A: V- {! Y9 O* v6 V2 ~: V9 K3 E( t8 _4 F9 _+ S5 U( e2 H

评分

参与人数 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
好详细,多谢分享
- q; h7 l2 a$ m
5768340 回答时间:2018-1-13 14:42:54
HI  - t! K2 b$ X" @
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
$ o. E) j. J" x   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    . t# _, [" W. E* r% }1 y; W
  2. 函数名称:Cdfinger_Bspspi_init1 Y$ S- f' j2 L% q
  3. 函数作用:spi初始化函数
    # e3 C: W9 j' o$ [9 C5 j! R
  4. 备注:' l9 }' K8 B3 ]* {
  5. ******************************************/
    3 I  _0 x$ X3 i3 T  I
  6. void Cdfinger_Bspspi_init(void); j* S6 L& [/ d1 }$ K/ A) G# b2 n
  7. {2 j0 B5 }& F* J
  8.         GPIO_InitTypeDef GPIO_InitStructure;( q2 A# w( ]0 \# |3 |% b% H( ~% ^+ m# \
  9.         SPI_InitTypeDef  SPI_InitStructure;5 w# T) [- h" @/ L, F
  10.         DMA_InitTypeDef  DMA_InitStructure;
    / ?7 O7 C& z/ S$ D7 S  L; |. O9 Y
  11.         NVIC_InitTypeDef NVIC_InitStructure;+ j1 l6 U% k+ G! Y
  12.   / c9 }; Y/ F1 }) V
  13.         int ii =0;9 y" p# C$ i5 ~9 @! M8 ~
  14.         ( e% M; R" s) X0 T1 J3 t" _1 V3 n% V; i
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    ! U5 ^3 D+ m2 P4 Q
  16.         /*!< Enable SPI2 clocks */
      l" z9 P, ~3 b
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);3 J, E  I  x) l  i! ^$ E
  18.         /*!< Enable GPIO clocks */
    4 |# A5 t7 Y9 a. ~
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);- J$ X5 F& Z+ l' o. y) z0 M/ S
  20.         /*!< Connect SPI pins to AF5 */
    : j( r; D& \2 V3 ~- g
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    - n, [2 w, J: X3 t
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);0 E1 V2 Q9 h2 S
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    ) U4 I" J% H9 ~" v

  24. + v' X7 }- A: ~) L* X  g
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;- |; z9 P3 G) j( @; e
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; c: k  f1 S: u1 |4 c
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;: M2 b  Z5 j. Y8 K  j
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;5 A2 J. Y4 {& O. z
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    ) Y( \$ `: U$ K* C3 A
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    ! n) d: h3 _/ i( w

  31. ! C- `7 L% A! O
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    3 \8 ]' {% e% G) u- `5 }, i
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;4 k) |. Z3 T" V/ X  r% t- q3 y
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ( a: w5 Q1 Y# N! o
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;, S, _' ~/ {- _  X+ |, e" p  o
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;5 [' d7 A# i4 M" W
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);$ D7 `. F: U8 T
  38.         Cdfinger_BspCs_HIGH();
    * v. x7 L2 S. x7 G* @2 Q
  39.         //Cdfinger_Bspdelay_ms(1);3 c; _' X* n1 @2 J- M$ _2 d
  40.   //Cdfinger_BspCs_LOW();9 R0 L* {( H; s
  41.         SPI_Cmd(SPI2,DISABLE);) B( Z" I" ^& e* y
  42.         SPI_DeInit(SPI2);
    ; a7 ?4 h0 T# C$ e: J' B* c7 `/ i* L
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;. S' _# x3 s! a2 d1 H
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;1 o/ @) p3 ]/ d# W& i, ?
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;5 T! ?9 V7 L3 u# i
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    6 l( s9 X& t5 S" p. y" g
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    * v0 [+ f- I3 z4 w
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    2 a) Z! d0 c# L8 \
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    $ C$ @2 R. V8 M$ e- ]# t' U
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    0 h: F. f% \5 c) N# B  E2 s5 @. j" y
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;# T  ?! P4 I" I+ t" `; Y
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    4 q2 l0 V  O+ a% f" d; }& [; L
  53. ; V+ @, U" {  t. ~( j8 c7 T+ c
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    # j! x% K- s$ s
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
    1 c" c- T7 L; L7 w
  56.         DMA_DeInit(DMA1_Stream4);* X5 N9 ]- R9 v" ^4 U. b/ O) w
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    , R2 X* U/ v7 M( v1 o
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);6 F) z, `9 Z! B% U
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];
      B( r7 M( q* ^) F! s: T4 u5 S
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    2 N- f3 Q' f. Z7 v1 r  a! \
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;6 J5 O+ P: Y! k
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;
    ) C# m' B' M; o  c0 t4 g
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;6 ^: @; m4 b# ^$ B1 o: w
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    " I' f- I8 O) Z9 R
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;0 E6 p/ x- T4 }" g
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    $ ~. j; W9 I9 n3 [8 T& i
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;% E* ~0 A8 A, m/ e
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;5 k0 O3 x4 f) _# [1 F4 `6 c6 V! i
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;) n9 I! g7 X8 L& X# G/ W
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    3 j7 T- T1 B2 Z2 U7 D
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;+ o3 D6 ]. p% T1 z' m5 X
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);+ k  n- t& ?& \8 D6 C4 T' e- m
  73.   " ?6 X  b7 R7 I
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/, |- q4 B0 y7 ~7 |2 L2 V
  75.         DMA_DeInit(DMA1_Stream3);
    . g+ U8 ^& c0 ^7 |5 h
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    ) o: v0 a5 {! l6 r+ X
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);$ W3 s* ?7 _8 y
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    . o& b% G# M) U1 F+ S* u
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    # V4 \1 `3 t$ v& ]0 a, E2 n
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;7 a; V$ ?) t& b" x/ o% s2 B1 x; f2 u
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;# f4 J$ Z7 R7 X5 G3 F
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;1 ^# Q( A4 E5 b7 c; X* N- u! I
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;3 P$ y* u7 \! z( Q* M* O
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    ( c0 n/ V3 \/ i4 `9 d5 {, \
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;  s0 O* Q! t5 u" g7 W$ k% B
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;1 |3 g2 ?5 i8 u4 {0 C
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    $ k" o: f* V* h" f
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;8 F0 y; |+ k, s& w# h/ z
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    + L4 z& I1 m6 f3 H. ], u: s: S
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    4 P8 U* ]3 z3 l9 ]! M, V
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    & B5 c+ L$ |8 [
  92.         //Cdfinger_BspCs_HIGH();
    % `/ i2 l- ^  a
  93.         + a* N: Z  _3 [! ~. K2 c/ b
  94. 8 x2 Z0 [, B6 y7 b! s
  95. : V1 x% d/ Q/ F8 v1 Q6 b% \
  96.         //发送中断. P# [! ]9 ~; U* x9 y& _
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);4 w1 P7 m# d! s7 f9 A
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     . l% e9 M3 H4 s3 I0 C4 z3 [) U
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;5 E/ m8 ]" ~; Z/ X5 B: r
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    7 ^5 a5 i9 a+ x% W" x4 T5 f
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;+ O8 a1 H6 e4 [) ]% x
  102.         NVIC_Init(&NVIC_InitStructure);
    7 M: I/ ]! [: U+ s, r
  103.         $ S: ^8 n$ Q: ^
  104.         //接收中断: w0 k" C+ h! N, }6 Q: w
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);! {" Z4 Y6 N2 t
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     ' J7 R4 f/ X) v* h; W
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    " M9 B. P8 ^. p$ A" {
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    ( Y9 D+ ?; v; F% k# Q2 r
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;9 E- y1 u7 F% A. ?5 p
  110.         NVIC_Init(&NVIC_InitStructure);
    + P  F% p! _! ^) u4 [- u/ M' \; X
  111.         SPI_TIModeCmd(SPI2,ENABLE);
    # O8 P* g3 W; n9 v: Q
  112.         SPI_Cmd(SPI2, ENABLE);1 ]0 C# Q8 }) t- u) f! o5 |
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    . q9 D+ X& x. `9 q9 ?
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);+ @1 ?3 W0 ]9 r7 [  [

  115. 8 q5 [  c! T3 ?$ L' i
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    / |0 F& Z2 [5 s2 {' Q
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    9 t0 \7 G* Z' u# V
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    / x+ s' T$ l$ ?# x0 n" R
  119. ' w4 |7 G# i- W4 H) @& M
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)9 x' C' A* \7 w2 t( b0 x0 K. t
  121.         {  S+ }0 w( m& ?4 ]
  122.           if(ii%8==0)6 \) R* C' q; }/ ^; R
  123.                 {( Q5 d0 L, c4 v) N% K$ P/ D( D
  124.                                 printf("\r\n");
    7 o4 k. t5 W) t9 \9 y9 X* C
  125.                 }
      y3 Z3 i0 j# {; k- b% J
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    0 E( K( g3 ~6 c3 T5 _$ B/ ]; o
  127.         }
    $ V( b+ r0 g5 M/ o, L6 I
  128.         printf("111\r\n");
    $ X2 T/ [% ]) n: i9 j
  129. }! D% X7 C: r! t, J( o+ D
  130. ( K$ b' f) r5 c2 C8 N- Z( L

  131. : r9 g  F+ R" x4 u, P: d' D+ S
  132. void DMA1_Stream4_IRQHandler(void)7 c6 D& {: E* _6 ?: L
  133. {
      B! M0 R0 j0 T% a+ }5 N9 q6 T
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    ; x8 `: w, {0 F- x6 q
  135.   {  R! P/ V8 k) w: `& I
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));) I6 C$ ]  K2 J1 c7 U
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    % b# }; E, c8 @8 ?( _% q
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);% ^  C. r7 r% P% {
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    9 X, s, y2 f  u$ v( _. H* c$ i
  140.   }( F. O3 d% O6 Y! Y) N
  141. }! A1 v5 l/ Q& r$ R$ c4 y5 P. F

  142. 6 i8 T3 Z" l( N7 H8 G0 ~
  143. void DMA1_Stream3_IRQHandler(void)
      u* X  L$ b! H8 E* U' C3 M. I, ?2 j
  144. {6 c* a+ m. f; @2 R- \. B
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)9 w2 `3 W# C, x$ n- e& u- `
  146.   {
    6 g- l+ M! e+ E& C' t! u
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    3 L3 ^% R$ j; o. f
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    2 w1 T; u% a  }1 [
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);+ }5 [6 ?7 r# `/ d1 L/ S; \
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    ( F! o9 T" E% O' X
  151.   }
    3 P: w: R( W( o; j- S9 V7 @
  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的波特率是不是必须为相同的,才能正确通信& D, A7 W3 p( L1 }- a( }5 ^
以下是全部代码:
5 W$ E! `( Q3 g; y( S6 u0 G5 D#include&quot;stm32F4xx.h&quot;
& N  E+ `+ }6 {$ u& g4 Vvoid RCC_Configuration(void);, ~! V7 r( Q2 l1 Z0 B6 C
void GPIO_Configuration(void);
: T2 `& l8 k4 e8 B% w* Rvoid SPI_Configuration(void);
2 `! Z8 B' s" ~void Delay(int nCount);
/ K3 N; f( S- M! ?) O( Zint main(void)& F4 e. d/ b: k5 P
{  RCC_Configuration();7 h- F: w( n9 u7 g- d+ R
  GPIO_Configuration();
9 ]% B  {$ P/ S8 @3 C- S, V  SPI_Configuration();
( Z$ f5 P( ~: w/ d& M3 E while(1)- }  N+ Z  n9 q# E4 J1 J* L$ Z
 { int data=0;2 |4 \3 |  ~' ^* q  W3 [; h& P
  SPI_SendData(SPI1,0x55);7 H5 k6 [2 x( F; \7 S* N
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 8 s0 S6 P, A5 F7 B+ Y( ^: n9 c
  data=SPI_ReceiveData(SPI2);
; G6 a% r# R1 B2 P$ z3 s  if(data==0x55)
9 L# D8 P2 w: X! v" F6 h- C     {  while(1)  K& e, ]4 _2 l# }" j1 X& A
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
" I1 S& P) f+ S, R! m5 K( h                Delay(0xfffff);
" m3 x) E: j% v                GPIO_ResetBits(GPIOA,GPIO_Pin_4);: F% m3 a0 w2 e+ F
                Delay(0xfffff);
. a2 \: Q+ }- e5 S2 t   / G1 n/ [# \( l. _& c; N  J
             };7 h4 M- l) A9 ~! |1 f- d' H
     }3 l% O! @9 y. h5 W* c" H& n* q
     else while(1)
$ o1 \2 Q2 P6 S/ v* o            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);! N. U' b/ F. e! D
               //Delay(0xfffff);
4 o$ j  V# K, Y! E4 g% ]               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);7 y/ m3 d" H* |! @' j0 e
               //Delay(0xfffff);" i, m- V+ G! l- P+ i
  
: q/ y+ _/ A. s( a            };
6 d8 j) {4 B7 H" m" N: U/ o }
3 w  A4 p8 n$ v; X}
2 O- K- N4 x$ p: uvoid RCC_Configuration()  _6 l$ c4 M# r5 o. z
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);; x) F/ X4 [% L# t( V
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
: j( Q4 c- G! L& o" j) R  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
' R8 |$ `' V5 a$ O- r- N1 {}
7 U0 F. Q+ O! Q# u- e) Cvoid GPIO_Configuration()
9 H  ~' k2 W' ?{  GPIO_InitTypeDef GPIO_InitStructure;
" [3 }; b( N2 L* x7 l  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;& B, ]9 r, {! [3 i6 A1 u; C
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;: D) P  D! C: U
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
) B0 l7 e. |  L0 k' J% f  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
; n! Z/ w+ R9 y/ o  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;' K' ?7 r) s# p! x( K. }, l3 ?$ }9 o
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);5 b' Q) ~; x& H; H; t
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;9 {: ^% Z/ m2 \& ?" D8 P* X
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
8 V6 e0 U- [3 ~( r' e  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;2 W4 j. s9 }* Q! o
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
+ B5 k7 r( f+ Q0 @: e5 [+ W1 o* {  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
8 ~4 }/ e% _" s0 ~/ O$ o  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
7 ^; s8 w, ?4 V* u2 u  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
6 ~! t8 r' i/ i6 U5 }- m  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);' F1 Z1 z( v) ~$ j1 b
}
( c; p9 ?, o9 h* s* @* [void SPI_Configuration()
6 ]# y8 K/ x" d' J+ M{  SPI_InitTypeDef SPI_InitStructure;' }. K" `5 `' E/ a0 A0 i
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);7 Q- e* n% v6 s& A
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
# m9 ~* V, x3 V9 R# O  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
7 v& Y/ X8 @! Y# v$ }9 r   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
7 @" O3 x0 Z. a, H2 \  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);" i! z1 ?7 W$ p( ]) {' }$ I
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
& n0 Z( A" r' T0 ^# u! m. W( x0 P/ l  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
, Z8 S" }1 c1 A; l. g  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;& A! |& Z7 z! E* a1 I+ Q
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
0 ~& [, q6 t8 w5 M3 O& h  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;$ ^6 v: s4 s9 R9 \/ D
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;5 K+ D6 Q; Y+ y3 O; n
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;! K3 L/ r8 H1 Y) S/ @8 Y
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;* a1 F4 I% @1 ^% `2 G1 {7 D
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;( ]6 W0 B+ A4 N7 S  \
  SPI_Init(SPI1, &amp;SPI_InitStructure);6 f/ B" E( ^- H) L% w1 C% N: @
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
1 x# A- h3 [4 v& o   SPI_Init(SPI2, &amp;SPI_InitStructure);
* {- n* J8 p- G) Z4 e" o   SPI_Cmd(SPI1,ENABLE);1 K# y* E, P- P$ j& Z# ^
   SPI_Cmd(SPI2,ENABLE); 
9 W) ]6 Q+ h  p  ^( i3 z}6 u+ F6 z" `/ B2 T$ s
void Delay(int nCount)
+ _: E' l& s$ k. w. M{ int c1=nCount;
3 ]( Q4 j) P: b4 S8 x" |- t7 `, s$ S int c2=nCount;! A- h0 A: k+ z. I! G# M
 for(;c1&gt;0;c1--)+ S- G4 t7 u" y0 h5 M* V
  {1 T( j, q# [9 J9 u' }' _
  for(;c2&gt;0;c2--);
. h2 |+ ~, \# k+ A" V };
" k% O, _$ s0 z& ?9 M. k}
# [$ O8 ~6 z, _先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:
4 N6 S3 x% P# e3 t楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
' j6 D  q& W  q- }  n以下是全部代码:
; X) \3 o" T/ v8 ~( V) D* z4 ^# C" K#include&quot;stm32F4xx.h&quot;
5 z# P( A8 i+ s/ d- r8 `void RCC_Configuration(void);/ d1 y2 U) o4 d2 V* v- f0 t
void GPIO_Configuration(void);) ~' y( a$ W& B; Y
void SPI_Configuration(void);
( n; A6 t; [) D/ @! zvoid Delay(int nCount);
) t0 e1 j) J$ c5 Gint main(void)0 f3 ]& Q! V' o' ?
{  RCC_Configuration();# z5 e' \) A; I: b: q7 N( c. L( {
  GPIO_Configuration();
' Q; R) w- @! M( l3 I  SPI_Configuration();- d* [/ w; |6 s8 z
 while(1)
* t) J/ F+ [8 R6 Z1 T6 T { int data=0;
0 ]* N8 J+ [1 D$ n& k  SPI_SendData(SPI1,0x55);
% D5 I. ~3 X. [1 ^1 n8 C( M  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
1 h: R8 `/ o5 s2 s  data=SPI_ReceiveData(SPI2);
2 U; L: I6 w! N/ _* E  if(data==0x55)
& c2 [' ?4 C- N* N" r* H2 `     {  while(1)! Y5 A: A/ m) ~' u5 s$ d
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);; V& `0 X3 C9 n) v
                Delay(0xfffff);
7 U0 I' ^+ Q: O3 ]; |                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
: l6 u4 j% n) Q% q5 N! H! i                Delay(0xfffff);0 s) }# `8 M; k( J4 ^
  
+ J8 B2 f3 f" r' X1 S- n2 z             };/ f" U+ `$ w. L/ d
     }+ k' ]( x7 n- [$ u
     else while(1)4 ?+ H% c% S: j7 {  G" G9 s1 e
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
6 [8 ~- Q# C  _0 Q: O: x               //Delay(0xfffff);. f8 d6 g% O, F" h+ D/ k' W
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
1 Q0 I" o: b) H+ P) L               //Delay(0xfffff);/ D0 Y. |5 n4 A5 O
   % H' [3 o3 T2 g. L
            };# [0 t4 b: X1 V2 }6 Q
 }0 e) [% k! D! V. F  w
}5 ~3 t4 z& F, @2 D+ ?" E
void RCC_Configuration()5 T2 i; X  |5 J! o" U
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
! w6 M8 d  @1 J. K. }# w& g  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
1 h; Q  b- o8 ^! m  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
1 h6 y4 _: J5 ?+ j}
) u* }! j) s5 Y: z7 U- x! \) b3 xvoid GPIO_Configuration()
8 l1 r, ]( N  i3 g{  GPIO_InitTypeDef GPIO_InitStructure;% ~3 c2 t% i2 G& o0 w
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;* Z( Q' r! ]3 I0 Z: S; h1 U3 o5 z
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;' B0 ]% D3 I, t! J
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;# l1 q6 P. a, `1 X: u' h
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
& ^+ k' n; C  Y  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;% G4 l! ]% s2 A* @
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);7 m9 ~+ N+ v! V
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
. a4 z, V$ f0 Q) U- ^+ i  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;; N1 s; C; u1 t: X( h
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;/ q  h( G/ o9 U; {; E, t
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;+ s- T) W7 `) B
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;) z9 q7 q9 \5 c+ T" r+ D
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
- S( L; E0 v3 Z; o8 i+ m7 N  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
& s# x' E+ i: E  Z: \  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);) {% ~, ?6 |- F& b4 O
}1 A: Q" Y) R. w& ]* I$ ^! U
void SPI_Configuration()
" k1 i; O  F2 t- f2 q5 w; r{  SPI_InitTypeDef SPI_InitStructure;  w4 E+ {" n9 a) H
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
/ D7 \) e* q8 }  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
5 X2 N6 f' Z$ |  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);6 k7 F2 q. ]; H& K$ ^
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);8 q- E/ T  |# Y  x3 W
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);5 U/ A' o* T7 _! `% ?2 C1 C& [
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);# b: N: y' I" x. F
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
: C9 o& u9 L& ^" y9 j  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;# L" p6 P3 r: G5 p
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
" h3 U" d+ Q% x7 O2 c$ A  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;& T! n7 M6 o5 C; S* l  J7 H1 n
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
( E+ m+ J, K1 S  W4 R  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
* S5 n- Y. q2 \   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;& y- k+ Z; a. ^# f& C7 C
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
. U+ k& L4 D: J( e  SPI_Init(SPI1, &amp;SPI_InitStructure);
1 H# P5 x: {; V2 v8 Z  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;- w5 o* g( [+ v! @
   SPI_Init(SPI2, &amp;SPI_InitStructure);# ^2 p5 L$ C: c! d6 k1 v5 X
   SPI_Cmd(SPI1,ENABLE);
% J- f$ }" l0 P9 l$ k% L   SPI_Cmd(SPI2,ENABLE); 7 ~6 Y& J8 ]& Q( |
}
- n/ a- m3 [2 G9 }( y: Bvoid Delay(int nCount): g/ c* m* f2 x0 t# j& [. q7 [
{ int c1=nCount;, h" I' I% s0 a6 S# B9 [! b4 F
 int c2=nCount;. ]" s+ o5 ~, m3 \" S
 for(;c1&gt;0;c1--)
. b, X: d& F/ `: W/ q  {
. N' j9 u7 v' @+ w9 i& m+ a' a  for(;c2&gt;0;c2--);, U( E; l5 ?7 n; f# t
 };& I) M2 p3 U# y, ]$ T! J
}
1 ]+ |) T+ t$ X( e先谢谢了~~3 v9 d; i  ~% ^' s& Q$ m9 s2 J
 , O$ V! o( d! ]
7 m" a  H: q+ i, O. \
楼上的问题,看我帖子给出的提示哦~
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 b, |4 u: ?! \4 J' c
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。2 q* _1 Y" _- |0 o5 L
 
7 z$ r+ g. T0 h, P( A$ ~
+ x2 R( M* \. N- p多谢支持!!
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 运算效率不高

  
" W0 ?) E8 T( S+ x鬼魅一样的Hard Fault
3 M2 R+ e8 z; h& f- d 
+ ]% Z  {$ c7 X5 i* g该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
. n/ X7 E/ h( B 3 o; y6 p3 R5 K) B, a$ r
咋解决?
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 手机版