请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表; j5 B9 h& Z/ W  S; k
8 x. A: s/ N8 r8 {$ j

; w2 u( s+ u2 j2 n社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。; Y. F4 a/ r( {& D4 S) w
9 r- h& p. t1 h8 R; b
提示:点击各主题,进入帖子,可下载ST工程师解答详请: m, {' r( C  s

# A* m: ~4 y* [1 A8 D" W
" s, e" }( C) Y( X; B+ C- R; c5 F. `一、通信接口
$ B+ I( o, P+ ~) l" K0 H: Y
% u3 K8 c. u% X7 K1. STM32F2x7_Ethernet(FreeRTOS)驱动更新' g# |& M1 Q6 O6 x2 l

. ]) ]* T5 L5 q+ ?2 R) k2. SPI 接口发片选信号导致死机
# f/ X6 u6 f/ T. i ) Y2 C9 t& x1 n4 H3 s
3. USART1不能设定600BPS的波特率
" k* A- A7 L7 w, V7 a3 r
6 M+ I+ v( @4 J0 Q. S4. I2C 接口进入 Busy 状态不能退出8 ]3 w# u' k% x$ M
' t! {& }! z) L2 v
5. 对 Flash操作导致 USARTU接收丢数据( D, P: t; F, J$ Q4 Q! U  J

+ u: @7 `! {* q- `3 M6. USB接口易损坏4 `7 p1 J+ ~$ g$ V2 f: X8 h

% g7 c; |5 y9 ]+ R0 M# W; v$ p7. UART发送数据丢失最后一个字节1 O( ^5 w( B. x9 O6 q

$ o+ m$ \" \  \1 j8. 使用 CCM 导致以太网通信失败+ I" a2 C1 A( w4 e" v5 Q

. d8 z* Z" N6 t5 M$ {+ E9. SPI3 接口没有信号送出
  K" F. P# e% f1 T 7 x" g3 w* _$ l) F
10. 时钟延展导致 I2C 通信不可靠
; k1 J. D# b" t& c: Z( j
4 b' ]) P% p: N+ q; ^, e11. M0的USART波特率自动识别问题
6 d; ]- D1 E, ~3 I0 b' E 4 ^" M9 V0 b) p; {
12. WK15 OTG做U盘主机兼容性提高' `% k$ M) [1 e. ^

! H8 b- L2 z- D  {; k13. 以太网电路设计注意事项& q* ^( N7 E1 E0 S! g
/ W. \+ E+ }0 t9 L
14. OUG主机库在BULK传输上对NAK的处理
8 Y( t" T6 X+ p& Z) Q1 \" n 2 c6 Q8 U( b, T7 k3 O3 e; [
15. 串口断帧检测
: s  m  H8 [( F' `% `- v" S5 o
- K! k, n+ Q: d2 y$ b16. VCP例程用于数据传输时丢失数据的处理: k7 A3 B6 v' X, r

* c; M( {9 H( q* I5 N8 T17. STM8L051F3P6串口UART数据起始位判断的问题1 \: O0 |7 e- e
* S( S, t  P7 o, [5 {
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号
( }' O) l' }, p2 d
- S- t$ n7 {0 f+ V9 E8 p9 f7 P19. STM8中UART奇偶校验的使用方法
! z0 O: f3 I# i1 ~8 I' v
6 j  C, w/ T9 E9 N20. STM32以太网硬件设计——PHY* ~* ]( s% U, I6 p
! |; f& Q8 @0 O; a- D
21. 一个判断I2C总线通信异常原因的方法# T/ q4 g9 E; k; h
5 B6 _+ F+ t+ K2 _& O
22. USB device库使用说明+ f, [  e' n" _* C. \
' k+ a1 ~* f$ [4 O) }
23. STM32F103上USB的端点资源8 z& R4 z( K& n, w: w

! W9 Q+ H) o( T. ~  r) m. \; X24. 使用CubeMX生成TCPEchoServer程序) B' k" H6 q/ n5 m) X/ |0 Y# Y
: Y2 s/ A6 x  ?7 w# Q
25. SPI接收数据移位
) b+ W  `* w, [5 R1 e- E
: [5 |: P1 y& k! U) t7 O26. STM32F0中Guard Time的设置' n+ r2 y. u6 L
0 G9 N  U+ u' ]+ e
27. LwIP内存配置& z, `" P& M% G/ p7 N

( D) o( h0 j( g; Z, T- F28. STM32 USB Device的简易验证方法
! |; E. }9 o+ _/ _- w+ Y0 I) S0 `. G' h% D) m; x
29. USART 中断方式接收无响应问题的一种情况及其处理方法
1 s6 n# e% E% p; y% J: W5 \) m( i. G$ P* |, N0 E% @
30. STM32 基于 Nucleo板 CAN总线的建立
' b/ g7 m; c" _% A6 S8 V2 d4 |# }& |0 a1 P
31. STM8 CAN总线的IdMask模式的讲解2 h1 v9 D" h4 r) N% M# _

. W4 @7 _3 n1 j: o0 H( o, B32. STM32F746ZG USB 驱动不正常
! c) t8 Q) o% ?5 v" ?+ p- }( g% n3 x! E! N/ G1 D! p7 v+ B' U
33. MCU在STOP状态下通过UART唤醒分析
0 B3 l8 e' w, p
- Q8 [1 X8 P4 K9 O* G3 K8 H34. 通过STM32CubeMX生成HID双向通讯工程
( B' R" B  E3 y7 j$ H* D$ A! v1 j$ [) O- T/ T8 v  @% V8 h+ C! E
35. 串口工作在DMA模式下有时接收异常
, C+ R  R7 X* t1 k- j+ F$ |
: ?9 N% z' y, O8 g, f9 S36. STM32 Bootloader中 DFU使用限制3 Y: x" e0 Y9 d3 Q7 O7 m  V7 ^
2 X8 `) T6 W  b
37. UART异常错误分析
+ z4 n5 b! x# c/ Z/ R+ A/ R3 m! d5 a6 y3 s6 P; v$ ]6 K# c. a
38. 基于Cube库无法检测CAN2的接收中断
/ w; x# N" C* C. Y5 L5 z6 p) O& ~$ m' ~/ T8 Q4 ^
39. 基于STM32F7的网络时间同步客户端实现
. o6 f; M2 }; q
; Q8 k) V2 j. B, P6 w/ U40. HID与音频冲突问题 & g! `# o, Q4 ~" g' H

* i% j) h" [9 K/ H" Q0 f7 j41. 在进行USB CDC类开发时,无法发送64整数倍的数据
+ ?& R& J" k" E  m0 ~/ `. s
( b1 ^# a- u4 ?* i) s42. 从零开始使用CubeMX创建以太网工程0 ~8 O' F/ d* x9 E! N
- ?" S: I2 O2 e0 T
43. STM32F4xxx的I2C总线挂起异常处理  d1 f7 R* E; X, u$ V

) m3 F  F0 T# f5 H44. LPUART唤醒STOP MODE下的MCU  I1 y1 w3 v' y
* Y  U6 H4 @+ a% D; y( U+ R
45. STM32系列 MCU模拟双盘符 U盘的应用
6 Y! `! _5 [3 y/ e  ~- u2 y! a' m2 X( H# u1 W. t! M
46. CEC输出的数据和数据长度始终不匹配
2 j/ a) o* e, t/ L- [% R) G% [  `% e
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
3 ?- u5 E( H7 q) {8 D, T2 t. s% e$ t2 m2 O* Y' M! _
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续), t* A2 D& x- X2 [5 u

/ \5 i! A% c( K+ }8 M0 m/ H) \49. 增加UART接口应用时的异常分析! \/ v7 b9 m4 o

1 k2 R5 H4 I: i5 ^0 i. ^  Z50.UART应用异常案例分析
2 D5 \( Z9 O+ b! o" d; ^( n* d' }
' {; o4 V* W$ c6 |8 t; _51. I2C配置顺序引发的异常案例5 `2 V, b0 S- c4 A% w9 i7 i
& ~9 ?$ _- b  p3 r( k: ^6 [/ @
52. STM32 USBD VBUS GPIO
1 Y) a6 G5 w& V% Z0 p3 O0 W  e9 g; R% C6 m) \
53. USB传输数据时出现卡顿现象
1 ~% F6 ^; i/ j2 e1 c( T' d
" D' m8 a- {. ^( l54. STM32的高速USB信号质量测试实现
3 r  k5 |* P. o
+ J" r, e  a, B3 ?55. 基于STM32 I2S的音频应用开发介绍. W3 y3 h8 x8 q8 Y" Q/ M5 e7 Q
- w6 i6 @- y9 I
56. HID_CDC复合设备在WIN10的识别问题  
) v; U% @- d7 k/ W
4 Y# [3 p' \; t! h% s+ `57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  
' z# ^0 k: a+ m( e0 h5 X, C4 [8 ]3 `& E* r
58. 一个关于LPUART输出异常的问题分享  
1 Q0 q( @5 Z4 e. H8 z% E
" O1 i# R$ V$ n1 Z8 G: G
59.通过 DfuSe 工具控制程序跳进 DFU 模式
& |# r+ C. M' h; r
8 U- ^, R& B7 ~+ ]) o8 J; L2 @
60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)  M1 j& |, k" K6 l- O7 a

, O: [$ i- F8 |, }. w0 Z5 @61.一个因初始化顺序而导致异常的话题 (2019.12.24)8 s, M5 K' a1 w% f8 Z  @  d3 d& F

5 C. S3 X, ?1 I6 G! S62.MC SDK 5.x 中增加位置环 (2020.5.29)
' z( m1 Q5 r' k: i( G5 N
: W: `8 S1 A6 w* Z1 l; m! I
63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)- L( _5 D6 y( C

/ S: w8 Q* u. v64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)
' M  z! k9 X1 S, o$ |2 L' S/ [1 l! n
二、电源与复位
( K- q# d& k* z . X" t. Q7 ]$ m$ m
1. Vbat管脚上的怪现象4 s  N- l1 m. b& _7 x( d
8 |+ E7 r+ m& v: d# s: N7 Y
2. 上电缓慢导致复位不良
2 x+ O+ f5 u* P, Z, G  U 7 s2 m4 ^2 i4 w9 o$ s. D
3. 关闭电源还在运行
8 o  c$ m8 X7 {/ w* F  q
( R  t! i# x- h9 o+ Z" V4. 使用STM32 实现锂电充电器
) J* `' o2 v9 `& C8 k2 p 5 c* q( u) g: x7 c
5. STM8L152 IDD电流测量
/ M% Q' j% Y; x
. ]6 A$ F0 P# B2 k, m6. STM8连续复位问题6 p3 Y& P- A' D0 T( g& J
! K: x9 E6 W* o. Y7 A% Z
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
& g: \  i( Q7 E
  X4 `5 B  P/ n  V; }8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流* U# R5 J6 ~% u" a* b+ q/ I% D$ Y

& b7 Q, R* @5 f9 C" i/ S9. STM32F7与STM32F4的复位序列比较
5 U1 f0 {" y7 P; F5 |  b( h' B
- x9 W4 @0 }% p3 G  x5 G/ S10. STM32F107 复位标志问题 : H! @) c7 W1 Y3 t8 d

7 \( S/ _7 \" H' a8 x" U7 o11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  6 K) p! g% q4 E

6 w7 k' K1 @8 k  f. k. O! s, I' F+ L 12. Nucleo_L053不上电也能运行
/ V" r: @0 z/ ^
3 E( N; L! L0 @. }% N8 Q% Y13. STM32L4中STOP2模式下的漏电流
- f+ \6 B/ T* H1 R. [2 P, E
  {3 N. o* A' f( G14. 在没有外置晶振时HSE_RDY异常置位
9 s3 @' s9 Q4 l1 x; u" g% |* k6 H3 x5 i0 T# Q
15. FLASH被异常改写   (2018.5更新)2 e9 ~/ |, U; o% T+ k7 |
* K4 `% j2 g5 f6 r9 E
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)% ?. Q8 z& g' L; r

6 p+ `9 ?! j* o* v- Q- }7 w; V17.一个 STM32 芯片异常复位之案例分析(2020·2.27)' E8 U& \5 X# A3 e( n+ w  t+ \8 Y# M0 l

6 V1 ]  R' k  _' Q! G- A三、IAP和Bootloader$ R$ ?( @1 c/ `( f0 v; |
: J2 q9 R7 a" K0 [* r0 j
1. Boot Loader与上位机通信不稳定
8 G( v2 b% W" s) G4 R+ I3 ~ $ Q2 A' b+ a# N; M1 e9 Y9 @
2. IAP+APP 模式下不能启动 RTOS- y- t. q- P) Z" W
- w; `5 P8 M$ ~! L* @
3. 从 IAP Loader 向 App 跳转不可靠7 V8 s  ]0 L! x! s6 B$ h

" R  y; {$ c$ c& e: w0 J4. STM32 MCU IAP例程跳转到APP代码简要分析0 L; @3 L& |" K$ X% z

7 q/ q* P1 h% W7 z5. STM32F091从自举程序向应用程序跳转的问题与解决
( ^  F3 x: y9 S9 j: j% e" K. P4 V* t  g) R" O$ d  Z
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码* e7 [2 B9 [% a6 o- }9 `! q$ i* f

1 }8 n; d' p# o* s" ]7 T7. STM32F0启动模式相关问题探讨  @! @2 V7 |  h
) T8 Z% ?6 j5 V2 e4 h4 c; D$ R) d' Q
8.STM32F091空片使用System Bootloader下载代码5 [! y# L" K9 Z6 g6 P8 u3 k/ o

  [) m0 j9 X  u  S9.STM8L  IAP 应用程序中编程指导% D% ?- F7 ~. ~$ e' [
) v0 v! |% x2 i. a, r, j7 k4 o
10. 如何通过STM32的串口实现简易脱机编程器
8 @2 p$ B2 u- V: s+ A( n& ^4 Y- s9 D+ W4 e5 t# c% W
11. 一种从用户代码调用系统存储器中Bootloader 的方法  
1 H) V+ G8 B5 o4 h+ R6 i% h% [5 S( o. f; K) `8 M
12. 利用 USB DFU实现 IAP功能" D  K# I( I8 o; Z2 n6 [2 l$ B6 o

% N+ Y7 m( U) y$ X9 K0 E  M) v4 W13. STM32 Bootloader中 DFU使用限制+ T, `+ T, s) ~: e

* S+ E% A* v! F0 G* {14. STM32L011x和STM32L021x启动模式注意事项
! `1 {# r) i4 `0 N- k* }5 V$ F: P1 |0 Z1 {2 p% \6 R
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
4 i9 A: x9 e) C& e. H% L4 a# g( M/ y
1 S1 ~  w- g' n6 R# F: ]( T4 M/ M16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级   ~& P2 o9 B" a* y. y7 Q

# _% i* z' A7 \4 L17. 如何使用STM32NUCLEO 板来测试串口Bootloader
# l1 F. B; s( K& j1 g. f- o  B; ^% n# \# E: z- S: D0 H# ^
18. 在STM32L011上通过I2C接口实现IAP
( D0 l7 z& g) J1 d9 _* p. K/ b* T& ]4 d
19. 在IAR中实现通过将程序在SRAM中调试的方法
: y! G( ^  S& T4 f: k0 c6 [' q/ n/ g0 m: _5 l- L6 h* j9 W5 F
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题% R( N" i( r) G% Q
5 O* Q& |$ I( h
21. USB DFU IAP 例程移植的两个话题& a0 q$ a$ m& V
  V& T% S+ {0 M" R  t' f! v, |
22. STM32F769双bank启动
5 g3 ?/ u% [3 ~( M6 i" r! [# S' v3 B9 s% L
23. DFU加载 工具 DfuSeCommand的使用+ y/ i; |5 w8 r6 V8 s

  I( G5 M: J$ M' k/ }24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
, z+ u; J- ~5 D/ P6 ~. L/ A
) e5 \! h0 Z) i0 F" H3 @' w" _; X25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)3 W2 e: }4 s2 T' e4 H9 S5 ?6 p
+ K* ]9 [1 d: e: _' c
26.STM32 Bootloader异常复位案例(2019.4), A1 d. f% h/ `$ F: Q/ V
% u$ Q# c' D$ z0 u
四、存储器) b( w6 ]* r. q# z: Y# F3 Y  `

2 i, C/ e+ @" V. z! a! {1. 对 Flash操作导致 USARTU接收丢数据
7 m1 l3 _& m4 b' ?5 i 1 H4 d+ O' @' ]) }
2. 使用外部 SRAM 导致死机
2 v6 g) @- F: n# [7 z3 z) R5 e ' z5 k' p! h6 t7 K
3. SRAM 中的数据丢失
; d  W8 ]( d- r3 [$ B4 E ; n  \8 ^. U' z1 x  H9 l
4. 干扰环境下 Flash 数据丢失  e  q% L$ w- E" d% s. |
3 b2 E4 q& [; y# n6 C' D# e: s
5. 使用 CCM 导致以太网通信失败
" ~. F  o* a) F& d+ @6 B: c: H9 A
' C2 o' M7 [7 f: L, N- C0 X7 z6. STM32F429使用外扩SDRAM运行程序的方法/ \+ v/ |1 W- T9 X

7 N0 o6 @8 o6 s  `7. 使用STVP实现对STM32L1系列EEPROM预置数据
+ g$ {3 V: v( _, E" Q  N
6 w6 I' e) j4 D0 G' v) \( `8. FreeRTOS RAM使用情况及优化方法
2 E8 |2 C: ?0 b, k' @. O( Z
" r1 C: Z2 X" L( M" w; M* L9. 在IAR 6.5下如何将数据存放至flash中
  l" l% ^& O9 T) e
/ e1 f! I( M* o/ ]$ \( x) F* H10. IAR下如何让程序在RAM中运行9 Z. B1 H* W( A  z- Y

! A/ H& O2 ?: }11. RAM上电后初始值问题
7 F) R  ]( L$ V2 F
6 Y" d! {: m6 o" @/ ~( {% d12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
7 B9 r% Q  q* k2 x1 C% u# B6 q- m
13. LwIP内存配置
* y) {) v$ G: E& _: t4 q# x+ l/ d$ U/ y% ~6 G5 H: D8 K
14. STM32F2高低温死机问题
: Y9 @2 t+ e3 ~- H# Z2 r4 X0 _/ h, m: B
15. 使用STM32F427的CCM RAM时遇到的问题5 P0 b0 ?3 I; l. `0 C' S# v4 z4 q

7 j2 C- u# n1 d+ @, {  v16. 利用QuadSPI外扩串行NOR Flash的实现  ( \- N% [6 ?2 M

, v% g: w$ K, a+ v17. STM32擦除内部FLASH时间过长导致IWDG复位     
; \/ N( `) |- {8 M8 B8 U* e; P: C5 I% g) |" J2 w# B" g

1 V8 U2 W: E6 x# N% ~  C/ f* ^18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)9 C0 S1 R5 D$ P* ~2 {1 Q
1 _5 b1 Z+ Y6 V3 {( X
五、模拟外设/ [" c; x7 x, O# \# e
7 X! h! W( K$ k& c
1. ADC对小信号的转换结果为零6 M9 R! l9 p! B8 R

5 n2 z! f& J; z% Y, b3 d2. ADC键盘读不准6 G7 ~# I% H8 r% D( q

8 K( I4 q8 S% E# H2 Q' q5 N3. 扫描模式下 ADC 发生通道间串扰  x/ z0 q+ t1 k; d8 }  B

4 `" p- Y/ G% `+ `7 U$ y4. DAC无法输出0V的问题分析解决
0 {' `# Q" }# _2 S1 a0 D
' O7 g, r' N% \  L5. DAC无法输出满量程电压的分析解决/ n3 n: |! B. P/ a: O  N

/ k9 k2 t+ V' ~- A6. STM32F30x 的ADC 采样的傅立叶变换5 w+ ~. T* D5 M# ~

0 Y9 ?! Z& j# W( R" |- k  ~. B; S7. STM32 F1系列 DAC的示例详解  P& @3 i! ?( s; h, l, V& ~! o9 Q

; F; t. L8 _, x1 B8. ADC 连续模式采样浮空引脚问题
6 D) P: B4 F' u+ X# H  n1 \- c& I- N) k- h6 x9 g' z) h
9. PWM硬件间隔触发ADC , ~  Y( N) z$ J* z" z- n
5 s* G: h! b/ C" u
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC
/ I" T' W9 |- w4 b) {" ]" J5 m" [( }) t7 f1 j: r
11. STM32L4 系列中ADC 通道配置上的区别
8 k! P" @3 n8 @0 F$ s# e6 W, _& a- b2 x9 I  Y1 j$ P2 B
12. STM32 ADC模拟看门狗及其应用1 e3 W/ U, q9 V# b' j) \, K$ b

4 c. Y. ~( ^' I- O13. STM32L053 comp2 比较电压无效问题
# @  l8 [  H& L  Q, B6 x4 h( ~9 j  B4 e! k9 M! V" w. |6 r1 }
14. 运算放大器OPAMP在STM32L4上的应用6 Q6 u8 D$ X0 {. \) F4 @3 n: M

: o' t- t, c* s4 Y# L5 W15. STM32 OTA例程之ESP8266使用 + U! o# X( P7 R1 }& o5 e

. s' c0 U) V/ w1 m# W16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
- Z  f' Y4 F7 S1 f; Y# L* y3 p
7 Y( ^, G" e5 D, g" |9 R6 d六、计数外设
1 n- x# K: `) f6 Y7 D 5 R7 z$ ?, v& I# }4 d- Q+ p* J& Q) @, E
1. Watch Dog 失效0 G" I- c  R+ v
! O+ F. K2 d. V* C. ?
2. RTC计秒不均匀
  p' w' ~! e% d. m' K ! h. j+ _: i5 n! U, Q
3. 软件启动模式导致 IWatchDog 失效2 X$ D4 r0 x8 t

/ h- s7 ^# t& B' R: D" A4. STM32F030R8 定时器移植问题' B$ S& X& k7 y0 ]( M

+ E- m$ U: w. `1 [3 f5. STM32F0使用RTC Tamper的几个注意事项
$ M; E$ ^) k: D0 Z4 r+ |( n, W, t9 M: I: a. B' g" [: d2 i0 u
6. STM32L053可控PWM脉冲方法之DMA1 o0 r+ h2 B+ @+ i7 V' x  r
7 E4 G  _" C. v/ {% z
7. CounterMode,OCMode与OCPolarity关系, g' ?  {0 j  w7 U0 U# P! N) |
  d. I5 R: t8 h6 V0 M, L9 p
8. STM32L053可控PWM脉冲方法之DMA
7 v4 v7 o+ |1 N8 |, }' Q: [& |2 P5 v: n) x: l% F( n; @
9. STM32F1通用定时器示例详解—TimeBase; n0 t2 ]% X9 t8 R9 |% C, ~

/ ^: H3 T7 \) x2 A' l10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals
% H; U+ F5 F3 _2 E# j' B2 I2 d4 }. |; h1 h: D
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生( E" @! e3 s  @  P0 e' U5 E

2 T1 s2 W2 v* I0 H! M8 v* ]/ e12. HRTIMER的多种Fault事件联动机制
5 X( g0 I% C9 ~: i5 `* ~
8 A1 ~* U) }( A- z13. STM32通用定时器 示例详解 —One Pulse
9 y) k* G; h( ?. U4 F, x# X
  l; G6 e2 b8 `- B  [14. 如何用LSE校准STM32F4内部RC振荡器6 o: X0 H/ U+ x

1 X. c% }* w4 t) v0 V3 @15. 一种使用Timer测试HSI实际值的方法
$ b0 Q- t1 v# R0 e0 z  a* [$ z  b% |, C7 k7 p/ o
16. FreeRTOS定时器精度研究: U) F+ m1 A6 B% J1 H. O) r

( r# ~# Y" q8 G17. HRTIMER产生多相相移信号
2 q$ {, u1 U8 Z8 _" x4 }# y5 ]' ]
# h" n2 M1 z# n4 c2 q$ u18. 窗口看门狗启动时异常复位问题
, _% k+ V, M" g9 q' B; \, ]: a2 @1 H
19. PWM硬件间隔触发ADC
- V5 }+ i; i" s1 T- Z* i0 o1 }7 Z) W) E, [5 h
20. STM32F030低温下RTC不工作
# R- I- V3 \+ [( F" d% H0 p. P9 z0 Q
21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   " f% Y' T: u% m& ]3 V/ D2 ]+ E
* V* x' ], U  d
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)5 Z7 C! [8 R1 n- J" A8 f8 T8 F) a9 b4 e" |

6 c3 w. S& j/ J6 z& m' C23. 基于STM32定时器实现定制波形的示例 (2019·7·25) 9 Q6 N7 P$ G$ v

/ F3 L. m+ L! E# \) a$ t24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
/ y* i0 c7 Q' N( V8 R" p

; H+ S6 J/ X1 o* n! A, q, f9 A25.MC SDK 5.x 中增加位置环 (2020.3.31)2 c8 R1 ]1 z7 |8 Z8 x' t1 O$ e

% a. Z6 h  ~& n26.STM32高精度定时器PWM输出话题 (2020.4.29). `2 {; Z. O1 X4 I" Q  r9 [
7 Q, G5 J& q$ I
' x- ?) W) d8 a
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)
6 {1 [" T. H4 N! p+ w0 b) f

: d# j" l2 s, i3 Y七、内核
: U3 j9 r: u9 k0 w/ K8 a# o 1 Z( ?' _9 ]4 [
1. 使用指针函数产生Hard Faul  h2 L1 r7 B  D0 O0 n1 I$ s

# i9 X7 g0 l7 i' {2. 调试器不能通过JTAG连接器件
9 m0 I5 n& O+ g: M# _5 ?5 ^ 5 T7 o  R& \4 G4 v  u0 v
3. 鬼魅一样的Hard Fault
% Z! F% X( A$ l$ c$ F  x" M& g 5 g" z# r/ O& W' D  C
4. 进入了已屏蔽的中断[, K! s9 R7 n- c+ [  s

: O2 u; ^  j+ s5. 浮点 DSP 运算效率不高
% V' C) v! w" a/ @
3 a* {" N0 n. W1 n+ K2 Y6. STM32上RTOS的中断管理
- ?7 m& B4 `) q+ n8 u% l! q8 s! V  h
7. STM32F7与STM32F4的复位序列比较
7 r0 E+ _( _) C) y0 A# ^& \$ L& F4 O! v1 b3 R7 x% {6 Q8 W
8. STM32F30x 的ADC 采样的傅立叶变换
  w6 \0 N2 K! N  W* \# Q5 T& s: R7 }, P* L- I# f: Y) a
9. EXTI重复配置两次导致误触发中断的问题
8 e! c+ F% ^6 g: q! X: t" w3 `4 |2 a: z- F. s! `6 }7 b6 c
10. STM32F3xx/STM32F4xx使用浮点开方指令/ l! f  v7 Z5 M; u1 y
  A2 S. l3 w' n$ |
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响( |6 f3 ]4 T5 R, a. N) K

1 }4 z) ~7 T. T2 O% o" C" V 12. STM32F7 MPU Cache浅析  
- g! c0 U  x: v' V# Z
4 d. \: G1 i. X, u13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
2 P" S2 t  a& U

8 u* g+ A3 l9 k1 Z) m. m& \* p14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)6 r2 a5 ?0 ]/ d& L. u+ M

+ ]* K1 r9 `1 X% K4 P" f( _/ @
% h9 P+ v. @. W( g6 v( ?) A7 w9 O八、系统外设+ \) `5 I* p  T: V. ^

( I5 f1 N8 N/ V; l" K9 f1. PCB 漏电引起 LSE 停振
! P  Z  {5 Y6 `- W5 n. Z# X: P9 _
- I0 o, f' q, X: H% [( I2. 时钟失效后CPU还会正常运行
) u) |/ v, }5 t4 b
% [+ {: S$ w4 Y3. STM32F2中DMA的FIFO模式
% Q  x6 p" d7 q' \7 }6 @5 l" t4 \+ k, \/ m! a/ c. U5 J& X$ M  h' n) T
4. STM32L053的GPIO翻转速度的测试
! H3 X; y+ H. {( x- w; N# J' r, ^
5. STM32F4xx PCROP应用
% Q6 R- {/ c1 Q( a: \) l4 @4 @) O4 O3 k
6. STM32L053的GPIO翻转速度的测试
6 G* v  `7 u! u2 q5 {. f7 l* L" O# k* v9 ]% B9 a& y! D
7. 如何在IAR中配置CRC参数
, B: m  k* L. O/ ]1 W# u
4 L  \9 p. G6 C% V. p/ k8. PCROP区域函数无法被调用的问题与解决' [1 C" i7 S/ i6 z8 U
+ A! r- n+ [. v. p- J
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题& i; H4 I9 ^% N5 S! w" M7 R  c. m7 m
0 U, K7 i. a3 j, @1 J3 c5 v4 ~/ v+ C8 q
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计/ K  V0 [3 ~; d2 K6 l. P4 Q9 Q- w

5 F/ h& S7 S0 }* S! m11. 如何用LSE校准STM32F4内部RC振荡器
+ Y, k. ^8 \& V4 T- l( I+ P+ a  Y3 J% o
, b+ z7 O% b, ^; i! W! D! Q7 N$ U12. EXTI重复配置两次导致误触发中断的问题  
9 ]: M1 R; A% j) ^8 `/ D9 z1 G% W+ s7 G7 _- P% |  a/ X) K2 U; S
13. 时钟安全系统的应用(LES篇)  
, l2 @  ~( g1 m, U( n

3 v- \6 Q. R/ E, n8 ~7 F
14. 利用DFSDM开发PDM麦克风应用介绍  $ i! u) p* u  h% @$ E7 y2 h

% k6 a" _/ M0 H, F' H15. STM32H7的FMC外设在DCACHE使能时运行不正常 * r. P( J1 X0 l

& E4 c; ]2 c5 s8 B16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)* z% K$ Q5 n. E
1 g/ t0 w, M/ t1 d  B% R; F
* j9 l1 J; e2 y
九、标签和收发器( o) a& x- T8 q5 U( l

, U# [' @: f9 K) l  K1. CR95HF的初始化步骤
. }  _6 h8 o9 b( w3 v! U
0 `% m  w% T. B9 P3 W1 c0 ]4 M5 j- l# z% t, ?
! Z- N* y3 l' e: P/ r. m
十、生态系统
, o8 d8 ~1 Z3 r6 `, v
, @7 v& r, ], q( O% z5 R/ A/ t1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题1 r9 Y6 H) G$ E: v/ g- H

/ z4 l9 H# ?% y' D* W2. MDK Logic Analyzer 功能在STM32中的实现问题
* X/ Y2 s6 B* [5 Y( d , {6 k2 X. t: j/ ~
3. 在IAR6.5下如何将数据存放至flast中
% F+ g: y0 p" ?" _5 J8 R 5 Y+ z' p# p. K4 ?  t$ g, }6 l: K
4. FatSL移植笔记
# ^/ t2 |$ V! t9 e! w+ R % i7 D9 W& Q% Z: ?) I$ w
5. Keil中使用STM32F4xx硬件浮点单元
$ C. F8 V( R7 W- E: O  L $ e( @; K/ p( C
6. 如何生成库文件(MDK和IAR)4 F6 ]. @$ G) w: y3 n( g/ [
! M( t$ M7 D2 W8 ~9 b1 n. ?
7. Nand Flash文件系统解决方案/ q: e9 B6 z) ]* {: N4 {& g+ B

( V& E" S: X  K: f* }8. STVD在调试时弹出“Cannot access configuration database”的解决: r0 C! J; h0 u$ k8 V1 [- |
9 c% C% i1 I. G( g
9. RTOS低功耗特性的设计原理和实现
7 E: D. e: u  u4 O, b+ G5 F 2 o- T4 ^- R, ]
10. IAR下使用J-Trace进行指令跟踪  L% {- ]+ C0 e3 |( a! E5 d, h
8 ?+ }% L6 r2 \6 M" y
11. STM32上RTOS的中断管理
# m* t, b% @/ y) B$ p$ S7 Q) Q0 d0 S- b! R  [/ i. c
12. IAR下如何让程序在RAM中运行
: q- ]- n0 n4 G2 B0 H# z
. _$ c7 K6 B7 X1 T$ Z; O) D13. 如何在IAR中配置CRC参数
5 y# ?9 d: ?7 [9 |, P
% |* N) ^) n; y$ |: g14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册
- z: v' _7 G% d' a# p! u/ w5 ^! ^* N) C( ?5 c
15. 使用mbed进行STM32开发及STM32F0的时钟问题
2 Y) D( n9 ^) ?5 N% X9 H
( m. j$ S- J4 D. E( U* O16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
9 m4 @! D& ~. w - i5 y6 g1 ~* `( o" Q) r
17. 多任务系统中的不可重函数使用注意事项! C; y, A9 z9 r6 ?1 e$ U* o, W& \3 `

0 i: E; [# i& l0 W1 d18. STM32 utility的hot plug功能
1 [& I3 M* T# E
( Q0 G# d  y4 v9 X) ?19. 如何将CoreMark程序移植到STM32上2 n. `: I# C, }  q: U
) a# [; X, }9 j6 h% O6 f$ L
20. FreeRTOS定时器精度研究- M% S3 [" Y' N, @  q, K+ Q
) F# y* y4 L9 W- m# |$ z# R
21. 如何使用Eclipse和GCC搭建STM32环境
5 l+ o1 y" t" [# A$ O' r3 G/ c2 p9 n% T$ g$ ?
22. 如何建立一个基于GIT的STM32库
8 v: }9 w% v6 v3 Q8 O) z( P) d' \# B) ?' e7 v& J$ ^3 @! J
23. 从零开始使用CubeMX创建以太网工程
, l! M4 C; h/ ~9 U
3 P% n7 e! t! E! N24.从STM32Cube库向标准外设库移植FatFs文件系统9 ]" i% b+ s- X8 y; d
9 ]% g1 L& V7 x/ a) q
25. 基于 STemWin的屏幕旋转
% j8 K: W4 N. Y6 S  p7 ?! N' T; E
26. 编译软件 Hex文件烧写
$ g" k. ]7 X# }& T0 U+ |+ m) R; r# _  l
27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 * r' ~. A9 r7 E
8 s, O2 K& P8 e
28. USB CDC类入门培训$ C- w4 b% V) C+ ]

0 o: x$ l& o& x5 v/ M29. USB DFU培训 3 ^' F$ |, W: l/ u, w
0 Y% w# H9 \$ W, @8 q8 I. s* y& f: H
30. 用于量产烧录的拼接Bin文件操作
5 f% A* x- t5 n! x+ h5 |  F; P, X* f  P6 i- H# N& b& `" P: K, `1 A
31. STM32免费开发环境该用谁
3 v6 ^1 W" U# a7 Z$ v, q/ I/ U9 `: Q) A3 J! c& ?) H* a% Y
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)( T# d: e2 M! R0 v+ `# C
( i( T+ n# t7 u+ |( d7 j
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
, D, A5 Q% C, ~' \0 S+ z
" r- a# ~; t% y! D5 q' t34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  7 V4 Y; {& E. B/ v+ z; l9 Z" u

6 B* T1 u1 U2 N/ T( F) ]35. STM32 FOTA 例程之 cJSON使用   
2 v, g5 c& N6 w( v4 ]) H
1 [( h( l& V% B! G5 n36. STM32F769DK 云端固件升级例程使用说明
; N$ v8 n2 h3 l' @0 E& n  A

5 e; U7 [4 y5 n* S37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 . E: {: S. E8 L6 {6 v* T+ i
, w/ I1 y" O3 w' I  V
38. 基于 STM32 的阿里云物联网平台方案
* i3 C+ `4 u- ~' T/ Z1 H, H: l4 q, @
39.AliOS 任务上下文切换原理分析  4 o3 a+ h9 U- q) o& t$ U# [
6 W# l9 n; ^4 L! L; l
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  
* }4 B* I4 I$ p1 N  ]& i6 m* i/ \% a$ _2 Z5 F6 v  M
41. STM32F769DK 云端固件升级例程软件开发文档  3 g+ ?3 C  z4 p0 a5 P/ c4 h" O

- ~8 q, p; b: o% P( K9 x* Z42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)1 J& T* l4 Y# e

* Q9 w. @7 g  @3 ^2 t, u* L43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)6 f8 ~, _5 Q' j/ i- [$ b4 c; `7 ]; }

; H5 U) T1 D- u3 y44.零基础快速入手STM32MP1 (2019.9.19)
$ b5 C7 s8 |1 X
$ |+ ~1 P2 U. ^9 x  M45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)- n0 r  T9 Z) ]

+ L3 A* Q. D# x5 I3 s* x# b( N十一、调试3 M' S1 t; _3 a6 S2 v; t0 Z
/ g. B- k1 \4 _6 p# X/ S3 K/ w/ P
1. 关于STM8S SWIM Error[30006]的分析
0 J3 B1 @/ }* K5 M , y7 U. }, m! ^1 E, m8 W
2. STVD在调试时弹出“Cannot access configuration database”的解决7 |6 j" y5 Z1 {# O) ~1 y
) ]& }& b5 S6 r/ T, R( H( k
3. IAR下使用J-Trace进行指令跟踪% {' U% D# b1 S. W& I
* [6 `* Z8 f1 f
4. 菊花链 JTAG STM32
- n2 W+ i9 v' J7 u8 ~! g, ^+ r8 }
) @8 K4 u4 y' u% v' b/ @5. STM32F411CEUx 能下载程序但不能执行
* b, N# N& R* H3 K6 N9 \  r
, f. P! P2 D+ ]4 A6. STM32F103C8T6 程序上电跑飞
: x! Q4 C  o' |$ J/ p( c5 U3 s5 Q" e  s  D3 _! b/ c5 W
7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
" K: {# o3 \, D! ], H3 a/ E* ?( h  W( ?$ w; e
8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
* z9 g5 W% @8 |
+ ^& q3 J3 t0 B9 O9. SWIM协议的GPIO口模拟
; u8 N3 s* g6 h
% {/ n& h' I4 X10. STM32F091空片使用ST-LINK烧写后复位不能运行用
3 [7 j: |( f7 X; Q3 i3 v# S. J  ?& I3 X% y
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)' c+ q7 E7 i9 I" C0 @5 V8 P' ?
* C' \! k  ^5 E9 D) G
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)0 b2 r  m1 U0 T9 j

& I7 T4 Z2 Q  d- J13. X_Cube_ClassB代码移植 (2019.12.24)' a) ]7 N' K1 K! v1 V- j! z
' H0 a1 B, F9 V# j

: E4 F# Q& u" Y( {  K; h14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)! \) y" y1 f; z4 ^$ b2 e$ m
  D; y+ D. k: \( r  j
十二、人机调试
$ _0 i! A' {) g/ W8 s6 V8 T/ r5 U6 t- o, \  ?5 {0 ]2 M2 d9 }
1. 一步步使用STemWin在STM32上开发一个简单的应用
/ U+ |$ t3 ]4 Q9 Q) j" Q4 c3 C& {
. D; B& h% J( {/ |" c; D7 R/ J& s7 _2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计2 P9 Z" P. K, B2 ?1 @

7 z4 q- `, q0 D& {4 J3. GUI方案中ALPHA通道处理介绍, l% E. p( s- K0 U* d; l6 n

5 c6 }9 o' }3 |. A! J4. 基于FMC8080接口8位LCD的STemWin的移植, \1 h4 H" r5 F: N1 h" E5 \4 r4 p% D) {

* C. g- V" g$ `  n5. TouchGFX中Callback模板实现原理 (2019·9·12更新). h. ~+ M% ?( L! i) d

$ a3 Q( m9 \2 {8 X. v( _7 l7 P% p! H6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)
! J' P! J- t& L8 F1 w7 R/ |7 W5 w! ]% v
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)1 q7 H0 R2 i) {0 ~
5 s" Y" [( ~7 s
8、STM32L5中如何关闭trustzone (2020.5.12)8 ?" G, {& _2 r- h

( D# X8 X7 e* X* M1 [/ j/ j' D十三、马达# l- y, ]' w) M& z* T6 P6 E' \  ?7 @

2 h+ `  ^* Z  \) H+ Z/ V6 e
1. 电机控制同步电角度测试说明
0 C5 g/ V7 V1 w; `* Q. E! M' m5 I& C: G, V) c% K  g
1 l$ W" M. G6 Y( C( V" e# o6 ?9 L
2 [% p0 b3 G& A( Y% ~5 J: j. V
十四、安全
/ h+ P+ J; C$ q
7 L$ B8 m5 |. @: k
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
9 @; [0 P# a; {" d# Z' h0 g) X6 Q
2 ^$ b! O* F5 z6 k* F" ?: u: u. q% |+ Y2 H! O2 H. Z7 h4 I( i
十五、其他$ \. y$ M- H9 L) L$ p( `0 j* N; b

9 I* k, m2 s; }/ l* |1. 跳不出的 while 循环6 J& B0 |" ^. l$ j4 f

: g4 I4 c1 `! T* @2. 外部IC连接NRST导致MCU内部复位信号失效的问题
  l; r5 n, u- L( Y/ i
: B! V# K. z. C6 x3. 潮湿环境下不工作
( p4 V3 j# e+ Z( i4 c: f $ d& P5 x; y; t8 N" V: l3 @
4. PCB 漏电引起 LSE 停振* T, j* f$ k- {; d; U

/ \- Z0 C% N! j+ J0 |5. STM8L152 IDD电流测量
* p9 t2 A  [( U, {& d, y ! b5 ]9 y+ P: @* O+ y8 G
6. 使用STM32实现锂电池充电器
! H) ^# w$ _/ A- h3 Q) F 7 N. j& K! b( C6 _
7. STM32_STM8硬件平台基本检查
- g. ~8 ~) a5 L$ a! d) V
1 c4 h  e7 t& M$ e7 s3 \8. 验证STM32F401在STOP模式下的电流
+ x' R" Q! Z* q0 Z" a" x5 G. X: {, F: n# Q( i  V8 b/ l
9. P-NUCLEO-IHM001 电机开发板串口调试指南' q# x0 s) j4 x- z6 s- a
, K6 T5 [. z" @! h- c, V- N
10. 一种计算CPU使用率的方法及其实现原理
% n  |& e8 h( c# ^$ B& Z$ T3 u6 t. j- `1 K% X
11. STM32 RTC不更新原因分析
. C# J# k5 F5 e$ ]) T% v  M( e; U0 N9 H. `
12. 关于ST库函数的代码性能对比, q1 W. a) @; ^- z' e4 }) z

' ~# D. k  s- s, x) K13. 在IAR中实现通过将程序在SRAM中调试的方法) |, Z; l: T* H+ t9 i

9 L; N- J, _7 f5 j) i14. M95xxx EEPROM写保护配置1 {: r5 p3 \2 j

6 n1 y' ^# ?' Z( g, H15. 4SRxx的GPO的属性
; V8 X) @; D3 {
7 H! P( a  K. M# c- m( c! h- D3 `16. CR95HF的初始化步骤
3 J. X  ]- e9 {; v
( i4 V, j$ `1 D- y3 g* w) A5 b17. 电机控制同步电角度测试说明  . Q' T: }( x/ U! x" S& G5 `8 j5 }5 }) v

' \& B% }6 q/ |' v18. STM32+BLE通过 Notification与 Android应用程序通信的例程% ?- M+ ]2 E( \5 ^) U
1 X! K3 X4 R% H+ x5 I% s
19. M95xxx EEPROM介绍7 f2 R/ X. y2 ?5 j# @

& y5 B  v& ~0 K7 P0 s/ h9 _5 K+ y20. STM32 DFSDM测量温度应用 5 n( x- C, Q4 V4 T! P" G0 J% A
+ E: w% h* t7 ]
21.代码实现PCROP清除5 N, G, ?0 E& R! }/ Q
) b" u1 W5 P7 _$ J0 ~: ]' U
22. 理解与应用MPU的特权与用户模式2 r/ y; l7 Z7 d& P
$ I# b; \2 t: I& ~# k
23. 用于电机控制单电阻采样PWM变形信号产生
- _, X; A) J* {3 E7 X4 z. R2 @# |* E' D) D7 Y; ^
24. STM32L低功耗模式唤醒时间测量
7 \" h. q' K; U7 W$ @- g: f8 L! y* j: X# {) _, F6 p5 T, n5 f0 H' T
25. X_CUBE_SPN7程序电机启动抖动问题
! g6 `3 U, R) {- j: _( l7 V& W) b1 L
26. 发现STM32防火墙的安全配置# c3 s6 i. c2 V' ?9 }  t* s
: D& z5 ?* G2 ]: O/ X7 x
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
  N9 N! e5 C0 Q. \0 n# v) }) ^2 y/ L0 K
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
. `; v! D2 g. C: E% l1 w8 z$ s! L* ~
温馨提示:
3 q4 b4 M' n% T
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
; }" M3 A9 n4 F( ?. Y8 L

  P4 d3 p) |' c) r
0 z2 |9 u0 ^# S/ t9 H5 S  ~; l4 z1 z) Y

4 O* F/ m" {0 ^: ^% I
) D8 }. H0 ]  @5 Z7 v3 t' @! p5 C! A0 `

' M1 Z5 M7 b) l0 g" A5 S2 Y2 ~7 b$ f. v" _0 b

$ ]4 j) j& |. o, K) e& a5 w
2 Z- s, z( i( H2 E6 x5 j* M

评分

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

查看全部评分

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

举报

278个回答
michaeldeng 回答时间:2016-7-26 19:35:55
非常好的帖子,THANKS!
Paderboy 回答时间:2015-5-18 07:01:19
好详细,多谢分享" o, Q) o5 A& p8 v" ?! S
5768340 回答时间:2018-1-13 14:42:54
HI  , u( b6 D" }  x* v
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
) R0 g$ ~8 d/ D4 O  A1 u8 J   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************- w, b7 l4 B' T9 f$ K1 Y+ `5 H8 u
  2. 函数名称:Cdfinger_Bspspi_init) q4 l% M. W2 y  L3 T' }  s
  3. 函数作用:spi初始化函数9 I5 v# |+ R6 t
  4. 备注:
    $ s: s/ H' {# K) `2 s
  5. ******************************************/7 |, _4 o/ T1 Q$ g* ^! Q
  6. void Cdfinger_Bspspi_init(void)
      b3 Z6 O( m4 U8 l- p5 J% n- @9 Q) H
  7. {
      o& y* V) |2 h; {( f
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    5 J# \$ i$ P- r9 Q: T
  9.         SPI_InitTypeDef  SPI_InitStructure;
    0 A  i9 U' N, y; U  Q- v6 {
  10.         DMA_InitTypeDef  DMA_InitStructure;' s3 Y4 U" D$ s9 F* U
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    + x: w9 n1 t$ R0 v5 [. ^, }( y4 |
  12.   
    1 i2 [0 b" j: Q( D: C) m% A: S
  13.         int ii =0;
    / X3 c* ]; M% J) P  J. L6 p4 r
  14.         6 l' H0 q; W" M$ ]" n
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    0 a0 b% F1 R! |4 R  c
  16.         /*!< Enable SPI2 clocks */
    # |) Y' z8 s; A( @3 V( j$ m
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    $ [2 B5 Y" k1 V0 ]
  18.         /*!< Enable GPIO clocks */
    1 N  G2 e. j% P& b! t
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    - k( j. ]) b7 \: C2 L; d' E" L
  20.         /*!< Connect SPI pins to AF5 */
    3 I6 b2 S1 [8 j) s
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);7 a# [+ f% q' `( N) b$ }0 H' h
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);5 A# T0 j- f; o  U1 @/ N. S
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);1 h2 o, p. G, }# \1 s( T# p

  24. + j# ?, ~& N! ]$ F# Q; H
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    5 y. S9 p. O  n6 D+ B
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;0 D$ `7 J- d, E5 F, e
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;0 S# ]/ \9 n" k$ P9 S2 L: O
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    ) Z* K1 K4 V) P: P# ^# o
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;7 X" u& J5 t' X% o1 O& P" V
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    4 M) a; |6 ^1 V4 J; f( n

  31. $ O$ L# |1 o. \, V# i
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    3 k# j1 B& m& B3 @! H
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    + ~% S8 R* @% ]
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    7 n0 d/ g, W: H0 e2 X% d
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    - R% m3 D* a& O
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    " s* @/ b5 I# _  `  N0 H
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    ) x$ |' Y+ Z0 z' _* u! G8 N: U
  38.         Cdfinger_BspCs_HIGH();
    , O7 k0 f2 L$ @
  39.         //Cdfinger_Bspdelay_ms(1);
    - L' ]5 \$ d# m/ Z* Y
  40.   //Cdfinger_BspCs_LOW();1 S3 R2 l* H: l* d2 K
  41.         SPI_Cmd(SPI2,DISABLE);- ]+ }  i3 ~( d% z& w4 F' w; F
  42.         SPI_DeInit(SPI2);
    ! D$ q  l9 r0 S) J' H
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    1 @/ D; E" }$ E/ B' p! ~
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    $ S; @, w9 V' }) Y$ I: Z, v
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;3 K  `( I; W" e' R/ k- z) _! d
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;7 ~+ j. x4 t0 L
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    8 d! G) i1 E* h3 d
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;8 q$ y, w3 b0 u
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    ) w3 ~  T" z" x# d8 w7 z2 O
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;4 k2 b8 p4 b5 P$ M+ Q, E* B
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;
    , O) Y6 w' w0 i7 k; {. t9 o" X* N* R
  52.         SPI_Init(SPI2, &SPI_InitStructure);% `2 K2 w  v. k% }" R( M

  53. 6 v( X! h) Q. H- C) o
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);2 l2 M* @4 Z* {# }( g7 t
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
    $ K4 `' U1 |1 s" D
  56.         DMA_DeInit(DMA1_Stream4);
    - ?2 H  J0 v0 x6 O- X7 M. G
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    6 F: f# V4 n3 q" p, |
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);2 x3 L$ {9 [, N0 B6 l/ d
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];
    $ [% |. k& G% b/ h0 ]: Z# I3 S
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    6 }4 y7 L5 J, @: y2 W6 i, ^4 N- v! t
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    ; Z8 j$ L# E4 x- B) C3 y9 [
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;% C' c" i5 X! I
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    ( q+ n8 k' b( [. e4 K
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;) i5 r9 u- }8 D8 f# A0 F
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    + a3 i$ _6 }/ l/ B+ v+ X2 b; O& d. @
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;! @0 ~# J% P. _6 l
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
      F7 L& _, {1 S6 @! ]- J
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;# o, D, O; M0 f; l; X& g
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;( T- X6 H: V8 ^2 f2 I' s; T
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;( z1 d2 n9 `! n" y' v
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;# j1 k0 G+ i# F' P: e7 q+ i
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    5 J2 u4 b, t8 x$ z
  73.   
    9 V" r3 U8 C0 q3 p: z
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
      s+ D' r& }* C6 }
  75.         DMA_DeInit(DMA1_Stream3);
    9 v6 v7 ~3 N. T. s. p
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;& s0 i" G  g' s
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);, \, S& E' v# G4 `
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];, T1 d& z4 G+ k
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;( R$ w- [' t. D6 A9 R# s
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;1 q% i* j: m+ p7 M6 p
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    8 t6 G: _  l9 D
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    0 _$ Q8 @. @' ^
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    2 H+ ]* w% l( ^
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;: A) ?6 I" \& a! a) }. a/ ~, ]3 V
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    7 P- U# Q/ t7 Q4 G
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;5 }0 H$ @3 f) W# z' j0 ?' d
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    ( P0 q# V1 b% n, k" C+ L9 F' S: V
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;& t, `+ x  s7 l/ C2 H, B* q2 W
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;3 _( o. W- f' Y
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    6 ?$ m% U$ R4 E  t4 m+ z6 v' V
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    ; U/ C9 W; w. e, b+ E; T
  92.         //Cdfinger_BspCs_HIGH();
    . @( z; Y# `  P( y! c
  93.         3 Y/ ]8 q* z$ K$ n% N& o
  94. % C0 b2 r* q) _6 t+ h. {
  95. ' j0 b& X7 h% N- S$ Y! o- L* B5 z
  96.         //发送中断" h( d0 A2 @0 D9 O
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);. F% X* o( w% z$ V( U8 w  \
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    , k6 G; C' ]$ B( L9 z
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;5 {+ N2 q3 t) ?2 o' e+ z7 H
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;$ D. G: y* b0 M8 m6 U6 ?
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;- h* `  \$ H5 L/ H6 r( K/ R
  102.         NVIC_Init(&NVIC_InitStructure);
    . V; n( O* F( D  C) E6 [, G
  103.        
    1 w. r9 s3 W! O
  104.         //接收中断
    & U! |6 [2 w* W
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    / }, P5 m! k+ h1 ]4 a0 w; E$ A
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     / v9 d! i( R, _- _" G2 C
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;6 t. j. \$ {8 _  b8 ^% b! Q
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;0 @0 o* ^3 J( G/ e7 n
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    , ~2 e5 V! j; X3 V# a& {6 C
  110.         NVIC_Init(&NVIC_InitStructure);/ z2 k- W$ s4 I* }8 g4 N
  111.         SPI_TIModeCmd(SPI2,ENABLE);) g6 [- A% T# Y$ c5 f& @) C9 O5 W: I. f
  112.         SPI_Cmd(SPI2, ENABLE);' X# k# h4 _: P
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);' p( G' K8 w, Z
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);% m' Z: N' D) C0 R6 A! R, R' ]
  115. 3 N/ b0 A& W/ M/ O4 ^) \: C
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);" r. m6 A; V# O1 T4 Q: J
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    5 u. n4 H( C; y" Q; U. ~
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);$ p; e5 b5 }) q0 z4 |

  119.   d, Y% ]- n5 {+ f, u
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)" \( N  L% R" N% Q4 J! E6 k
  121.         {
    8 a2 k/ U2 F; R% Y# ~" |5 t) ]
  122.           if(ii%8==0)( R7 I' e- K" M# p% k. n- S/ |
  123.                 {
    ! }/ m+ s, m& S/ I) N& V9 r
  124.                                 printf("\r\n");  T$ q# t& _0 v& i7 N
  125.                 }7 }  ?9 k) N1 R$ H; ~
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    ! O( [* l/ M0 h0 P* P, Q
  127.         }7 V1 x$ K' z- y! b2 `# |
  128.         printf("111\r\n");( x1 Y" h: Y% h: C
  129. }
    " h/ U* r0 Y) W: i0 [

  130. ! R3 v( u* ^  x6 Y: @6 ^3 Y
  131. 4 n" K, h  W; u& E0 e
  132. void DMA1_Stream4_IRQHandler(void)8 V8 r3 G: e( B5 T. w
  133. {
    * q0 _7 U# }/ ^& w
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)  T4 i& H5 v" w) a
  135.   {
    . w( V* S" {2 F4 T+ y; V8 E
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));$ ]: k# @" M1 V  p! M( ]
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);. @6 I' ]/ |7 K& U  B: i+ P
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);# P* C0 c% A5 g- j
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    $ x4 X8 j! N' P# _: ^+ _  a
  140.   }# B% e0 _! q! Q) X% n8 |' t
  141. }
    * r! r+ x6 L- ~  a& n4 r5 @
  142. 0 E! T$ ^& U! ~0 \8 K" B, F
  143. void DMA1_Stream3_IRQHandler(void)
    & Q" J) P$ r' |: n! h
  144. {
      ~+ \( I/ _) h# P. s. w! J
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET); \- ^0 T+ ]( }# Q
  146.   {  I! j- j; {+ b" k* m
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    " W& e' }0 ]' T
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);* V* G1 c0 E8 B: U
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);$ S6 q3 N1 A7 h
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);9 m. j/ R/ o# F9 A; Z# ~( A
  151.   }
      }5 O% V; H$ C) G5 ^+ z$ `" 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的波特率是不是必须为相同的,才能正确通信6 b& Q, O9 f6 F! I
以下是全部代码:
1 k+ }, ]4 R$ ?8 K6 r3 ?" i#include&quot;stm32F4xx.h&quot;
0 N4 b) ^) t' W$ X5 K8 z/ fvoid RCC_Configuration(void);9 Y9 n$ i* h0 W) L! o
void GPIO_Configuration(void);
+ T* }! `& v8 t6 s* ^void SPI_Configuration(void);
: l4 A3 @* k, |6 e3 x/ Pvoid Delay(int nCount);
6 q& H6 u" C' D. ^int main(void)! `& o$ M5 l' s3 @, A+ k, Y3 P9 _0 Q
{  RCC_Configuration();
. [# q* _1 A  a' `  GPIO_Configuration();
8 p& y, C; k, r" d, S5 V  SPI_Configuration();
0 f  m7 a& v5 R3 e: U% V# E$ ^ while(1)2 w3 s+ ?; n9 O; w9 i. e" c
 { int data=0;5 b' ]0 o5 Q7 f4 S# k
  SPI_SendData(SPI1,0x55);
% @9 I' \3 F  a$ J5 }' y  K/ O8 ~6 ]  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
: L, N: L; n  X! c  W  data=SPI_ReceiveData(SPI2);
2 E+ @2 Z4 f: T  if(data==0x55)
6 ^0 N' y2 v) r     {  while(1)3 X$ q; X2 H8 B1 C
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
% S- X' T$ V7 K$ k* ^1 T                Delay(0xfffff);  @; {+ C0 ], c7 D2 ?
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
' l4 G) C/ G# ?1 h, T4 g, _/ P                Delay(0xfffff);
* J; ]& ^2 w' _$ W# J/ ^( r- l   - h( ?; a4 w3 R
             };
- e4 x) w1 j2 A' u3 V/ @/ M0 k1 m* _     }
, H2 u* u- R# U. V% g     else while(1)
7 _! ~5 m9 G* ~4 K* K4 J            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
% `; ^1 S* r$ q1 K6 r% w- ?6 M               //Delay(0xfffff);
( M1 T  u2 h' ^: ^               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
3 K9 h' _- U" n; o% y! E               //Delay(0xfffff);
3 L6 K9 `  C2 C9 Y. F   6 G; |( B  r0 `
            };
8 r5 W7 V9 ?; E }
0 r7 W$ ^2 A/ }( e; Y+ B! f9 x}+ }6 n+ U5 T( G. v! `9 a
void RCC_Configuration()8 \4 q& k9 a$ y* P: |
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
8 L* G1 E2 \3 L# `9 D4 a/ X  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
+ F/ b* r2 N4 S+ c2 M1 V  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   $ H5 c  d/ Z  L8 g
}8 K3 `. E$ @2 D* r. E5 x1 O( i; }
void GPIO_Configuration(). @/ Z0 ^+ q7 E. u) ?
{  GPIO_InitTypeDef GPIO_InitStructure;
- z8 p4 T3 G/ o! x/ V' [  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
" e/ G+ U9 _! P; p6 f  [  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;1 P6 _& E' `5 F" P0 E  v
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;, w( M/ A, q$ r# m& u
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
' v( N9 ]2 m1 g  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;3 y! v) S. H* o
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
  \9 J9 X" i, @' u; z' u6 L% x  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
8 q! U8 ]& v3 _2 v  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
5 n, W1 N) t1 c: s6 H4 Z: \$ {9 S7 ^  g- L  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;. ?9 L6 i# }; {8 [$ k" M' c4 `8 Q
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;- H; Q7 F  J6 }9 w! j
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;6 j+ Y8 ]# }) m4 q; ^- I: [
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);5 A" v5 U  g5 W
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;8 i* ]5 G' Y* ?0 x0 P' j9 |
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
7 x. c6 U6 g" l}
( ~) b: ^  w' G& f* o( E! K7 @6 Lvoid SPI_Configuration()
+ s- E- \) \, S" [4 B{  SPI_InitTypeDef SPI_InitStructure;
% i  h( J2 T, D/ ]/ l! J  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);/ G. u% f! x) ?* |* m
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
: O. d& r) h8 o5 t1 {4 v  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
* B3 Z  n$ f, ?1 {   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);% B3 k: e. B5 f* `) U
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);. o  p0 _8 y2 ~
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
. O3 [  r( z  Y) u  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;0 i" e* y# F7 ]- P; X
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
/ u3 V( v1 V2 N$ b: Z! Q  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
9 G/ {- N* J% F( `% C5 r3 u5 n' A4 N6 r  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
$ t( A6 u, ]4 s- Z% H" m5 b  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
9 `; `# i8 {3 @* \3 s& n  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;" \9 E1 P, l# d4 _! G% g
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;& l! [& a2 r* i7 J( W/ v6 L
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
/ U3 N' x: Y1 k, e  SPI_Init(SPI1, &amp;SPI_InitStructure);' C3 }6 e* `9 M0 N0 j/ o1 q8 G
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
5 H/ L8 U- Z1 I$ r; l8 r8 q   SPI_Init(SPI2, &amp;SPI_InitStructure);
6 R* h7 c/ T  F1 T   SPI_Cmd(SPI1,ENABLE);6 ^% m' W) x+ N9 k2 q
   SPI_Cmd(SPI2,ENABLE); 
' z6 I" k# t" }5 U}
$ D( z' a  h- g' E. R8 Yvoid Delay(int nCount)# K7 @; q7 [6 W8 M& q5 ]3 U
{ int c1=nCount;: W$ R( J  }  d
 int c2=nCount;0 n( v2 W" w7 U6 b; I* O
 for(;c1&gt;0;c1--)! P5 M9 t' y: _( j
  {
1 A: Z1 ?/ S* S0 _  for(;c2&gt;0;c2--);
$ V, Z, J/ v* b$ F8 l7 Y };' j1 n- k" [4 l$ O$ W# o: _2 Y
}
  @( U  b5 m, u  ~3 x* H, v& B先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:/ C  J; e4 m- v/ S8 B3 c% c
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
% s% u2 u0 r- {, a以下是全部代码:
% |9 G! r! D- E% r' a3 y#include&quot;stm32F4xx.h&quot;. z1 ~4 r, i$ c% }1 t
void RCC_Configuration(void);, e% z( y7 \/ j. r" q* l% @' Z
void GPIO_Configuration(void);
6 u" O* A. G. X1 v/ S$ @  hvoid SPI_Configuration(void);
6 Q* P8 x0 }' K: rvoid Delay(int nCount);
" A, G. x- P$ \7 H3 g5 Tint main(void), K$ k1 q  s5 G) C
{  RCC_Configuration();
! |+ ~: F' G- \0 L$ v) K  GPIO_Configuration();
9 b8 X( t- t) A( ~& P  SPI_Configuration();
" i# ^' d- A( F# B, K% N9 r while(1)
( ]8 V5 q" _$ ~9 ~# S( v { int data=0;
/ M' Y+ U$ J% f7 R! ~  SPI_SendData(SPI1,0x55);" y" E! V$ r6 D. C* I2 v! n
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); ; o2 }, i! g) ^
  data=SPI_ReceiveData(SPI2);- M) y0 L5 _0 P8 k
  if(data==0x55)
0 b" i9 Q0 D8 i     {  while(1)
4 c6 |! o5 w7 {2 T/ z             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);" Y# n5 x$ b, D6 Y+ t  n
                Delay(0xfffff);' O3 z$ M# S1 d# L; @# m
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);3 g. J6 e( N+ {2 u$ m
                Delay(0xfffff);
5 t& B  e' J, r- |7 I  
2 |% z1 h) V# R5 ^) {) S; a             };2 C1 n8 J$ _4 I  X. u5 Q
     }
$ ^+ Z  B5 w, P4 f' i. l2 f( C     else while(1)) G! D8 {2 ^6 ^
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
, u! a0 P" i  K               //Delay(0xfffff);
' s8 n, ^$ l& v4 A6 ~* G* ^( g               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);# Y  H; J& q5 D$ K5 b: k, I6 e
               //Delay(0xfffff);
" Y8 p; \4 n+ m" S; H" V: h6 I1 q4 X. y  
9 o! P" w4 {  m  h! C  F. w' n- b1 \            };* O9 d1 T- M6 v: B2 {! R
 }
& n9 ]7 W7 a: s}4 Q5 h* a) m  w2 m! S$ ?
void RCC_Configuration()9 R5 P! L- o, _' A5 \
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);# z" M& T1 X2 j6 N2 K5 G
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);( @- i3 w  p4 g, B8 T8 @
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
7 M% g- o' [: d: n; o}8 b( N8 Y( l# d: T8 j8 W7 q
void GPIO_Configuration()
+ ^* I0 ]# m! z  g. }{  GPIO_InitTypeDef GPIO_InitStructure;7 B2 m1 O4 h# m3 M. w1 H$ v0 `
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;: b0 \' X1 _" R1 O- k, S6 A( e
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;& u5 U8 F9 V4 q1 t& g. m
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;3 |$ p3 n* i% w
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
* d8 U* L. l# |  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;/ o& c9 s0 @" w4 S, |
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);8 S* g* h. w& y. y& H) q( Z
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
* G1 o" q8 B4 T1 m" k  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;% y! L' z" u. w$ a1 Z1 V, W
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;. x! M: |# e) ?( X
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;+ \9 h/ z: T( C2 M. Y$ L
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;: G8 m( M' d8 r# g8 @5 V
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);) X9 m) x. l1 v& C
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;% _! Y4 i& t5 T  u% b. r& S( |( q
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);8 w* L7 m( w5 A) E
}
  G' A. Y) e  v* e1 q, `9 bvoid SPI_Configuration()
' \- U1 A! X7 g( S{  SPI_InitTypeDef SPI_InitStructure;  n' W- f- Q, x' I& v; b
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);0 [* ?4 x9 r" d% ]8 d; c$ r5 K) y
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
2 v) [$ t/ c# a* l+ E2 k  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
: r, ]8 C+ v# h  f0 U   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
0 H3 s+ ~- H0 {- e6 V  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
( {  [& r' N/ e" a9 W) O. I  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
) u( M+ x8 l/ w( ?9 q- ^6 h  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;! b+ G, |3 w% }- T7 [
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;% w, V) \; L8 W0 z/ h
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
8 ~+ x) _# J0 ]" ]  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
2 L' V# ?# f  \) l& ?  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;. k8 I. [9 q8 @+ b. X+ X" z- I
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;" P7 i; Z% W+ {7 w( Z; }
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;. u3 m% O& D/ {' P& j; `
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
# W5 ?# }3 @$ O* f- X3 |  SPI_Init(SPI1, &amp;SPI_InitStructure);2 \) ~6 |& r) ]3 O
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
% W, v# q" b/ T9 v$ T" q, a   SPI_Init(SPI2, &amp;SPI_InitStructure);
, D" p( o! a" p; N   SPI_Cmd(SPI1,ENABLE);: W5 S; t+ O. ]+ \# f/ z
   SPI_Cmd(SPI2,ENABLE); 
4 _# L) l2 j2 m! f: G6 e% @! n" n2 D}' `. N9 k$ A3 L* Z  R* x
void Delay(int nCount)7 W2 `6 v: q( `$ C
{ int c1=nCount;
; C9 F* ~7 ]* m/ k% z int c2=nCount;
+ E2 A' ]2 l0 E# b  m4 {( B) r for(;c1&gt;0;c1--)0 C$ s  ~% B' B. I8 w
  {
3 V' s5 i( |1 u% E# o5 j7 x8 }: M  for(;c2&gt;0;c2--);' G* t, R3 Q/ H8 `" V
 };
  ?& M) }1 F0 V}% p8 z0 h$ F3 l0 J3 p
先谢谢了~~
: ~# N& J8 D$ ^0 q& a  X 
/ z8 D* }0 D% n- k- K- `; \8 A, g/ K4 s3 z
楼上的问题,看我帖子给出的提示哦~
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发表:- Q- g& F- u; T) t4 B
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
) F7 s- L" F: ^+ [2 O& \5 B; S ; X$ u) ~; P/ g0 z

# Q3 W% r4 K6 h" [  C0 T多谢支持!!
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 运算效率不高

  
! j- x( P* Q  y3 T" c鬼魅一样的Hard Fault1 S1 {, @* r# t, a
 
) D4 v* y4 y/ e) r; V5 g该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。1 P+ X8 u8 o% b. c7 x
 / q( @! u, E5 L4 i- V* t3 k7 v" y) W
咋解决?
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版