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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表, g, A3 G# X8 }" s

) H9 S: H: K& {( g0 Y7 p
! u2 G5 d8 T6 E, W: R/ o  t5 L社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
7 r0 Z3 D$ R' `/ _
$ g- i9 Y) r- n8 g9 f& X提示:点击各主题,进入帖子,可下载ST工程师解答详请5 L7 X, S2 C" o! P1 k4 `
0 ~0 M7 Y- B- U, R

$ ^' X6 ]- I1 }一、通信接口1 a, d, `8 M: h& \1 P
( I- N  E2 i/ _$ W- c
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新. @0 W3 e+ p! o1 }7 i7 ?" o
2 t3 r- S. d2 q
2. SPI 接口发片选信号导致死机
: P: o2 m. H% P
3 C0 _' n% O/ a# o3. USART1不能设定600BPS的波特率& c( G" B& f7 F! ~/ `4 r; j- F
3 T3 X* s5 ~  F& b7 I, j
4. I2C 接口进入 Busy 状态不能退出" Y: W! ]9 ^7 S
8 c3 u  h1 A+ t0 z: N, d- U
5. 对 Flash操作导致 USARTU接收丢数据3 T8 f1 p( }: x: @& }3 ~
/ w5 y$ A, A# I6 ~; X
6. USB接口易损坏* W# V) r$ i7 A! T9 T( j) }

, G, p4 M2 a5 U7. UART发送数据丢失最后一个字节3 T. X* x% ~) {( ]

8 G4 `' F8 \$ A! t1 _# p7 {8. 使用 CCM 导致以太网通信失败9 J' S$ F# J7 M9 _  A9 g4 w
* t0 s) W' i# [
9. SPI3 接口没有信号送出5 j3 f* A8 o- S

2 @4 Z+ t. ?7 x- C4 \3 g10. 时钟延展导致 I2C 通信不可靠  V) u- }. y3 h9 {) S* H4 Q
1 [" v8 }1 X0 m  }: g* w
11. M0的USART波特率自动识别问题
2 J, ]7 c5 O! ]& B, J9 V. |
  |. M) |- \) m' K; l- c; U12. WK15 OTG做U盘主机兼容性提高
$ F8 ~7 |5 D, q& p& q. x6 C 5 C! z+ @6 u; Z; b" ?  c
13. 以太网电路设计注意事项
$ |# u. E8 q. O5 `0 v - ^, M- m2 E* P
14. OUG主机库在BULK传输上对NAK的处理5 b0 I- E0 V. h& U/ r/ `
5 v( x% a. E' f- k. b
15. 串口断帧检测
+ D5 V( `3 u( w- ^% L8 _/ \
& O2 a2 `% C! E' p2 \16. VCP例程用于数据传输时丢失数据的处理
9 O% Q( y  L9 f) i* r% Y) D) S% j2 I; c; L * o1 J# U6 H" X
17. STM8L051F3P6串口UART数据起始位判断的问题
/ M* ]  c1 `( K& i7 k2 a. y# G % V8 j" ?; m+ v8 g1 k2 t: y
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号2 f( e( v( I  P
% B+ B/ F& _( v  g0 Q8 d
19. STM8中UART奇偶校验的使用方法8 P& Z: S6 {! c; K8 c
; x) g2 _& l9 Y
20. STM32以太网硬件设计——PHY
; b5 A! i  z; ~; k2 }& ^% t
. p' Q4 \5 B8 I4 Z9 M21. 一个判断I2C总线通信异常原因的方法- a; R; ?2 j( ?- M4 l9 A' J
  {: d; {- {5 N
22. USB device库使用说明
- D" N: @3 H: R) |$ r, J/ H( x! U& p4 I8 d+ _1 @% c/ X
23. STM32F103上USB的端点资源* f3 y8 C+ n4 k
5 R. ?1 [# W6 y# I- n
24. 使用CubeMX生成TCPEchoServer程序. G% `$ ^" {% A6 c. y* x7 w5 l
4 }8 e, `' s8 I2 u/ g/ ~2 S) \
25. SPI接收数据移位1 E- v- ~) C- [* n  B3 I2 h

& V2 e6 e5 b8 r; y* x1 n$ W; J26. STM32F0中Guard Time的设置
3 R4 f0 v( K9 h" b; w! m
- Y( ?2 C- J) c+ y! w9 N6 f* t/ ]27. LwIP内存配置, W  o* o; v0 ~; Q6 Z- c- ^
( y* O$ A& h$ E, v
28. STM32 USB Device的简易验证方法
" w0 A8 ~, ~- h/ |
( }( A$ x/ a8 y; B# p29. USART 中断方式接收无响应问题的一种情况及其处理方法
0 F+ X3 b$ T/ u0 ~+ H( v) {2 M
* i) s; c' }8 f# k! l1 [3 o30. STM32 基于 Nucleo板 CAN总线的建立" g/ Y6 [1 b7 h* K) I3 m& ^# d2 c

8 L, R0 R  K6 y( \' d6 Q31. STM8 CAN总线的IdMask模式的讲解
' s! C. O4 Y1 ]8 m8 l
1 b  m1 P* D6 l% j$ J32. STM32F746ZG USB 驱动不正常 ) k7 V: F, \9 B8 g8 m

1 O5 ~6 ]2 ]2 a: i& F% r33. MCU在STOP状态下通过UART唤醒分析
/ C! \* v5 ~* `5 F6 K) n* Q  `, |( N+ Z, v& _! Q
34. 通过STM32CubeMX生成HID双向通讯工程
3 W+ p. N. M2 F0 Y* d# l
5 m6 d7 z& f$ g3 ]  w& g35. 串口工作在DMA模式下有时接收异常 ! a9 W: ~6 V5 M

( }- O' L9 i8 d36. STM32 Bootloader中 DFU使用限制% z! U( N- ?* S  A0 P

" c( J* i* _1 k9 p# s- b37. UART异常错误分析) x# U! U2 a. Y7 t

* U- [# p- Z; C5 ^4 ~, |" E38. 基于Cube库无法检测CAN2的接收中断
! U0 D6 P, e5 \5 `) K' Y1 N2 \* E. b2 L. c0 D* x% K- a* A
39. 基于STM32F7的网络时间同步客户端实现
( U0 h2 t5 y4 |3 c- M( ]
: K5 X5 f/ h$ B1 E9 S7 {8 P40. HID与音频冲突问题 8 B! L! B/ Z! y6 X2 b
" E& e( c& ]5 u# {" _9 d
41. 在进行USB CDC类开发时,无法发送64整数倍的数据
& S; M+ Q- e8 q) L' {3 n( s& \# W0 g* B
42. 从零开始使用CubeMX创建以太网工程) ]4 D- t. K0 l) n0 e6 S

% q( n- s% j, p' z& c43. STM32F4xxx的I2C总线挂起异常处理& m# O$ k1 E! S/ W% T

% e( d6 u9 x+ o- H( l* u44. LPUART唤醒STOP MODE下的MCU, L: [" {: W$ H! e+ D1 J

- q! D, W1 I* T' p: H1 j45. STM32系列 MCU模拟双盘符 U盘的应用
; ?, e9 B9 s' s. P: u( C) l; u7 q; c
46. CEC输出的数据和数据长度始终不匹配. z5 z6 b! B/ e, |
. ~  S) @% @& o9 @0 W% B! ?: O: Y" E# [
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
0 e& ?( D. Y9 X( g
0 V8 A1 Z5 v5 L8 a6 a; F% j5 G48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
2 G* f% W7 U7 A
$ o( p) m. R$ g7 }3 V4 I49. 增加UART接口应用时的异常分析. p. T4 q- {3 z" T* b5 o

2 d9 q9 h! d% R- d50.UART应用异常案例分析2 Z* \8 O, }1 }3 X& J* P& z
! \6 U5 B4 x+ A& Q: r- H" z
51. I2C配置顺序引发的异常案例
3 @% S8 {7 t" g! |  I  x3 B! A8 F, [% l$ l
52. STM32 USBD VBUS GPIO1 h2 z" h! Y) X1 q! G# I( W& J
- v* J* H" m9 m8 g  m2 l! b! l3 D
53. USB传输数据时出现卡顿现象0 C' }1 p. U; q# y; d$ s8 P" o
  A0 z2 O  P: ^5 h
54. STM32的高速USB信号质量测试实现) I+ `3 {: T  B' E' r- Q

0 q8 i- w7 l# i( ?) o3 Q- |2 J55. 基于STM32 I2S的音频应用开发介绍
* ~  B) D6 l" w; O) I: ?$ \9 |; i- P% v" L
56. HID_CDC复合设备在WIN10的识别问题  * C$ t* \, S, p! H& e  O$ ~- W4 b7 J

. `+ D) ?1 f5 K) t2 z% b0 N6 X57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  + [2 B- ~& Z1 e
( k. c: K9 s% v  }) y
58. 一个关于LPUART输出异常的问题分享  
! w' a7 t$ _" u  K, D5 S) a  o" O$ H+ \

* n7 _7 I( b- @' {; N59.通过 DfuSe 工具控制程序跳进 DFU 模式) D. Z% L! @- f& V) @

3 h& o# q' r6 A7 W+ [60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)0 F2 b! _: K. c. r1 R

0 T0 k' l3 Z9 x5 X" B5 G( L" _61.一个因初始化顺序而导致异常的话题 (2019.12.24)8 q0 j* F4 C5 P8 j# m/ p0 t; O

" |0 O! [7 N5 E62.MC SDK 5.x 中增加位置环 (2020.5.29)7 p4 }! Z7 a# Q7 W( [% Z7 Q8 F

) k. [. R3 u- z0 `" b: e63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
0 }3 ?; x, v" M( n6 a3 T
2 u* V, P# m# h  ]8 _64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16); Y3 n0 h: v5 P# q; K. q. A. i

" S& g" T: }3 I二、电源与复位* }  X: ^" x# b2 O

3 ~2 ~, R. w% s8 L2 d1. Vbat管脚上的怪现象/ l5 X/ N" g  j$ B5 t$ l
3 s" @, d. P  J* m, X: F3 D+ Z, R
2. 上电缓慢导致复位不良
  B$ R6 N$ E% c2 H% I
# I, N+ ~+ g% k. [, V7 K% p3. 关闭电源还在运行
& }; z" @% h. K- j
  D2 W  I* r* ?8 O# K& L4. 使用STM32 实现锂电充电器3 D+ H0 J6 \$ I1 R) H

/ t  v3 u9 ~- B  [# |) v- E. y5 s% Y5. STM8L152 IDD电流测量8 t  [7 @0 _" d% ?6 q

2 e& C( g, C% f8 S! `( J6. STM8连续复位问题) {, \: V: a" W: o$ e$ ^6 G% |

. b2 T6 e& c4 X4 b9 A$ l7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
4 K6 G$ e9 Q5 l( j$ z6 R
8 i7 `; ^8 N$ G6 t: Q8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流) F5 m" Y- {8 ^

" j: z1 u$ C: F, K' N4 H9 q/ V9. STM32F7与STM32F4的复位序列比较. C5 V, o# p" `% f
9 O$ r( m  x  B8 O# v2 @1 |1 ]
10. STM32F107 复位标志问题
! }* ?$ T: B+ X5 f$ Q  A( J) I, O8 a% U* k  \
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  $ N6 G+ B+ ]0 R4 X: ?
2 g$ |7 G8 D7 [# T: D: N
12. Nucleo_L053不上电也能运行
' J! F6 t. ^3 N6 b% F9 Z+ b9 C6 T
7 V; T8 s* Q, D5 Y: X& g" F13. STM32L4中STOP2模式下的漏电流
6 Y9 \; {/ s; L4 ~: V0 U2 L1 x& v/ Y0 ^; d+ l' A9 }. o
14. 在没有外置晶振时HSE_RDY异常置位
8 b% z: ~/ |$ W( p( ?! }
+ A" ]- H, O/ \( S3 W15. FLASH被异常改写   (2018.5更新); E% h4 s0 {7 A1 L# T6 K
( e. A& a- L& w) J; A$ c+ j
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
2 Z4 r  l, y4 b: k+ C. o% s! {- O$ A6 b- m' p
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)
) d' l2 I# X, x  u2 O! o0 ^9 K& @+ r" A7 ~
三、IAP和Bootloader7 b- L+ l9 X" O+ ^
, y3 S( }  J, X: d8 f
1. Boot Loader与上位机通信不稳定1 b8 b9 ]# W9 J3 x* E/ F. D* \
# |& l" U$ A1 C$ v
2. IAP+APP 模式下不能启动 RTOS
7 R6 o5 i2 T, |9 m6 u5 n* N" Q4 F
  _- h* ^. L: w3 s' E) C3. 从 IAP Loader 向 App 跳转不可靠
5 Z( p( A, ?) T + \8 V% l" y8 R- M( w
4. STM32 MCU IAP例程跳转到APP代码简要分析
9 D5 Z) w) @( I4 j* R
- p. o/ }+ F+ ?+ \6 J! m5. STM32F091从自举程序向应用程序跳转的问题与解决
! z$ _5 a# `1 L/ l/ K% B& r
& e4 Y0 s, J0 |  u+ L& ]  `6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
- G1 T6 e. _" p/ ^% A. A- q5 }
7. STM32F0启动模式相关问题探讨
# \) @$ U$ C; L
2 f$ s7 ^4 [: g+ Z1 @+ U+ x7 H' A8.STM32F091空片使用System Bootloader下载代码8 u# R  b4 C* g' p6 J

, Q1 o- X# @( E. J0 D7 `) U# L9.STM8L  IAP 应用程序中编程指导6 ]: U) ~  b$ l6 j0 }* f" F3 L

1 c8 t6 L3 E5 N4 ]+ j2 K7 z10. 如何通过STM32的串口实现简易脱机编程器
+ I; G* \9 i& s' K. |
6 V  l6 ^& R8 L  z+ A4 \11. 一种从用户代码调用系统存储器中Bootloader 的方法  
. j! Q) d- f( v: e+ Y3 U% S" V& R! y; O
12. 利用 USB DFU实现 IAP功能5 F) w& T. L  @' L+ H7 i4 X8 T) m# l
/ D' K! y3 K  R5 o! w8 |
13. STM32 Bootloader中 DFU使用限制. a% u/ Y( x: _; r$ G+ a8 U' a
1 ~4 v1 T# `7 K' a  I7 n
14. STM32L011x和STM32L021x启动模式注意事项5 G) m# H4 ]$ s: b4 d- i/ ?
# K- j* V5 u7 z& Q. E
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
; Z" j$ W9 C, Z5 d; d  I' |  @1 T: _' R/ h
16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
5 f; f& M  V% }! ?+ B- X1 }* H" A+ E/ ~$ h
17. 如何使用STM32NUCLEO 板来测试串口Bootloader
* _* d/ n6 H. d+ X. C/ i& u
, {9 @& d4 b6 h7 l1 T" o) q6 ]$ @1 o18. 在STM32L011上通过I2C接口实现IAP8 f' D6 j& B+ o* B$ ^
! n2 [; u9 z7 E% Q, s, S8 p5 h+ j
19. 在IAR中实现通过将程序在SRAM中调试的方法
" g, Y  g' P, g1 v; s# B1 Z- ^, A* E! X6 Q4 n# P+ k% i% E
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题% S7 j3 [  m; z6 w( ?1 `; r
( M2 |- l( A6 N6 G6 B3 ~: F
21. USB DFU IAP 例程移植的两个话题5 W- [1 T8 |8 n  k- D
8 i  I$ U1 k1 b' J* X' f1 l( E
22. STM32F769双bank启动
3 G9 B9 v( D/ Q1 s# i2 A; b2 O) y( l/ L* v' _% x- n
23. DFU加载 工具 DfuSeCommand的使用
1 |4 C$ H8 C. X6 \+ s( Z' d, o% Z5 z% }. \7 o3 R/ f3 n$ p, V' t
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
* B3 T9 z$ m$ n$ z, Y' Y
/ z& M1 Y0 X  F- I7 y4 ^+ t25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新); y* w: D! [% i; C1 l: ^
$ `( P& A. i. R. d5 d: p
26.STM32 Bootloader异常复位案例(2019.4); k  f/ J, ~& e

2 @0 F8 q, {& O( B  Z4 u- N$ d
四、存储器
; _1 `  D/ y2 p% ^0 i
3 w. J5 z' Y; h" W2 Z: L$ ^1. 对 Flash操作导致 USARTU接收丢数据
& p* N' H5 U) _( O7 s0 B
2 ?7 ?, A  q5 h& a4 X. a& b# g/ l& X2. 使用外部 SRAM 导致死机
* O0 ~) D. P: N" x+ `' A0 L  r& I
$ u: G8 Q' Z) E3. SRAM 中的数据丢失) a4 D& b' \0 v" e6 f: H7 W& f/ d

8 T, p$ u7 w. [! [7 c3 K" ^4. 干扰环境下 Flash 数据丢失
, y' `3 {7 u# D  j * ~: ~" I: d! G: l5 ]7 L, J& R
5. 使用 CCM 导致以太网通信失败
# B: x! m/ a/ g
0 R8 @/ c6 U+ Z  N2 ^9 O6. STM32F429使用外扩SDRAM运行程序的方法6 O' G6 u7 K) N. R) y* Q  `# `

7 c! C& I! w; h& k  [: e* b. m7. 使用STVP实现对STM32L1系列EEPROM预置数据* D! L$ s" U, {. i- s7 i
7 Q3 l, Z" c. d' @
8. FreeRTOS RAM使用情况及优化方法
+ f( M" d4 m. A
# C* V) h$ A! a2 q% I* m) m8 A4 w9. 在IAR 6.5下如何将数据存放至flash中2 ~5 s: y+ M% C
; N; c% `* G4 q8 P# k9 ]" f
10. IAR下如何让程序在RAM中运行
* a. M) Y$ P* e9 z" h/ T) h
8 e8 ~9 t$ X( H9 A7 d( O11. RAM上电后初始值问题
% B+ i' _- l: h3 Z; a" J) @4 a' B% n2 }
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计( m0 p" M. ?) p# e
9 ?0 _3 X7 N- d" R
13. LwIP内存配置1 t$ K- i. d' n! V3 g4 ?

7 ]2 H8 h/ ~. T) t  v14. STM32F2高低温死机问题
( b* v, S7 d2 V& @9 ?; g' `; t5 R$ x) G, c
15. 使用STM32F427的CCM RAM时遇到的问题* s5 l" {$ r* ~5 W
/ {/ B) \+ n( Y* m  j: b8 T
16. 利用QuadSPI外扩串行NOR Flash的实现  7 p3 M' e. O# y6 @
' v: |" O6 b+ C3 k: y- m) A# c. _
17. STM32擦除内部FLASH时间过长导致IWDG复位     
  U3 Z, d- j/ c9 i# _8 l7 |3 I' V# M. H4 v: j$ j' |8 ~; D+ V( Q

/ u) f- Q: m* c/ [2 R) h+ Y0 u18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
: Y, j+ T7 e$ `3 ^
9 X0 E! z& A* {, b  E2 v- ?五、模拟外设0 I1 U: V% s8 [+ Z
. B' E7 z7 A# e. G; o  Y
1. ADC对小信号的转换结果为零( p: T- Z# O, d) R: y. E1 R
: R3 F; u2 Y9 f- e8 ~
2. ADC键盘读不准
/ Q* z/ u1 D3 p( V) H, R ) s( K4 Z+ H, O6 K: g0 |: m
3. 扫描模式下 ADC 发生通道间串扰
9 u: m# k' P, |* D$ h + F  P% H" z2 P4 ^4 @0 E0 r& B
4. DAC无法输出0V的问题分析解决5 J3 ~5 f& S' o9 G; [# \
; o0 H& D) c5 e3 ^
5. DAC无法输出满量程电压的分析解决( S* ~, x3 ?# K* |( i# ^; u; b# g

- d3 V" `0 C! G6. STM32F30x 的ADC 采样的傅立叶变换( S! v2 v: w' _, @- d0 w

$ J. M& Q& L4 @7. STM32 F1系列 DAC的示例详解+ l; `3 q: q/ U# R! h1 c4 Z
9 d/ p" D' @) w6 o
8. ADC 连续模式采样浮空引脚问题
/ A' S# S0 m5 `# o) S  M+ e& x/ q7 }5 o7 S* w
9. PWM硬件间隔触发ADC
; |! o' f" J# k" S
! ?3 H' I* A* l+ b& G2 c$ f* R10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC8 X( I. i! w$ j- s

% `# g9 m. B: {3 o1 v+ I11. STM32L4 系列中ADC 通道配置上的区别; p7 z$ T: P- X; T9 V
9 U- o" J( l3 y  ~
12. STM32 ADC模拟看门狗及其应用
3 V, L# j5 v* b- c( j: T! f# A) w& {7 J3 w& d, a5 r
13. STM32L053 comp2 比较电压无效问题
# O. M- B$ E% S8 ?% W
" {% s/ q7 K9 a" e7 J5 |14. 运算放大器OPAMP在STM32L4上的应用
. F- ]9 X9 t! }* H5 |; r5 b
) o; Z/ B" i6 e) o, v15. STM32 OTA例程之ESP8266使用 6 z9 N* d3 d; h7 ]1 [4 Z

3 B$ s# u7 J) }$ b1 X  Y  t# C16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)/ B3 h% A) x$ _! }7 ?" S

7 W% N  S3 F/ c; I六、计数外设
5 N4 Y, _3 o4 A5 }2 G
- L$ A6 y9 t) T; N9 K* e* S1. Watch Dog 失效# E8 i2 M7 n! q; H: K2 a1 ]
% K# q* n+ H6 B5 K3 Z2 g
2. RTC计秒不均匀2 K- v" l$ X4 ]: q8 u
, B3 }# k7 o. q$ c, s) Z
3. 软件启动模式导致 IWatchDog 失效8 L- v( k4 r  P6 |+ Y

! \" `  u4 c1 i2 r4. STM32F030R8 定时器移植问题& F( S2 E9 s6 `9 r7 ]0 Q; L: D
; k" t: g) _2 a% P+ |% W) |+ G$ l
5. STM32F0使用RTC Tamper的几个注意事项
5 r& }: Z  R2 Z& T& W, E/ [! F9 y- m5 |$ C9 |
6. STM32L053可控PWM脉冲方法之DMA5 W* k! C" x, S5 f
! W8 U6 K2 G1 a2 @6 q! x
7. CounterMode,OCMode与OCPolarity关系
9 @1 s( X) k) U
; S) u3 N9 {7 ]- U& r8. STM32L053可控PWM脉冲方法之DMA. r5 G9 F$ Y+ `
! A. m+ }& P# O. w2 g
9. STM32F1通用定时器示例详解—TimeBase! g0 \1 O! {9 [3 G4 ^5 z

* [" l6 w. s( o10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals- [! t; {0 h8 z

6 y9 F5 S. v1 O4 T8 x. B11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
8 D- F+ a- P) k' q! q6 u& P. {! \* x# ?  s
12. HRTIMER的多种Fault事件联动机制
# y( A; ?  y0 L. k% t! n- F& P& H 0 g" q3 [7 C3 f6 C& t
13. STM32通用定时器 示例详解 —One Pulse
5 j/ q7 y3 ~, F7 _$ `& b! r/ [* H  G- M* R5 R" a% W6 k1 {$ Z6 K( Y
14. 如何用LSE校准STM32F4内部RC振荡器
6 T3 C8 M) L% g" |  S
, C7 Y- o) E; ?# U# x15. 一种使用Timer测试HSI实际值的方法
+ J9 O# S1 Q0 ]" ?1 n
' B" Q9 u/ n3 O' V/ ~16. FreeRTOS定时器精度研究+ d2 [; [. _: Z: r. R( U: g

- ?* p' P; s% Z17. HRTIMER产生多相相移信号
; U9 e3 G. V% k% |1 ^& K3 F  l  L& H' ?8 i' {
18. 窗口看门狗启动时异常复位问题% _) k( F6 w# N$ R3 R- U9 ^1 W* w7 ^
7 V. v% Y, F. r4 \: C2 I
19. PWM硬件间隔触发ADC' h- S5 `. {$ p' Q- d7 N
# C# i' r: S! J3 N. ?
20. STM32F030低温下RTC不工作
5 `) ]& i- c+ p2 e6 Q! @5 |* G; W" _* w/ s% h; G
21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   2 k8 d1 H: q+ m5 O4 R

0 C( u* w% L1 P& p- Z22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)& r& r0 _6 N3 W0 A( z  c

; b2 ?* H6 O1 x3 A23. 基于STM32定时器实现定制波形的示例 (2019·7·25) % \4 e! b$ B0 [" _
, F/ R/ r8 `3 `* }( D0 s
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
) l) z# C, ^; k  w
3 N% p  Z. c  Z0 E- P1 p& U
25.MC SDK 5.x 中增加位置环 (2020.3.31)$ f  w9 J; G2 x' y( V/ E
& G3 E) _$ e/ V& m% s3 [
26.STM32高精度定时器PWM输出话题 (2020.4.29)
+ \7 z4 p( I& }3 e. \4 L
  ^- F2 Q9 S/ g' w( v

2 A3 U- C) @+ @7 c27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)& ~* C' k! @+ @3 [; B
8 r' s6 R) X, P' d; ]) P
七、内核
+ J' j5 D( }- n 3 e8 K0 K- T2 }9 s1 ^, [
1. 使用指针函数产生Hard Faul4 }1 f) c9 Q. i3 d
  A& A. r( K* \9 g5 S( u
2. 调试器不能通过JTAG连接器件  X  W1 b2 Y+ Z4 ~- w

3 E( I$ I" S5 E3. 鬼魅一样的Hard Fault0 f  `1 `' \# b4 G7 J
/ G1 i7 {& E- ?) v# l: i
4. 进入了已屏蔽的中断[
0 F4 g# j  F5 q" Z, m- ] 6 x- c7 ~0 X$ s5 o# [
5. 浮点 DSP 运算效率不高
0 F' ?/ ^8 [+ K6 w; c0 R. F' U. s0 b0 K: T. o8 ^
6. STM32上RTOS的中断管理$ R2 J) B7 ?* @" Y' W) I. ^( j0 I

. j1 J  Q$ l5 I7 m7. STM32F7与STM32F4的复位序列比较: J' l# R- t$ R/ q8 h3 y

: ?4 s0 X$ E3 C. U. O8. STM32F30x 的ADC 采样的傅立叶变换* c$ N' t7 ^- ~6 a' U/ c; x( J: F
* C! H7 U3 @/ u6 z, k
9. EXTI重复配置两次导致误触发中断的问题
! H2 d. v0 I" L1 E+ F  X+ s
0 u- \# t- p# ?# c10. STM32F3xx/STM32F4xx使用浮点开方指令6 M, V- x0 i7 @0 ~' \( Z

$ c( N' d3 c5 b. ?  p, f: Y11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响/ d" g# [& V/ ^- Q

( H7 ?  U& B& b 12. STM32F7 MPU Cache浅析  
# T( j' g% G& i5 S! G
3 z8 u* p* |2 ~. S6 Q13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)5 ]6 j* }. X$ f% v8 R& R
0 z  E6 ?9 T4 M2 s
14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新). K3 M; K* S7 @( @
3 U6 U7 y3 M! d

) Q; ^, N9 R+ p4 a# c9 a+ U八、系统外设
3 t# }0 [* }3 j8 D) f8 @/ y( l , Q/ X5 H* X& e$ r# ~/ U, _* V- q
1. PCB 漏电引起 LSE 停振
% s0 W/ m# f4 J
1 L$ y8 P. \, V2. 时钟失效后CPU还会正常运行7 \& V, U6 E- h

% \# |1 u6 z* ^; G7 ?3 R- ~4 G3. STM32F2中DMA的FIFO模式! H* B: i% \9 v/ y

: J) n# b& r: \4. STM32L053的GPIO翻转速度的测试8 }/ l/ C% ]: n0 a* o  h6 Y
/ q) p; Y$ `9 s$ U1 `- J
5. STM32F4xx PCROP应用
' j. m! e2 Q: d: u# Z7 G! }, o
5 T& G- C' u1 l, V8 D( G+ U: p6. STM32L053的GPIO翻转速度的测试2 w' u5 q: N8 q/ {

2 A* e! V- j( r2 W+ L" P8 K7. 如何在IAR中配置CRC参数
2 ^% D" K  g& l# n
' y/ u) {! x, u2 |& t! y8. PCROP区域函数无法被调用的问题与解决% ^* ~2 A0 _3 @5 H

7 ^! |6 V2 E( }. h% [# S  z' O9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
$ V8 L, y+ M  i- _/ j" T! k  F  ~, ^$ t) R2 p0 C- p
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计# l4 c7 W' R7 a; [. p: T& L# I

) [* _7 P6 r. M0 A0 ^11. 如何用LSE校准STM32F4内部RC振荡器
9 w* x! f$ U1 G" E7 S6 L; R
9 _/ q, I, y% [12. EXTI重复配置两次导致误触发中断的问题  . B& ?& o* q8 S' g9 A* c. S8 b

1 D- _$ t# x4 ?. y13. 时钟安全系统的应用(LES篇)  + _1 j3 ~& Z9 [6 u: V* E

2 N4 @: U1 ~" `& b
14. 利用DFSDM开发PDM麦克风应用介绍  
6 q2 S' Y% N/ K+ Z# |3 u
- ^$ a- l) d7 l8 X
15. STM32H7的FMC外设在DCACHE使能时运行不正常
$ @* F0 I" t* l; X: i# w
$ H3 f$ u4 H6 o4 a' b16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)0 ^) \' |8 I& `; t& r' ^- b

$ _( S1 h9 i5 Y* L, P. M* l: p
. u6 B7 P& y) k8 t% C' W  x九、标签和收发器+ ~! |1 B0 P  K

/ k! V  w) V7 H# j$ ?' F$ Y1. CR95HF的初始化步骤
& G" l( J, ~/ j
- e9 a( }" L5 z
+ w4 c) U# W% i+ c, O6 Z( F; G8 U, x  M1 H; R
十、生态系统
* `; X& p% p) X * o% m' s6 K5 g. q# ^3 a2 J
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题
" R. e$ c( U! N! ?, ]; d5 Y9 a ( c: l# c- c0 j, ~* S
2. MDK Logic Analyzer 功能在STM32中的实现问题
4 b$ b$ n7 i. P) ?
+ S8 M- r4 I& F  L! L% D3. 在IAR6.5下如何将数据存放至flast中3 }7 t+ j6 j) ?" x: Q! T. j

$ `2 g2 a5 a4 N1 P4. FatSL移植笔记
' g6 u% b( ^9 X4 d$ V: ~& j6 T
( r; D( m7 H# v5. Keil中使用STM32F4xx硬件浮点单元
- I( a1 A: w, b
. {4 T% R6 B  G4 s0 F% s6. 如何生成库文件(MDK和IAR)( |- D0 s& W; \8 p! _. T0 t2 k

# ^% ^1 @: U4 y( r" d7. Nand Flash文件系统解决方案. o! {4 \2 D2 y& J2 v0 f

$ S/ [3 q( o( B; j8. STVD在调试时弹出“Cannot access configuration database”的解决
* z) F9 R! B! _
8 ]. D3 P$ d: j8 E1 F) q/ ^9 T% n9. RTOS低功耗特性的设计原理和实现" _+ r; q) _) J$ l6 D% E9 Z5 `

! r# d1 L+ f7 X3 j4 V8 y2 f- T5 t- j10. IAR下使用J-Trace进行指令跟踪1 E8 d% M) w$ a0 V& |/ o
0 y  y/ x  J& F  M
11. STM32上RTOS的中断管理7 g4 j& N. l) b- M$ i
/ p$ L: F0 Z1 H2 i7 y# K
12. IAR下如何让程序在RAM中运行
3 U- L- F4 w6 D$ l
$ p8 v+ n$ G& p7 O+ {) m* s( b13. 如何在IAR中配置CRC参数1 ^# y3 D6 ~. v$ y' z. n8 B
! [# b( S8 i9 s6 k. ]$ Z. R7 _
14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册
3 m$ |' N  b6 T' _: U6 a3 }
2 C2 p* ~7 Z+ |4 J# w15. 使用mbed进行STM32开发及STM32F0的时钟问题
7 |& L6 j) Q4 ?9 W8 U
& L) U8 N  [1 c16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能% {% E! ~, |) d2 P& M# d& M
' D4 \% S& P4 s: U
17. 多任务系统中的不可重函数使用注意事项
8 @/ n# V, h: E% C  S* T
) P4 q! M4 x* t, J18. STM32 utility的hot plug功能! y2 z% i# K6 [7 E8 e

) s7 {+ @5 [: o+ m19. 如何将CoreMark程序移植到STM32上6 \, `+ |* v# I2 f

; m/ c- x! I6 _/ d2 h9 ~: t! W6 @20. FreeRTOS定时器精度研究/ A5 R0 m5 I7 ]$ ~$ @. a
6 n: |2 W2 e& S- Z% @
21. 如何使用Eclipse和GCC搭建STM32环境
. |( j" A/ z' ?& t& K9 N1 u# d% O1 Q5 `2 ?. @6 D6 ~% Q
22. 如何建立一个基于GIT的STM32库" S2 ^% R& p6 W3 _9 }5 Q( \/ p
* [. b8 ?3 B; a' ^
23. 从零开始使用CubeMX创建以太网工程
( o1 V% }( V6 T! Z1 ~1 D  l. a) m3 _+ y* B# K) g
24.从STM32Cube库向标准外设库移植FatFs文件系统
( P; y. `& u! U, N+ f" s' l
  o; X8 x2 y, f- L1 J25. 基于 STemWin的屏幕旋转
3 e+ [! P+ ~6 P8 m$ [5 N! C- H* N  I
26. 编译软件 Hex文件烧写 7 f9 S# S+ a* |3 H8 t  E' N1 g
: f$ f  d8 O2 b# [8 G
27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
$ q5 |: X+ E" ~$ t7 ?9 v2 O% n8 t% T9 G3 w. g6 p
28. USB CDC类入门培训( [, B- h( r0 H

2 F" C$ C5 g1 a' E: u29. USB DFU培训 : U/ j9 A: O& }& u7 P) Q1 ^

* {9 Q4 e* ^) T; a# u3 J1 M30. 用于量产烧录的拼接Bin文件操作
& p& [2 m0 d9 a. S1 q2 K
* r+ \3 I+ G, a$ e% ]31. STM32免费开发环境该用谁
+ M3 I$ g' z& ?# i( d( w1 w+ O, O& X- \/ l; }" A
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)' I2 I6 p4 v9 h/ b

& r9 Z5 |0 B2 P( s7 T% I( D+ w33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)' O, N$ Y5 B9 K- c8 x
) K! y* X# ~4 Z- q: O
34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
7 F: G6 O4 j- h: N: o# L
6 A. W  C+ y$ v4 t# S35. STM32 FOTA 例程之 cJSON使用   
8 W3 M3 l! l- c; u: D
* \% p6 D6 {; D* x4 M. n36. STM32F769DK 云端固件升级例程使用说明 ( D  y3 A3 z% U$ L' Y9 \" [

5 U) E4 a3 {( L37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
- @- W1 I6 F$ L) O& S$ f( \1 {, c: m6 e2 [
38. 基于 STM32 的阿里云物联网平台方案 ; ?9 Q  t6 F. L' f, [; J* C

, M" p+ N+ q, i5 W( W% ]. {6 A; G39.AliOS 任务上下文切换原理分析  
7 a6 n4 C3 l& S% j) E, `3 I8 D! R# z# W) F/ y+ s5 r' |' X
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  " c3 |1 C# D# E2 {

6 n8 z$ y- i% @4 T/ [. G: k41. STM32F769DK 云端固件升级例程软件开发文档  ) \- C: m6 a5 S1 Y* x) I6 J
# C3 T* ?. M6 \, V
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)/ r. ]/ F( J& n

  c7 T' w8 S8 E. {7 h, `+ o43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
: o( ]7 D9 U8 o$ E. c) S8 _; E
- E6 W0 n0 P7 m! i7 j* K0 K4 J/ G& ?44.零基础快速入手STM32MP1 (2019.9.19)
2 n9 q; t1 X' g$ f& s' Q+ ^( a0 Q# u2 [
45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)8 y( G7 p- l+ Z1 r4 Q

' H6 G% v: M' E- L9 Y  K十一、调试
0 @: b- T' i4 C! n( ^" V1 J$ `' I
( l; o; S7 K: p1 D% h, b( Q' R/ N1. 关于STM8S SWIM Error[30006]的分析
# F" E* `* v; n* Z3 D. _ ! E; S) p" l0 X
2. STVD在调试时弹出“Cannot access configuration database”的解决
+ T6 }* z6 ~% d+ v% I
! [. }; n3 s; c$ }, u3 @5 r; D3. IAR下使用J-Trace进行指令跟踪2 S2 R/ B- S+ C: r, Q  v
) C5 [5 P  D2 P3 }) Q
4. 菊花链 JTAG STM325 l. j! t3 X1 s; Q$ D+ {3 _( p

( f& }; f( N7 b& c5. STM32F411CEUx 能下载程序但不能执行
8 c( ?6 W# D/ V
& m2 ^; J- t6 j) m- W6. STM32F103C8T6 程序上电跑飞8 N' y+ T0 h( w0 C6 N' t" T

  q# u, V6 Z* Q7 e7. 使用STM32 ST-LINK Utility 设置读保护后不能运行2 W& L" B. t! S6 C" ?

* Y/ z( O! b3 ]9 }7 h/ g8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
* g9 ~8 A" u6 J$ P4 b4 k& t( G5 [0 t7 \  G+ p5 p* J! m
9. SWIM协议的GPIO口模拟# y) ^. _4 _# f

  I( J2 H* u$ E# Q% }10. STM32F091空片使用ST-LINK烧写后复位不能运行用
; A3 h8 a1 j9 X/ X
$ s4 P4 j6 m. \% m: J+ w1 Q11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)
# L+ w) d6 v" f7 O
& h; t" b. F% D+ r* S/ H) e8 c: g12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)  g& V/ E. G. u5 Z% Q- C

4 s: a  R3 i1 ]! I) S13. X_Cube_ClassB代码移植 (2019.12.24)
9 }4 y! X7 {& @. T# r8 c7 _$ d/ _# W8 i
# @3 P5 l  |9 B9 F( {6 H
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)( a+ V0 n3 @3 \; Q. O5 @
3 R9 s9 Y8 F# f5 n8 l
十二、人机调试
$ J, V& \2 ?7 x+ X1 L
0 L7 _5 g8 }0 s$ ~5 \1. 一步步使用STemWin在STM32上开发一个简单的应用
; s! b% G% |" C+ }6 l$ r& }* t
/ k/ F8 Z0 X- ]7 C( \2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计! D- Q" ?0 m8 }- j

9 S9 E  s& _, t/ O' P' z3. GUI方案中ALPHA通道处理介绍" k  `) p6 k/ B
% Q3 c& t5 e2 D' `6 v' W
4. 基于FMC8080接口8位LCD的STemWin的移植7 d4 J, A2 Z+ g+ `9 E! c5 a: l
% E: H' c' x9 ]! ]4 L% W1 C' H  K
5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
/ s2 f& K9 {% {! t9 k7 c1 d% ]; p" N3 y' C) d/ Z
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)+ H4 U& d4 B8 T1 `
5 h! W& h# S. i4 l9 r6 M2 _7 [
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27). c" N: C0 s; w! K5 E  V& R# ^$ [
. J: p& Y, }$ `( q5 L$ J; h
8、STM32L5中如何关闭trustzone (2020.5.12)
8 [( n) Q% d4 h+ Q- T  n' b
$ @9 R. u. T. O! q' H# V* S" d; F, |十三、马达  S0 P8 Y: C2 @5 S2 p: T# C
: g2 s! Q" @! \( A) o7 s: B
1. 电机控制同步电角度测试说明. n. r& x9 ~7 ~/ F

' i& c& ?3 o# N! _3 `
8 A6 |% z2 I) V# w' d
8 J5 l& X; W" I2 z, m3 o5 K) H十四、安全% q1 o5 @9 g: u. S; E# T

9 r+ \; T$ x3 p+ Z1. 一步一步使用STM32安全启动与固件更新(2018.3更新)/ d! t& d! z2 n: F, l
/ k! f2 c, T% `; f9 `8 [

5 I7 _5 W1 @  @5 u# U8 A十五、其他
. Y6 h# r3 y" p% N2 c) Z9 T

# ^; Z( k2 R" b. `  k+ T2 @3 w1. 跳不出的 while 循环4 Z! Z6 W2 F0 D, q8 t9 d
$ i9 c3 {( L% B- R, x; _
2. 外部IC连接NRST导致MCU内部复位信号失效的问题
3 a+ q, `6 G/ e* Q- d . x( \1 E3 l7 _- |# j- o
3. 潮湿环境下不工作
/ [3 D6 ^) W& l, N2 W5 S" z 2 `( H! r  t( A3 c, E# l4 n9 s
4. PCB 漏电引起 LSE 停振
* i% H! U0 X6 @ " o& E% f  X+ r2 \" J0 F6 H
5. STM8L152 IDD电流测量
2 [" S, u: L) h4 g
+ N7 D; G1 o$ T& f1 T. D6. 使用STM32实现锂电池充电器
, O6 b2 O7 j# k1 U$ a , S* w( i0 c& x9 |% Q
7. STM32_STM8硬件平台基本检查
  u* _* X" ]) S2 J6 `- G' U/ }
1 p+ N! n8 Y' C8. 验证STM32F401在STOP模式下的电流* @6 L% o% G; X, o4 T$ A% [

% r0 U( t! {" {9. P-NUCLEO-IHM001 电机开发板串口调试指南; Q* l$ P; j9 N3 M
  _# |; c7 s+ W. r9 q
10. 一种计算CPU使用率的方法及其实现原理
! F0 q' h# A, Y( v. `7 Z
( B7 j$ P! }* s' U- s11. STM32 RTC不更新原因分析
1 t/ B1 u0 p3 u* S' K' S  ?
( T  @. Q, k) y+ B# m* o3 L- ^12. 关于ST库函数的代码性能对比' B0 p8 S3 I+ B) v
3 e7 p5 [- o. r- E" X
13. 在IAR中实现通过将程序在SRAM中调试的方法8 W; M4 j% n- W
1 |$ K5 Z3 E9 E: T! d; H9 K. L# V' i
14. M95xxx EEPROM写保护配置
: y( i$ ?8 L& h2 k) |* ~. X' L0 C8 A
15. 4SRxx的GPO的属性
* [( p( S* g( |  l/ n  V) C$ D" B, G3 @& W# W
16. CR95HF的初始化步骤   ^/ s7 D: R0 g: N. D, J
: ^1 v' S5 k) }1 P- n% x; f* w
17. 电机控制同步电角度测试说明  
9 N# k  n# m, A$ @
' N9 w, Z  Y0 W0 {( f0 G( P18. STM32+BLE通过 Notification与 Android应用程序通信的例程
5 A" q' w7 y# j5 T! Z" U0 t# B
5 L" m  r6 p! k# M19. M95xxx EEPROM介绍( \* e5 k+ j1 d6 G: V" t) u
# `( Z3 J+ }- W1 x3 C
20. STM32 DFSDM测量温度应用 2 [2 B1 J7 f% Q+ r& `. x
" g: A' Q  l( f% T0 G* h; s+ H( d! m/ @
21.代码实现PCROP清除
- u3 }% B! W- ^2 ]" M
- |# G" I" [4 [" e22. 理解与应用MPU的特权与用户模式7 S; j+ j  w3 S8 t* s) m

' Z& w4 p! z6 w5 |' Y7 ^1 F( E& i2 Z23. 用于电机控制单电阻采样PWM变形信号产生
7 J7 B9 y2 |5 g0 n
9 N: n; j6 Q: N9 k0 U24. STM32L低功耗模式唤醒时间测量$ D# k( }5 {. E# }/ W

+ T& u1 y( C: D% ^% j/ U! O25. X_CUBE_SPN7程序电机启动抖动问题. M. I4 Z" {/ N" P% R
, y, v- S' {3 g5 U7 m0 A
26. 发现STM32防火墙的安全配置. X$ E: ?8 |' c5 N* h: J5 S% j9 i

7 x3 u' \8 i4 y# y8 R# n/ _" C27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
9 Z$ B2 p" N& ^$ W( j; F+ }* A$ n2 @6 Z. Q) k( H
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)5 X- K! F' p; D% I: d

6 ]" r$ U, H2 v/ S
温馨提示:
4 g" g( u. I# Q7 A3 F- r1 g
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
1 p, T: f7 o' [/ T9 p2 n

& W" \* k, T2 ]- l6 ?4 G: }$ h& |9 p& V) d, i1 |$ X

! b4 c% D  ~( o0 P
) p) |4 S; p' z! J" z$ O
  [4 b, w6 k5 h# q& ?2 l+ M4 I0 J4 B' C* d7 k# `

+ V4 g. S2 i7 P3 p+ u" T
4 K  F, Q$ h2 A. Z$ S0 n, E
; d: I* }$ c5 Z" U4 K5 c/ K$ ]) E- V% R0 `- ~# i

评分

参与人数 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
好详细,多谢分享, Q4 z( m' K3 t0 @! a1 s
5768340 回答时间:2018-1-13 14:42:54
HI    \! }7 W% O) j. Q9 t* t
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:7 {; S( `' A  E5 M, K7 D
   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************5 W3 J) B- g6 I% r
  2. 函数名称:Cdfinger_Bspspi_init  m0 F) ?- ^! M1 K
  3. 函数作用:spi初始化函数
    / t; Q) m! S4 M9 v# _/ [8 ?
  4. 备注:
    ' q& {0 \' A9 o+ m/ @& U$ f
  5. ******************************************/" {# ?1 D; w1 ?* Y. {$ N6 ~
  6. void Cdfinger_Bspspi_init(void)
    & r: \2 l2 A9 x1 r# Q
  7. {
    + D! c( p' o7 ^% a1 w4 h- }
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    ' S# J' o9 E8 L. `$ R' ]% C
  9.         SPI_InitTypeDef  SPI_InitStructure;% K3 J  J" `/ h' p
  10.         DMA_InitTypeDef  DMA_InitStructure;0 Z; u  n2 K! f  r
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    # K. a. _) \  }) I/ w" B* L
  12.   ; }% }5 C3 F7 T2 q' |& R) _6 I
  13.         int ii =0;
    * U' s; c( Z# o/ `% i$ f* x
  14.        
    % q" }0 o; \6 y5 L5 A1 H" n
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    ; t6 S, e- H2 E3 @8 {/ s1 C
  16.         /*!< Enable SPI2 clocks */8 r, O- V1 {1 D6 I( Q
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    ; D$ a; i5 i" b1 s% t
  18.         /*!< Enable GPIO clocks */. o1 p( J) E4 E# X6 `
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    9 ]% L: n# [6 U1 j2 y: Z( G) t
  20.         /*!< Connect SPI pins to AF5 */3 M, V/ d% K4 o8 m, _
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    ) F& K" i) L+ I+ `) J6 O6 ]! @
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);1 \* H8 U/ T2 R# M  x& B! [
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);1 O7 P1 j5 M, o" ~" v7 d
  24. % b4 j/ U9 x% R  i# q
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;: ^4 n6 L2 c7 ]3 c8 l2 E  L
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    0 z6 u" \4 p/ ]+ D* g! q
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;6 q, Z0 v3 U% v9 g' i
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    - I! g* }$ W, k1 n3 z( _
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    6 c( t$ K9 {0 x! t: ^% h. I3 }
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);0 V+ H7 C% r* G' V- W' C2 T
  31. . M8 m* o* e4 o3 i; t) k9 [% e9 B
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    ( I8 h' Y0 R7 W9 ~" s( _2 C
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    2 C- M) C9 z. W( |
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    1 k+ _# h9 d0 I: E- G+ p  E  {
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;7 l5 {9 m9 _1 B0 e1 J
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    5 k# J3 g  ^; K4 P( }
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    . d, h1 E8 v0 J! k7 ^
  38.         Cdfinger_BspCs_HIGH();
      a, `( n+ Q& y" E7 B6 G# A& a
  39.         //Cdfinger_Bspdelay_ms(1);
    ; X  B4 B" d2 d, ~) w' N6 X5 \
  40.   //Cdfinger_BspCs_LOW();
      e+ b+ O6 ^4 U2 e; m
  41.         SPI_Cmd(SPI2,DISABLE);/ H7 k# J# Q+ \  j: M- o
  42.         SPI_DeInit(SPI2);- I' {8 l: S3 {- ^. |9 v
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    7 r5 v$ R: {  P) u8 a" m
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;5 |7 z! \+ G8 U. H) y
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    , H% o4 t' ~# n1 ]
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    7 e5 g2 g& y6 P
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    5 f& M- G, V4 O( ^) l
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;  f1 @+ W6 Y$ i# Q; D# \# M# U
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;( v' ?; P- y$ O0 _5 m
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;% O1 b7 _; ^- N: Y1 e; P
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;0 Z5 o: D# B3 E* F2 Y% N2 }- ]7 n
  52.         SPI_Init(SPI2, &SPI_InitStructure);+ I/ `+ e  O) t, `9 c( C2 R
  53. + I  v! b% c. K+ Y) G# w
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    ( V7 ~; U! L, G% n/ {
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************// g! K" p5 X7 x2 N3 Z
  56.         DMA_DeInit(DMA1_Stream4);
    7 p6 O% }" J- {$ k0 a
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;+ ~2 k1 O/ e; s6 k
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    2 Z+ f, t6 N9 U+ E
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];/ T7 C/ c$ F5 V
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;; x$ J1 O& M: g; q9 ]- `% F3 \
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    1 E- P) ~% [( y9 H1 \7 Z
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;5 u( h# V' a& \  i4 A
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;2 V8 W0 z/ h1 u" B6 m
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;2 b+ L2 Z* S; F* u; q& s! {; D) F
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;1 A/ v/ y/ h, \* h
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;: P% Q5 p" ?; r) q
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;+ D% K4 M9 J# X) P9 Q
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    ; M% ^' j' `2 A8 C( e% y0 i/ a
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;: F% F0 g) Z8 W
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    / U( _6 F+ p. r' L5 u# r! f
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;0 ?* F  Y' o" X1 p% d
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);$ ]1 `- w; O" i- K% E
  73.   5 G9 _4 X2 A; `$ Z  p5 C
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    # ~, C# M0 t( i' f1 v- i* o
  75.         DMA_DeInit(DMA1_Stream3);* g' h9 _8 a( r8 ~
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    : g! {1 e6 Z% h  j3 P* Q
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    0 s- ?+ p) L0 E9 j
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];# k; y% Z$ s5 w% L- `0 @
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    , K4 u. [7 n4 r, B5 s& f
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;
    3 B. a% b0 R  t$ J3 b
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    - _9 _# @8 y  i- ^9 V' d
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    5 I, h* l( M* e7 J5 q
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  S/ r# y2 _8 I/ f: v8 W7 r
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    & J, g* v2 O/ v
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;+ H, ^: |" [# v1 f$ K; N
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    # E1 v+ v+ q& _4 h" a4 {
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    & }+ q  p: Y( t8 i
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;/ i- r2 @. Y" F$ N
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    6 N) G( Y/ S: C, j
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;: u! i% I9 \3 C& l$ g, h
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);1 _- j" t& u! O8 ]* m3 V
  92.         //Cdfinger_BspCs_HIGH();
    " P  k4 C- F4 A
  93.         7 g! c% |/ o" z1 [
  94. , J: v% t+ a8 @) }) D

  95. 7 g# [  y1 \. |( t( R
  96.         //发送中断, Z/ ^" {7 P% j: q7 m2 z5 `
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);; B/ {7 J; l0 j, b2 }  c  ]
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    $ {4 z6 P9 I! w
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;. k0 C& c0 x# w# b& [; w9 I' |
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    9 U; c- o6 K4 j! m
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    , b9 s  K) c7 [5 R
  102.         NVIC_Init(&NVIC_InitStructure);1 J0 f/ X) B! g2 ?2 t
  103.        
    6 E' D; a) A2 e  R& R# C
  104.         //接收中断; U$ Q& z9 W  Z# s- Y! K+ Y
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);$ }9 |" a) ~# s- S
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    2 ^  p* l. g. f; f/ ^  z: ~+ W2 l
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    . S( f- T, s+ x$ x( H4 Z4 S
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;6 A7 ?! O  s5 z% M; {" h9 R9 O
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;3 t1 m$ Y/ V  S0 s
  110.         NVIC_Init(&NVIC_InitStructure);
    $ {  b4 E" D% `& M/ d6 l
  111.         SPI_TIModeCmd(SPI2,ENABLE);+ E- ]- {  k8 c
  112.         SPI_Cmd(SPI2, ENABLE);- m* U) W/ d) _* {9 I' Q+ o; y" z
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    % H6 d+ G2 e: e7 M9 ~8 |; ?) f
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);  q+ C. H2 x$ i3 g5 _: T/ l! r4 e: B
  115. 6 ^/ g/ V% Z/ ^5 X: O4 D
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    " K) o3 q% X# y' [
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);7 P& T* R9 @/ u9 g7 l
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);4 f2 t+ X8 J" a4 Q6 Y0 J
  119. 0 C3 x$ G* k9 A
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)& P2 U" W" N0 t
  121.         {- f2 i7 q1 \: ^+ N) w6 P
  122.           if(ii%8==0)
    6 {* W% z; Y* S* q  G
  123.                 {0 Z) @2 G" ~% y1 @7 i
  124.                                 printf("\r\n");
    4 j% P- Q" }; n% ?4 q
  125.                 }# L# k: s# G0 G1 P/ ?3 p* o
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);. I0 K# d! H4 ?0 c( `5 n
  127.         }8 C  U) i( Y4 `/ L- ?+ d. T
  128.         printf("111\r\n");
    ; h/ e; \! E% r  e3 }, W- |
  129. }
    3 C. l: X9 _5 d' C% p' S
  130. . X( G4 n# y2 g! F: {

  131. 9 c) T- s( `9 u; s
  132. void DMA1_Stream4_IRQHandler(void)
    " l% T- O, l$ h# j
  133. {) O$ \( n+ r  }! c$ |
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    9 @! h" }2 X& s6 k
  135.   {
    7 U( G/ m) {" t
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));6 N' H5 V( y2 ]7 e9 L- j
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    2 P- E" p  \3 n+ v0 m( y4 Z, \
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);( |- l" @3 b3 \
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);! s2 s9 e# l2 P# a% l- h
  140.   }, ?' k/ D1 @1 _
  141. }
    $ n/ T- k' x% x; f8 Z

  142. 1 R4 S- M4 Z  E) |/ T2 m
  143. void DMA1_Stream3_IRQHandler(void)* Z* t7 k. |) J( k2 X" M9 u
  144. {- q, D/ Q9 |+ M% h) F
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
    0 S: _/ J' J3 n( p
  146.   {
    ; {# }' n: G& u$ R+ l5 E
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    . s& B5 l+ D- L) A8 V' F0 ~/ X3 N: O
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    0 @6 }9 T" E/ ]- r3 c/ e
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);1 ]) l' E' s4 z4 T/ {" o; }8 C
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    - K1 a% Y; D! i3 g1 [4 c
  151.   }4 Y5 \1 O( Y5 L) r6 `& S
  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的波特率是不是必须为相同的,才能正确通信' f7 D* e& i, o. R+ Y" D9 d
以下是全部代码:
- Z3 v, x9 J. u& _$ R#include&quot;stm32F4xx.h&quot;
1 V. m+ d. V  Y% U+ Uvoid RCC_Configuration(void);
- [, m7 o; M% o+ ~9 D0 H7 Nvoid GPIO_Configuration(void);
+ W3 y/ P0 ?" ^( k  V4 Vvoid SPI_Configuration(void);( t6 @; {% g/ l! C
void Delay(int nCount);3 b+ D% F2 E+ m7 X; `. V
int main(void)
, Q, ^* Y) y; W% ?4 l4 f5 A{  RCC_Configuration();6 }1 t0 ~3 A0 M# D6 h/ X6 x6 ]$ A
  GPIO_Configuration();6 T2 K  k, l' B3 T' g8 T
  SPI_Configuration();
6 N+ N) V$ ~; B' { while(1)
" \% E5 x$ `# K9 g' d+ _) v { int data=0;+ U1 ]2 L5 H5 c/ i9 J. R& l
  SPI_SendData(SPI1,0x55);
3 a: g% I. b# `7 `" d' j  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 2 H- }0 o2 c) b+ c7 n2 ]: o
  data=SPI_ReceiveData(SPI2);
8 r* w) I" f) B% v2 H( |  if(data==0x55)8 W7 ]% f. {/ m
     {  while(1)9 t6 N8 \- ~7 ]$ h7 Y. Z4 i  |& y9 @/ R
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);0 i9 ?, P+ W$ _  b. v) B3 j, z+ h  O
                Delay(0xfffff);7 ?" g  @" f2 d) C
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);+ s/ F4 o' d! L: }& s6 X
                Delay(0xfffff);
- e6 X9 `( T; E- D' I' \3 P   1 K* e' t/ }' E' I+ x# H% `, V1 m
             };, n( b3 W  C  I) ~8 J: ]' x
     }+ X3 D- _& Q0 {( k8 H) l8 O/ D
     else while(1)
& E5 e( k1 v/ J, M) _; L            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);2 R' F' b) F; Z% J" S% V% \% l
               //Delay(0xfffff);
3 n$ x( f+ o2 S; ]/ j               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
7 u3 p5 n' D6 F! g1 _- a! c               //Delay(0xfffff);1 c' F9 o- g4 F; b
  
+ Z5 v% F+ I2 z! a) ]  `  p. l            };
: f# J$ E# P; r, h }% ]. Y8 [6 T9 n2 j7 I
}
6 e/ G; m7 c, `! L7 Vvoid RCC_Configuration()
9 [5 y5 g2 `9 f  k5 y{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);& p& b* Z# z5 i1 m+ X
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
' o0 E3 ?5 @1 g1 x  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   1 q2 \4 k7 R& I/ q( R$ c
}" y# U& `9 q3 P8 a) ]* o
void GPIO_Configuration()
; B3 g: c- @( D9 `: u4 l% F! x{  GPIO_InitTypeDef GPIO_InitStructure;: h" G" I9 c, x
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
" f- V- {  P6 H7 x; X  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
& z4 C: X: C% Z3 `2 g8 T& `  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
7 E) A- e8 \8 O, d( B  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
, z7 F( x+ f; b; L  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
7 d3 ]- N% r' e  `7 x  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
+ \7 Y* T8 [# D( ]  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
& F/ R, n# x7 s/ o  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
8 h9 L; U+ a* |) M; H- W  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
6 ^4 D6 d$ j1 d+ Z  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
/ V0 ]8 a% M' t/ T6 ~) j6 e* E  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;) v) n9 L5 G6 M  \5 x
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);( H  s- b0 ]6 `0 p
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
3 p" ~3 |: ?8 \. P# t  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
) ~, X4 k1 c) s4 ]3 `1 S}# p* |" o& J2 j& z$ U" ?/ J
void SPI_Configuration()! A0 B9 f* L5 o. G! ^% z
{  SPI_InitTypeDef SPI_InitStructure;) X0 ~0 X. s6 G3 }$ ]( s7 O; J$ Z
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
8 T3 ]& J3 F. D3 ]  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);* `8 Z0 e8 o2 Z. o$ ]
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);. M" n" l3 e* Q1 P: c, \1 F
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
0 R$ m6 j" q" F) v! d/ f/ r  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);8 J$ J6 U8 L0 a9 d4 G2 x7 X
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);/ L5 N/ m- L7 r' Q2 G4 L
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;- A( E. x6 F7 R( q& ~
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;8 c3 _) K, @( e1 Y6 m* e" F
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
# x/ Q) X- d* M  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
! _# }+ ~7 S6 |  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;* v1 v' g" j/ ?% @% q7 o
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;- E/ R8 j$ `1 w% @  U( k; L
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;/ I& A" x; m7 Z. L' |
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
( V1 L$ _9 u" K& m1 X4 G: g/ ?  SPI_Init(SPI1, &amp;SPI_InitStructure);
, s) e8 x# J4 f* d& T  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;5 j5 O: L% l! U! V8 w$ N
   SPI_Init(SPI2, &amp;SPI_InitStructure);+ d$ u$ q" i! q; |# Q( \
   SPI_Cmd(SPI1,ENABLE);
6 x( F6 W4 T, s( F  J$ H   SPI_Cmd(SPI2,ENABLE); ) h* _/ D, \. \$ q2 f* }$ I
}
4 Q3 U, x, d7 k8 [9 O. Y; mvoid Delay(int nCount)
1 @) z: Z  ~2 F{ int c1=nCount;
% Q& A% K# \" W% g: o' f2 i0 R6 U int c2=nCount;7 L( G6 l' k6 I9 f: Y. Q
 for(;c1&gt;0;c1--)2 h: }2 h9 Y4 \. A8 ^5 u6 P1 g+ E
  {
! f6 U' h/ F5 Z5 m* c; v  for(;c2&gt;0;c2--);1 u; E. G+ M9 B4 ?  Q" P
 };1 \% V9 P: j4 h# Q" s( P' _
}
5 v/ Q) F5 o( i6 x/ z+ X2 A先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:& g2 C+ m/ l. M
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
& G5 e' B. x3 U' p以下是全部代码:
" ?- T  ?# G9 J/ U+ x; `  _#include&quot;stm32F4xx.h&quot;+ [2 A+ w" P5 I, K
void RCC_Configuration(void);7 [" ]2 u! ~& D* @* ~* P9 ?  Y6 @$ t
void GPIO_Configuration(void);
/ \! p- z6 k/ y2 i! |; I& E+ Cvoid SPI_Configuration(void);$ I; e/ w4 i: _% k! x2 z
void Delay(int nCount);% L5 D  K' O/ P9 K% E0 N. D9 t
int main(void)
0 |, q. z( _" v' A+ \9 C{  RCC_Configuration();
' {9 i9 p0 \% L% L- p0 _! E3 O  GPIO_Configuration();' h$ y0 X; z" f, u% G( _
  SPI_Configuration();
: Z6 E8 O& Q7 u9 ^1 t6 p- N6 b# b while(1)
8 g7 ~7 t7 Z. A8 [4 F3 c5 u { int data=0;+ k/ @5 ~& @# |/ r: O4 P% l. R
  SPI_SendData(SPI1,0x55);: T, u+ b/ b5 h; {3 E
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); ( i/ O" T/ W/ [2 A% F
  data=SPI_ReceiveData(SPI2);
1 Q$ {  v1 T: o: c3 S- G9 V3 w# C  if(data==0x55)
' G) L# |# ?" q$ v     {  while(1)& A5 [# K1 {6 }" k9 Z1 n, D% M
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);9 }' Y3 g# D" v7 G2 u* {: _  G1 H# S
                Delay(0xfffff);! C7 @0 B" K* E, M, h
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
( T9 ~) x* V9 C) r+ ]7 ]                Delay(0xfffff);
0 W% x) e( s1 j( S1 J; A8 C6 \  
, C8 h5 a  L# a7 Z% m/ m             };8 c: ^2 l( u  ?6 l  h4 C& l) S% z
     }
' X, E, ]7 c  z+ F5 n3 I1 v     else while(1)5 R" F! A* g: i  M- N- `2 P7 ?1 R
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
  s, X+ S8 b5 t7 r& r2 k7 C               //Delay(0xfffff);
. X, U; i" g) Z7 r               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);5 `: n8 J# I9 c# ]  w! o" u# ]% u
               //Delay(0xfffff);) j5 Z. O" I3 a7 V5 x+ R! [9 P
     {# h# _% E3 ^0 H2 ^
            };' E, Z* Z% G1 N; l
 }
* R# z8 F9 I: J" K}7 t  L- P7 ?& `+ g. L
void RCC_Configuration()# f3 B) u* m. E: O/ ^2 n' N
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/ i2 n/ P. R8 q$ K  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
2 ~4 o( x0 t/ o0 J5 f" S  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   , b) o) _# `) O  y
}5 x: W! c: O  @& n
void GPIO_Configuration()
7 `4 A0 ]& K: R6 \7 T( Z{  GPIO_InitTypeDef GPIO_InitStructure;( w* g! A5 O$ j5 c9 v; L! o6 b
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
# z* P5 V7 H$ W! d  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
; f4 l0 D4 c0 W  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;) d4 y3 v  O& |3 h# S3 P
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
# R/ E' j% p' s* n, K2 x# ?; `$ Z  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;+ q8 w8 j! A8 T; I$ j
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
2 B# w( o) I( s, {. N" U  X# w  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
+ L0 G/ C9 E) w$ ]& c  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;+ g2 V! A& x0 ]6 }, h# e0 F
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
' K: m3 z4 _( O4 `8 Q  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;) R* p4 l: q  C) G  n9 {
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;5 g' y6 s4 a/ r: V. c3 U9 I$ i
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
3 l' ]( a) i0 z# C/ F( Y  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
1 [' B3 o/ M6 ?. I$ I. @1 w& y. d  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
9 J4 f! j) f( K! k2 d+ G+ v}
; ~. B, |9 u3 M- O0 l' Avoid SPI_Configuration()# p" w2 ?3 U8 r6 I: A3 @
{  SPI_InitTypeDef SPI_InitStructure;+ C6 e1 ^5 J  Y. D  `% U
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);" P3 G7 z! W8 G0 }4 N' X
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
0 p8 s6 {# E2 T  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
) q& ]' t7 g* y1 {   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
4 [0 L5 h3 s8 J  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
4 q8 X3 L* \" }: a6 ^# `2 a! a  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
' K" e* n5 x, S' U  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
2 A3 d. S  y) p7 }  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
5 n  u4 G7 F2 o8 T, j7 ]% P  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;5 z/ x# O+ O  c9 d$ Y9 \
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;" s2 Z) i# e& o1 L4 C
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;/ G, d# I- ^* k! O6 W
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;8 d, @/ _9 t# n* h6 Z
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
; U! z5 F, o! m* V0 F/ e, w3 [   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
/ m6 j% j7 W3 V' E  SPI_Init(SPI1, &amp;SPI_InitStructure);+ k8 ]/ j) j7 P0 b" O$ {
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;- ~# F  z! E8 e" j$ R, E
   SPI_Init(SPI2, &amp;SPI_InitStructure);
7 w3 |1 [3 A8 G. \  |' ]' I   SPI_Cmd(SPI1,ENABLE);. d$ ?; X' X- R" x9 A' I- Q# A! ?
   SPI_Cmd(SPI2,ENABLE); 
$ s7 q4 ], `0 D$ W/ R- X" M2 v}
" }, m' g  N. P$ Y- G: ~void Delay(int nCount)1 w. _8 \  S% Z' _8 S
{ int c1=nCount;
& M) N2 K4 M: p% x% a int c2=nCount;: p) P* r( u3 P) O: o
 for(;c1&gt;0;c1--)
3 K! F# j' j2 H/ A4 D  B  {
. c/ u% S% l) ]( d  for(;c2&gt;0;c2--);+ Y- J7 o2 A7 ^( ^. q, m
 };
9 Q. O' W. s: Q8 U9 f" G}' M2 S5 P1 U3 f0 ]0 J
先谢谢了~~7 n7 g7 s' E# h% S$ A' m9 e) O
 - ^) [5 D; B1 U
  R- |) Z0 E; q+ {- m, K" i
楼上的问题,看我帖子给出的提示哦~
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发表:6 ?# }$ S8 r* L
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
5 i3 R5 s. L5 F+ [/ D) n$ ~, o 6 a8 }* X0 |' q
" |- j7 d  a, }$ ^; u5 j: x
多谢支持!!
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 运算效率不高

  
/ B; P5 g2 L  c2 F鬼魅一样的Hard Fault0 b& X. o* T% W5 l
 
- w. F$ e0 @2 I- T% y: T该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
+ [7 `8 q# Z0 F2 ?* ?) n- T4 `3 C ; ]9 U4 g+ n+ K* c8 M* e" [
咋解决?
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 手机版