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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表# H0 a# H5 Q. H1 ^4 S) c! H
5 T  }" @7 w8 i5 d9 [

! m/ p9 M1 x" x0 H( P& m; t社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
5 l7 u% m4 p. X  r 7 C; R' m( N/ ?1 T
提示:点击各主题,进入帖子,可下载ST工程师解答详请
8 w: t- j5 T& V, R& l; B % f$ R+ ]0 a7 \  Y; D5 g% d9 L

# ]$ ~& @1 }, s! q% ~' d一、通信接口$ a( C, E  ~1 {! k  z* G7 d
' W+ Y' G2 M/ e3 }/ ]7 W: g$ K
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新
6 B( @" ]' _  z! U  O9 G0 ~# K2 r* A 0 y+ s% q! G9 C: c  B/ X; i
2. SPI 接口发片选信号导致死机
2 x. h! D% |  q7 T* h& k# u" F 6 O4 F& x; B* z$ Z# t" G* P7 l) h
3. USART1不能设定600BPS的波特率
9 T; N5 z, n* K! \ , E0 T% E- [7 h* Z$ U6 }/ N
4. I2C 接口进入 Busy 状态不能退出
( I, u# Q9 i" D2 O. x( Y 7 d6 V; x' e2 F  e- n: O+ {6 Q
5. 对 Flash操作导致 USARTU接收丢数据
2 l: c1 A9 h% V8 J$ {$ y! y$ \ 7 X3 A8 n1 v% C0 v$ M% f
6. USB接口易损坏& N5 \$ E4 S8 n

8 T/ e# K* O; C% [3 a7 ^# ?9 u7. UART发送数据丢失最后一个字节
2 W/ g  z7 I: C3 Z0 P  J  H& k
. ^* `+ H  X1 w2 l+ i8. 使用 CCM 导致以太网通信失败+ b( N5 ]" i" t0 W( k. z
( e3 j# T: P# e- ^9 M
9. SPI3 接口没有信号送出
% X$ \# A; I% L  H+ e6 I9 u * z% W# n4 z& M" r) N( O
10. 时钟延展导致 I2C 通信不可靠8 @1 k8 ^4 V' q) [$ C

) {  k; A7 ~3 o1 a- b11. M0的USART波特率自动识别问题5 ?: e0 h* b5 l, P+ X" s
" m$ c& @6 ]* `" k1 I9 d8 Y3 `7 F
12. WK15 OTG做U盘主机兼容性提高
3 Q8 g6 ]+ l  z$ n8 a# c + T' |+ I2 I& ]0 U+ w
13. 以太网电路设计注意事项' N% }4 o1 c; j+ |0 p. |( \5 t

" D. ^" g2 b/ k# m, ~* p9 r14. OUG主机库在BULK传输上对NAK的处理
- E# i: |# Y) a3 G9 _3 i
4 l% x9 {4 G8 O15. 串口断帧检测
/ D0 i7 d  F7 u$ S 9 V9 v, b5 |* r) e' t' c- B
16. VCP例程用于数据传输时丢失数据的处理' Z" e6 c9 e; A4 i8 b1 N
) v0 _4 i5 u4 {/ Z; w
17. STM8L051F3P6串口UART数据起始位判断的问题  V/ n; j- P5 R6 ]% Q" R! N* h3 [

- v1 X% v# T% f  G& G* `* J0 L18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号- U7 y/ V* b/ P8 N
4 z( {: L7 G4 x! t( R* I# g
19. STM8中UART奇偶校验的使用方法
5 k0 E: x8 E* A. f$ J
% Z7 r4 Z: k0 t* k20. STM32以太网硬件设计——PHY
* y; j2 s1 |& o3 i  g5 _, f- |9 ?* ?( f; x
21. 一个判断I2C总线通信异常原因的方法
  w* [) K  D, J1 N+ z; I  B5 y- {1 v0 b
22. USB device库使用说明2 i- U6 D% l9 u( t
. `! U. D" G" P  b" U* m* y9 n
23. STM32F103上USB的端点资源
- q& J) r8 w! {4 O# d& U3 s# O  ], O1 \% h0 N3 l8 V
24. 使用CubeMX生成TCPEchoServer程序
: }0 k+ v+ N: A7 s$ ]/ q/ G3 |1 H1 g( ^( X& R9 J# b
25. SPI接收数据移位
$ ]+ j, [6 j5 q0 i* I- {0 ^3 R5 O ) i# U  p- u3 V3 c6 r
26. STM32F0中Guard Time的设置  q6 v, c9 g- ?

6 u/ s" p2 U8 {, j+ p# y6 d27. LwIP内存配置
; Y* f) O8 A( o- h& ^3 e8 q- X. }# z: ]" }* Y' e+ H" n
28. STM32 USB Device的简易验证方法; V. Y2 W9 G0 J$ X

( P% q% t! d3 w/ ~/ S2 a4 c8 V$ A29. USART 中断方式接收无响应问题的一种情况及其处理方法
; d# R" @: P. a( H' E- v7 G7 p- H% [) ?  y: ]' u
30. STM32 基于 Nucleo板 CAN总线的建立
- k! N% ]& r7 g* |( Q' z3 z& d' G; [) ^& h% Q  ?' _$ S2 |
31. STM8 CAN总线的IdMask模式的讲解1 Q1 r4 P$ @/ f8 ]) L- k. Q
4 Y; C# t# p) k  w/ V! h, A. U/ M5 ^
32. STM32F746ZG USB 驱动不正常
; O; C1 u2 E- I3 T( E5 T- j; b' H" U% U- z3 z9 L- Z7 i
33. MCU在STOP状态下通过UART唤醒分析
/ J# x6 R/ X4 `! G2 V/ E2 [7 L* ?( T0 U& q
34. 通过STM32CubeMX生成HID双向通讯工程
4 S8 I1 o- t2 ~% G
, F: Y4 H, p# H35. 串口工作在DMA模式下有时接收异常
* C5 X  ?5 W1 ~# \. u+ L3 T3 g  i# D
36. STM32 Bootloader中 DFU使用限制& p$ S; S+ _5 s! v) O
/ h! [% G5 y( }* w; q; \: i
37. UART异常错误分析
2 Z8 c. v% a# i0 K  `
7 q+ p( Q, D' |/ s, K2 L1 n38. 基于Cube库无法检测CAN2的接收中断 % C& h2 u! S: t, c4 s4 n8 i

) L2 O/ s$ y& S3 _39. 基于STM32F7的网络时间同步客户端实现
+ p5 Y1 ^$ L5 d! b5 w
4 t9 ?" C& G, ^9 r1 E40. HID与音频冲突问题 # Z3 ?+ T/ M0 D. C5 c8 s

7 D: D+ T0 S; A6 S' l3 Q41. 在进行USB CDC类开发时,无法发送64整数倍的数据3 h. @  l& h/ Z1 K8 `& M

# L7 z, m$ M7 C2 t42. 从零开始使用CubeMX创建以太网工程8 {  i! |0 X4 [/ G7 G+ s1 c/ ?# E
; G0 ^$ a, S# w1 f
43. STM32F4xxx的I2C总线挂起异常处理; o* _  I( ]7 A6 n0 o, D/ K
+ n9 N* _. h8 X' _
44. LPUART唤醒STOP MODE下的MCU
8 s$ S6 S; ^# |8 I% T2 C  W5 u
+ w$ }) s# m8 y8 g/ x45. STM32系列 MCU模拟双盘符 U盘的应用
, e7 N& L/ J6 N9 B9 o4 Z- e: }3 p
46. CEC输出的数据和数据长度始终不匹配0 W+ Z. N% s7 f# U, _
4 K% v3 ?3 j( Z$ t& G
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
. A* R& H" E& g5 D5 X# Y) K5 x. e5 |& ?
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)7 L1 {* ~( n: ~6 i

7 T+ N4 s3 I' G5 F5 W49. 增加UART接口应用时的异常分析8 R4 Y. X. {  I" R7 r, b5 ]

6 z" k2 l% Y8 V. ]4 i) B! y# l50.UART应用异常案例分析
7 [/ I# s4 S! y0 g4 ^  @3 v- H6 ]: _  F  Q3 r' N  E8 f2 ?* ~* N5 V4 r% F2 w
51. I2C配置顺序引发的异常案例2 \. Q; J$ ], X# Q' v( v
" b- y  @: V0 i( u# [& y
52. STM32 USBD VBUS GPIO7 c* t' B- q# V% z) S7 {8 A
/ `; S* d+ {* q  W  O
53. USB传输数据时出现卡顿现象
+ ]0 h9 f/ B* w; s: ]+ C1 x- n; p) X* j9 V2 A0 p( ~
54. STM32的高速USB信号质量测试实现$ ~6 Z9 o6 B" M) w
3 T1 B0 f5 N* T5 x$ c) L* W1 U% w' A7 c
55. 基于STM32 I2S的音频应用开发介绍3 T7 D" E3 h- e; H, ~. `
! @$ O3 h6 x, |6 i
56. HID_CDC复合设备在WIN10的识别问题  
& q0 C, Q; O: I' o: L  J( x# j  F! `8 _6 e) z& a8 Z7 }: g! k
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  
0 J$ K+ l4 d1 m; V. f7 R: D0 a; q
58. 一个关于LPUART输出异常的问题分享  6 G0 E  ?7 M/ _" N# V

' k4 t* z% }, j- e2 i  o6 z$ D4 |59.通过 DfuSe 工具控制程序跳进 DFU 模式! _. z  N- w9 \1 Q2 s+ h
& Q! x- Y  y( \) @/ P  [' c/ n4 D
60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
9 N$ o$ @* G$ N/ L
5 u% r) c. O2 L* q( a4 G$ X  C5 w
61.一个因初始化顺序而导致异常的话题 (2019.12.24)9 G; F  K! F. [; Y5 X# U' Y

$ T8 I9 p3 h+ m7 N) X  H62.MC SDK 5.x 中增加位置环 (2020.5.29)
# S' s  R4 m' t5 P
9 |8 W5 N3 Q$ g6 O! Y8 A6 E4 H' F+ T' [
63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
# s! V7 _. R" _" c3 \% i  ~( H5 Z1 c/ n1 n  S$ l( q* v0 ]
64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)1 ]7 P0 ]) W5 E, C  o

& U9 e1 I) A" h+ e二、电源与复位
3 `; ^5 h( H5 R9 U: B 9 _4 x& K' g4 S6 c+ i3 {6 E0 c
1. Vbat管脚上的怪现象
. w- N3 t$ X8 r
0 e/ J5 w5 w! g  i* O" d2. 上电缓慢导致复位不良* q1 n4 W! O% g; i' w! N2 E$ P" Y
0 R$ y, m. l/ ~4 Z
3. 关闭电源还在运行" c: S" W* Y# V% l8 @

" H$ }9 s! P& X4. 使用STM32 实现锂电充电器/ f$ D6 H4 s& E9 b9 m1 C& O& i
& c# ~2 A4 Q8 p5 n9 |5 T
5. STM8L152 IDD电流测量7 \9 C0 s7 x' P7 r! y2 Z: d
- f+ C1 k5 V7 w; a
6. STM8连续复位问题
0 H3 D; ]9 T, F; U  \ 3 m) |, n* l# N& {3 C; Z& ]
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用  F5 u+ C, i2 q

9 W' t2 Z: q' L- Z! n8 W8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流
, h6 B+ x, q9 A' w7 b8 V/ N' w' F( F
9. STM32F7与STM32F4的复位序列比较
0 F0 N4 e4 }7 S: W2 b. |9 B, W; T  y2 \% N. r
10. STM32F107 复位标志问题 9 i6 i6 ^3 o& e" h

7 f/ r( R  a1 K11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
/ ?% M3 c! S6 ~: ~/ X) S4 x* Q* d1 x& d' j5 v
12. Nucleo_L053不上电也能运行+ i- p5 r; T7 S1 O

7 P$ l( f2 [1 q. p( r1 @13. STM32L4中STOP2模式下的漏电流1 |  f3 s# I3 a  t$ A
% z7 J" q# A, n; v; e6 X
14. 在没有外置晶振时HSE_RDY异常置位9 B; L4 R4 o  p1 }! ~  Z
$ J6 I1 Q0 g- j) R1 G% l
15. FLASH被异常改写   (2018.5更新)0 J8 s2 R$ c, O# C% [
( a  p5 s, K1 ?
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
9 p7 g) K. {- R! D  v" L3 U/ x$ X5 J6 H5 E- S
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)
" U8 K: J+ o  b$ b" r
2 Z& ^, W- \$ _, f9 o+ M* h! A+ p三、IAP和Bootloader
( K* _7 V3 a3 N( ~) W9 O% I
5 j- [) t; _& e! Z8 p8 j. t1. Boot Loader与上位机通信不稳定0 k& d9 D, ?  \. r; ]2 h
9 D; U- g* V$ t6 e3 S) i4 K
2. IAP+APP 模式下不能启动 RTOS
' P: b5 j" @. Z- ~/ v5 a( A# D) W
2 {8 f4 d* k, M( i1 h" D% u4 o3. 从 IAP Loader 向 App 跳转不可靠
0 g! D: X- F- o" N2 ~9 P$ b
  R1 D- L9 ?# S8 f4. STM32 MCU IAP例程跳转到APP代码简要分析- w$ ]: a9 v" m9 |  C

" f7 ~. @! X" Q0 a( ^2 I5. STM32F091从自举程序向应用程序跳转的问题与解决% ?; K( A* w% {) P2 [" s  F

; `" K( o$ c' |/ ^9 l6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
" q4 R$ b# e1 x: p8 }6 H. U4 p3 |- ^3 P+ H
7. STM32F0启动模式相关问题探讨
0 O4 `) z( I# N0 h, D8 i, h" M" T" P
- ?, D7 a# C0 Q) K2 d0 |8.STM32F091空片使用System Bootloader下载代码) x, }& |2 c' {+ T' M9 W  G

* ]: s8 p  Z, f6 F9 H3 K. M( U4 S5 L, q9.STM8L  IAP 应用程序中编程指导
9 T' j  v, p0 C( e* n# k
$ b# v# D2 ]5 [  t/ F; V0 u3 F10. 如何通过STM32的串口实现简易脱机编程器
* i; k3 X2 [' Q, B" p( F) J% c- ?6 F) d* ~8 E
11. 一种从用户代码调用系统存储器中Bootloader 的方法  
5 ?# Y# S1 ^& T" B( r! |, D! ]+ e/ L8 Q# I, S6 T. G
12. 利用 USB DFU实现 IAP功能- Q: v5 Z+ m$ h: d8 n! d

  |0 ?# |0 ^: S& Y2 D7 Y" i13. STM32 Bootloader中 DFU使用限制& L7 ]$ k( O; [8 o* c

3 \( ]* H8 {. Y7 p% Y. a14. STM32L011x和STM32L021x启动模式注意事项
5 a" T% K& y) @1 H0 j/ f/ `/ R* r. s7 B  E
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
/ o9 E* j, J% t' c' F: T2 |6 d
  D; a3 M7 k. U, @' N7 R16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
; u: p& l" D- {: V  i2 _% W( r% g4 A& O% {, p; T) J  G
17. 如何使用STM32NUCLEO 板来测试串口Bootloader4 h, D4 Z0 p" d0 d
  y  q  @, a" y3 C+ `
18. 在STM32L011上通过I2C接口实现IAP
9 f% P6 ^8 ~  Z% m# h* I4 |, f6 S' i& ~. {
19. 在IAR中实现通过将程序在SRAM中调试的方法
: Z- P0 c# `% O: [% i
( e4 r2 }7 ^  X' h1 e" }20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题2 ^. @. ], |+ }. Q' _
- D/ Z( A7 f% |2 v. o
21. USB DFU IAP 例程移植的两个话题5 w- q. M. S% E+ @1 k  V  _

% Y1 M9 F# g7 t$ S% m22. STM32F769双bank启动2 l$ ~( D8 x2 u: j" K5 L

4 a. {* O' Z" W/ J23. DFU加载 工具 DfuSeCommand的使用
4 m1 F4 W% q, N* J
& k5 U6 S3 M8 l  i24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码    * n7 E3 e3 |2 c4 ]; j- {9 V
, m+ D  x) _% k1 d7 K0 O
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)
4 u) f7 R7 i, s: O9 f: ?1 n, s9 f7 p' {! X' j( |2 x' L
26.STM32 Bootloader异常复位案例(2019.4)$ l9 |: ~6 i6 i1 E) \( M; E# B
9 \) \( C4 o  F4 d
四、存储器
7 d9 D: D4 M0 d; J' ]2 z& w' B3 ]- F
& i  a/ o& v0 {" {1. 对 Flash操作导致 USARTU接收丢数据
! o2 c; ]4 K3 N' ~/ A
; x: Y" D" r- ^/ E  o2. 使用外部 SRAM 导致死机
. N( C$ p0 |$ M" m. n
& o' T1 Y- ^6 a9 b+ e6 n/ @- T  v3. SRAM 中的数据丢失
& ]" Z' F( z- D3 z. r : p+ W' L' `" H
4. 干扰环境下 Flash 数据丢失
# S3 r, X8 N5 P# N: r/ p+ ~% q6 G
* [& V2 _  }! S9 E. Z" q0 S5. 使用 CCM 导致以太网通信失败
$ X5 |; \& W' `4 a : P0 d" Q& V5 E# ^& |. z
6. STM32F429使用外扩SDRAM运行程序的方法1 m8 l8 G* L4 t3 W$ n9 c6 O9 [9 w
& N* d7 J/ ]6 q% p
7. 使用STVP实现对STM32L1系列EEPROM预置数据) H9 m! i/ I. ^) I
9 ^+ y, |7 u: N5 W) P' g5 F" b# ?
8. FreeRTOS RAM使用情况及优化方法  j, d8 O. {% r; U. X$ y

9 A" O4 w, r- \" U# u9 E3 m9. 在IAR 6.5下如何将数据存放至flash中
, ?, `% j1 x1 E( \9 i% ~0 h
1 G7 D3 w5 i: h( \1 r0 _% U10. IAR下如何让程序在RAM中运行
& A% j* i( n- B5 D# t
2 S  _( D& [& l9 _) h11. RAM上电后初始值问题4 w; o' e3 N6 u. M

1 I9 I; c" o4 _7 S: k: C12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计2 x" K- j, e' c, d3 n

% F; v3 e% I: T" d! ?7 O" a13. LwIP内存配置
4 ]3 l+ s1 ?8 {  y
" @' y/ q% d$ C& ?14. STM32F2高低温死机问题8 U5 v1 u: M3 {# v* V

9 V, L  W( r8 P' P1 g8 P+ X15. 使用STM32F427的CCM RAM时遇到的问题" e2 _' N. A  C$ R5 Y& m! N6 X- Z. y
0 ~: e9 }# v0 L% @
16. 利用QuadSPI外扩串行NOR Flash的实现  
) V! ~0 j6 k1 D8 q* q$ R1 {! O) ]2 F7 y0 R; }
17. STM32擦除内部FLASH时间过长导致IWDG复位     
! @7 i# ^1 n' o' n6 Y5 Q  G( }/ G/ P6 G3 Y9 J* U9 ]2 T
3 u" }# n% C/ v! L, J, T
18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)) w; t5 V" t9 O6 i9 B

5 o# E4 h1 W0 Z& G! I% `五、模拟外设' Z3 J/ r/ A4 R) l. \) a+ f" ^

0 x6 R5 V8 f4 m5 t; K* `9 m1. ADC对小信号的转换结果为零
$ c* Z7 ~+ u$ U  P) a4 ?( o9 m2 | ! u5 v2 R+ v0 j; |( u4 F
2. ADC键盘读不准
' W! F( I' Q# e + C& h& J4 {+ t" O. }$ B
3. 扫描模式下 ADC 发生通道间串扰
. G& M+ i5 e0 I& w 6 p' n0 C/ ?; p# Q5 K. {/ W- J7 Q
4. DAC无法输出0V的问题分析解决
8 k* G: g$ S$ w5 v/ L; K
7 b5 j$ i% {& G* J' {5. DAC无法输出满量程电压的分析解决
+ {9 Z, Q1 U- m6 v
# s7 {7 E. R8 Q% \$ W  z6. STM32F30x 的ADC 采样的傅立叶变换$ H  A! E* e- g( T1 r! l

' D% A7 f% w3 N1 U6 b( \7. STM32 F1系列 DAC的示例详解# M% X* |3 i+ ]+ |3 `

4 t% \$ T  M) R4 D3 n2 ?8. ADC 连续模式采样浮空引脚问题- b- |1 [0 x6 y! d+ Q$ z/ Q

  D  u, k6 n3 @) ~; @' C# w7 p9. PWM硬件间隔触发ADC * ?. a# {9 |5 x  Q
# Q& U8 v+ a# @5 F* c8 W/ ?& X
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC- u9 Z/ ~3 H1 a
* i5 Y; l) p" P
11. STM32L4 系列中ADC 通道配置上的区别: Y% I0 @& |7 O% _0 Z# @4 `: n8 r
3 F1 z' d& E4 u( k1 y# a8 o3 P2 w
12. STM32 ADC模拟看门狗及其应用
0 u  ?+ _9 R- z; b2 l1 Z+ W7 Y, r; ~6 R1 M: c
13. STM32L053 comp2 比较电压无效问题
8 C; P% }9 w  K& f% N& Z' A* w' C* o
0 o- H+ {+ A2 ^/ A! b: g. v14. 运算放大器OPAMP在STM32L4上的应用
. k0 R3 K( `) Z$ V- ^8 ]/ m( H6 V: q* ^. v7 n9 n
15. STM32 OTA例程之ESP8266使用 4 P( n! n- O# D  a4 x; X9 w

8 x) j" _3 G( R1 \' J5 X- f16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
* B' L+ C+ l& T$ }. g  ^7 F+ A  E: w; v2 J
六、计数外设
" ?, N( s& b; ~- I4 y! |$ ^ ' W' X" \2 V$ U; s
1. Watch Dog 失效1 g4 o4 _( d8 T; Z$ @/ N/ j+ }

' Q- ?5 [! `9 }( w# t2. RTC计秒不均匀
1 Q: M. l; h$ F. B& e
& I% }- {' m) Q) F$ M' b2 x3. 软件启动模式导致 IWatchDog 失效- I$ e4 D, I) \/ P  y  \1 j/ Z
& m, u- [$ q$ f9 t6 n6 v5 j, k  M
4. STM32F030R8 定时器移植问题2 c3 v1 m" x* q* }& y; X9 [& i1 f6 s

% B6 x6 j. @1 s( S) B1 i* j) |5. STM32F0使用RTC Tamper的几个注意事项- G) ?$ L' c0 e

* G) s# h3 [$ K1 X1 p/ q/ R6. STM32L053可控PWM脉冲方法之DMA
- S- @# r' }5 j* m1 N+ L" t/ S1 g6 d! l3 M+ `3 v9 R& W
7. CounterMode,OCMode与OCPolarity关系
& w4 r; T; g. U. q# \, n! z# @3 A# J8 @$ z
8. STM32L053可控PWM脉冲方法之DMA
" r* w4 ~0 j* [1 O2 O( U, _2 f& t
9. STM32F1通用定时器示例详解—TimeBase
. ?2 E" z5 x# \- R# X$ i# W' a, F8 h8 ^( q/ E: [  b
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals0 [5 m9 U$ H9 g5 F
, p3 U7 g, ]$ q" i$ c
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
. T! B. R+ C, @# E3 v
  M% ^" s2 k: x, V* W8 b0 \. N$ d12. HRTIMER的多种Fault事件联动机制0 z  r+ r$ ~5 A2 c/ f; N4 s" G
4 |( f5 s6 F( H. N2 r2 Z
13. STM32通用定时器 示例详解 —One Pulse& }8 J1 l' i- Y' R8 @; X
0 ]6 f4 V5 ~4 N( ^4 F% {
14. 如何用LSE校准STM32F4内部RC振荡器
+ s  ~1 _( y2 d* B0 `
1 n1 n/ G, x) ^& ^9 w15. 一种使用Timer测试HSI实际值的方法
; D; n3 x4 @. O% C6 v) X; C; D3 \! P; T' K4 L6 p7 j4 ]6 t
16. FreeRTOS定时器精度研究% L0 T5 U0 V. N" ~( V& \% C& B

3 l8 I0 m- j0 G# Q& D17. HRTIMER产生多相相移信号
1 E1 \7 y$ n" U( [. G# v, j# T
0 l7 S" X- W& g$ z4 I* J18. 窗口看门狗启动时异常复位问题$ p# e5 r! U" \2 g, Y
$ @# s( i# `7 g( z
19. PWM硬件间隔触发ADC
6 N+ W2 m, ?5 z' c8 U. `6 _, s/ l
+ V% u) ?2 p: N5 a20. STM32F030低温下RTC不工作! k7 R% K/ _0 _& l! l! t; k

8 S& r; W5 r/ q5 _# F. w( X& \2 V21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   
: B) ]2 E  c5 i. A  F
( ]1 f5 a4 E! D& Q1 c- }22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
. X6 |- f2 h/ ~. k4 X. Z: k6 X6 Q1 b4 t' P- @
23. 基于STM32定时器实现定制波形的示例 (2019·7·25)
/ n; M0 z+ h: N7 X; Q" G. R9 l4 H$ S$ N. e  K7 P$ S
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)! W4 g7 Z) a/ t
2 _0 y9 G9 j. m$ R: A: H
25.MC SDK 5.x 中增加位置环 (2020.3.31)* C# G& V6 u" @: n& ~

9 n# q" z3 ~& U' J* n' n& s3 o# Y1 C26.STM32高精度定时器PWM输出话题 (2020.4.29)
. j: ]# d' y# r1 H" V' I! i! i/ u1 Z* E5 V3 c/ K+ f' U& M4 M2 T
6 Q3 f5 W$ L1 Q  d4 ^( F
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)
  s. K- A3 I* b' B
. F$ [7 e, U( {5 Z9 B
七、内核
' l  x, P& D; y0 K: D * n$ l. H* d! x- o; z/ _  h; N' |* _
1. 使用指针函数产生Hard Faul
3 P* l. d. d2 g$ w2 d" ~5 _' v
9 ?2 X* o# k8 @& c; _) p# G2. 调试器不能通过JTAG连接器件
4 k5 l7 q) V+ {: T$ j
, O$ J4 h4 |# O5 K" f! U2 q( T3. 鬼魅一样的Hard Fault
' X* Q' y9 I% d, p6 A
$ A" `( L# a1 D+ o! ^4. 进入了已屏蔽的中断[
  d) F! _' a% z' F - s% }3 d9 B0 S+ A) O' ]  w+ N
5. 浮点 DSP 运算效率不高
2 Y( W1 Q# n0 e# ?( w! F! c, l1 t3 P6 q5 e5 h+ d2 D
6. STM32上RTOS的中断管理
6 d- r0 ]  C% C( x
1 W- a- D4 i# @6 h, Q/ k. Z" \7. STM32F7与STM32F4的复位序列比较
$ Q! ~' a8 X5 R' }0 ]: P7 u# D
7 d. Y1 }, [- R8. STM32F30x 的ADC 采样的傅立叶变换
% r+ \' s2 P# M' A" X" W& c8 @& z+ D" v' [; k) e- m
9. EXTI重复配置两次导致误触发中断的问题
6 D: `# a" D' I' g& n6 C! M
9 b9 I0 w" d; n1 H! S. ]$ m10. STM32F3xx/STM32F4xx使用浮点开方指令
' L3 f% D$ {6 g$ ]+ H$ @6 s9 L1 F: v
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响5 R$ e; W+ e4 Z

( B; M# w' P  p- e8 t 12. STM32F7 MPU Cache浅析  * j1 }2 a3 Y- E# Z  R$ O
1 R- m) U( I' v" q, }) P
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
8 |  }) d- E# t6 {6 n. T& n

) i+ V& ]9 f2 t$ a8 l* k( m$ }14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)4 ]* e& x3 k, k+ y  |4 [- A, K

' ?  b: e, |# K; Z
6 q( C9 i) H, r八、系统外设
+ l; N# @3 U* i
0 c/ \" M$ H5 b6 G1. PCB 漏电引起 LSE 停振
% j% F9 S8 f' Y( D1 z4 D 8 b- q8 l4 F$ C, z
2. 时钟失效后CPU还会正常运行% H( F0 f, {0 M8 z  y9 ?  {: \

7 N' E! k( L: r+ P( f. ~3. STM32F2中DMA的FIFO模式0 m" V$ m3 v! ~4 k

  ^8 ?1 U2 a. h6 d. O8 f4. STM32L053的GPIO翻转速度的测试6 o4 c3 o/ p! i3 X: w& k% H5 A

' W" {5 I5 `$ H& X1 C5. STM32F4xx PCROP应用
" @/ ]" v( H( M
. S; E4 s3 b" L2 F" j6. STM32L053的GPIO翻转速度的测试
& l3 ~, G+ O' P0 F& u; m" j. a6 y( Q- X+ v
7. 如何在IAR中配置CRC参数
# D* k% I1 ^' f* L
4 P4 ]3 S* _/ u8 a8. PCROP区域函数无法被调用的问题与解决
( J$ [7 H+ o5 p+ ^/ R/ X $ [* O7 t3 U% V2 k
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题2 t8 h; M6 x6 Y" Y7 G) x$ E! I- O

5 S/ e; K5 r0 {. x; q10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
: D4 U) j7 d1 A: k
6 Q( b1 e( L0 g& ]11. 如何用LSE校准STM32F4内部RC振荡器% }* z2 a, o4 ?- q
5 k5 f& X/ z( b0 n
12. EXTI重复配置两次导致误触发中断的问题  # s+ G' {4 a" w# h1 T

$ k8 p3 J$ k& w4 |1 I, a13. 时钟安全系统的应用(LES篇)  
; _- \4 A) \: x5 d

1 S" d3 z) j5 v, j5 D
14. 利用DFSDM开发PDM麦克风应用介绍  : Z7 K" A. k4 T5 m* R

% x8 K8 o6 Z; q) ]) {5 a6 l; B15. STM32H7的FMC外设在DCACHE使能时运行不正常
9 o% @  \- ^4 _* Q$ S/ a& T& P3 `8 r, K8 p) `0 q; m2 U
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)
% `' }' _. I$ W! T5 a* z
/ B, I9 X- x1 b. ~. s2 O8 g' G
3 ~" d# F- U& {: ?九、标签和收发器1 f+ S$ U. P* `" d
$ M7 k5 _7 N4 k/ q) z0 T
1. CR95HF的初始化步骤, |' d6 B; [, W" y

& V" u" `; j! G% m4 Y0 M
6 v7 ?. o/ Y1 j1 E/ C, e+ j3 @+ @- n9 j! w
十、生态系统) h& Z3 w# [, r* J) {0 |3 S& b

8 ]4 M* `! ]7 Z. d1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题& H" [+ \5 B8 y/ T
- B- q7 G8 V9 D1 A6 }" U$ h
2. MDK Logic Analyzer 功能在STM32中的实现问题
" }5 S! j" B, c) M. h
6 u% d/ I2 ]1 w5 T+ J3 c3. 在IAR6.5下如何将数据存放至flast中
+ {# o8 Z  h8 ]# o   n, V3 P$ g3 Y) i
4. FatSL移植笔记
& W. P* M. a! v" s" j % b/ x/ I. c% y; x' x% d
5. Keil中使用STM32F4xx硬件浮点单元
; z% U9 T% [2 o5 n2 A" ^
' p- g+ C& o9 |/ y6. 如何生成库文件(MDK和IAR)! \' N, M& [! d. h: Y% @( c( v$ f8 T1 S

' g) ]5 O) G7 k7. Nand Flash文件系统解决方案
6 k- d+ j1 B7 @/ Z  v& W7 A% E : p4 C& a' V3 H9 a
8. STVD在调试时弹出“Cannot access configuration database”的解决# Y5 S" x7 |: K) T3 i
* d# v/ M& H# R( C! x% q
9. RTOS低功耗特性的设计原理和实现
; a' h% \; ~2 r7 Q+ s2 Z& Q% O- T 8 T( b; }, \$ ^) X5 w
10. IAR下使用J-Trace进行指令跟踪
# H! A8 y2 E7 T
( G- v+ g) {0 Y* e8 F% q" @% }0 @11. STM32上RTOS的中断管理
1 g, h. ?# G9 \6 l$ e/ N0 Z, X# }
12. IAR下如何让程序在RAM中运行: O. i  o" q2 X2 ^
: d: C0 V$ _  s+ d0 V9 q
13. 如何在IAR中配置CRC参数
7 q- y6 j6 v; q. S
% C/ e: h3 k4 I14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册
. a+ M3 b: k; n" `+ [, y7 G4 j6 n$ d3 S0 Y# T
15. 使用mbed进行STM32开发及STM32F0的时钟问题
7 B7 v$ Z7 @7 }/ |$ b; }( i$ B- ]2 Q7 O6 y' E! M1 l
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
1 f) d/ i+ R& S8 B
; x! Y* r- n4 A; [17. 多任务系统中的不可重函数使用注意事项
# e! z2 B: a0 C8 x
& |& A* k* a4 t' [18. STM32 utility的hot plug功能
# b' q6 c( [- R) N/ a" q, B
" q: ~+ Z) T2 h6 W. y8 f- ?19. 如何将CoreMark程序移植到STM32上3 j: f3 s! W7 w/ h. A

+ U/ D* ]* ]& ^5 B: q% A20. FreeRTOS定时器精度研究
4 Q) W9 C- s1 f
% @% T, g) |. j( {3 `$ J21. 如何使用Eclipse和GCC搭建STM32环境
- x- \7 O5 G$ c, o% Y9 z6 M& n" y% R5 n9 \& F( I' s0 K
22. 如何建立一个基于GIT的STM32库
, W0 c) u. s6 p4 n% S5 P2 W, T/ X) ]. `+ k9 z/ T8 i4 m/ J  W
23. 从零开始使用CubeMX创建以太网工程6 g- w# [& X  f. J, F; @- Z
) ]) y- Q; L1 {
24.从STM32Cube库向标准外设库移植FatFs文件系统
: m6 y( P& u0 h: J
6 |% l  ^" S3 q+ N9 p25. 基于 STemWin的屏幕旋转# g1 v1 E; o* @, l" ~; n

( K* Y& A7 @9 I8 z26. 编译软件 Hex文件烧写   z! V# D& K: ~$ u5 |! i

% r: [' |5 b: ]( G6 o27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
+ N% I8 D, ]( U
) |! M7 a3 Z2 Z; c: O28. USB CDC类入门培训
. Q! B( X- [. m9 O8 u) _
6 \1 l; O- o' @5 E29. USB DFU培训
6 B0 F8 B5 p& U2 @( c# H; P# |
8 Z9 e4 }, r$ Z" _" _0 T- d30. 用于量产烧录的拼接Bin文件操作  ^: `0 H2 N" f4 I7 Z

! j% Y3 F/ B( @7 J31. STM32免费开发环境该用谁+ W# p( z' ~$ @3 Q( J- D9 h
% M# r7 k6 X. f6 i# a
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
! n$ \2 V  M' r# W  N2 f5 h  p. s0 B% ]/ O  C. D
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
9 r' Q9 P; Z5 e6 r
1 g! i. F3 f" [' m7 B7 m4 D9 ^34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  0 j3 e$ f- H) m6 V  f; H% y4 ^3 D

+ Z+ s3 v' o% u5 [9 g! x3 x! }6 g4 d/ P35. STM32 FOTA 例程之 cJSON使用   5 ]& H- f  d3 L

6 A& l. M" x' z: K3 h$ f. {3 f36. STM32F769DK 云端固件升级例程使用说明 7 u5 z! G; t: \$ @* B
1 u  P# s( ^1 H! F9 ]
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 , v# U& ?* O( k# f
# Z# d9 S1 J/ Y: U
38. 基于 STM32 的阿里云物联网平台方案   O& `; m+ N, Y9 a

! _8 v( `; X1 S, }9 w- X; ?1 H39.AliOS 任务上下文切换原理分析  # i) U, V$ W" _- ]9 f
/ t5 M. _* z0 M7 W
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  ; g8 {$ F, i# v3 s5 d
2 k  {3 g2 N+ f  s3 l( D8 @0 C+ X  k
41. STM32F769DK 云端固件升级例程软件开发文档  + \5 N5 R8 C: h, {- l0 y

6 c- y8 l# k7 U+ U; }$ I42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)$ f$ {, P) Q; j6 f5 f! d* c! j

. T& q6 V5 i# ~2 M43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
( J5 C3 f; P6 C5 q$ u; k  ?6 W/ W! s. S. f2 H6 F/ L; F% N
44.零基础快速入手STM32MP1 (2019.9.19)
2 z! z8 e9 {; }* Z" z+ h& K6 v1 }0 c9 p  i% L; ]
45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
( R; {: E" a  k1 S$ S/ C! S5 ?: g
十一、调试
5 w' ]! U/ B% m( I 2 Y+ ]% M* |" D  E" J6 F7 v
1. 关于STM8S SWIM Error[30006]的分析9 h5 X  z, B7 e. o+ r' z+ ]' B5 K
; f/ r% f% r. u0 e8 U
2. STVD在调试时弹出“Cannot access configuration database”的解决
4 z- M+ i4 a( F9 A$ M7 X/ p ! }4 l7 ]' ]. L$ W
3. IAR下使用J-Trace进行指令跟踪
4 w9 G# {) c( q: v/ W . v$ j9 b9 H' c5 x
4. 菊花链 JTAG STM32
  G; T7 }0 Z2 A
) Q, v' r! V, |) [' f$ E5. STM32F411CEUx 能下载程序但不能执行, g# n6 W3 h/ P# M& B* N

. R; [* }0 W1 c  i  I6. STM32F103C8T6 程序上电跑飞" y0 t, V; P( Q2 U: \, A! p+ A

4 q9 B: t0 Y* ?, l! I* \6 y; \2 V7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
6 k8 V7 e! Y5 [2 ^) a. f( ]
- @3 `8 f5 ?+ z" W8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
- H4 f: C  `' O1 c5 k* l9 n! J! h) f0 F* _7 W0 q4 z$ z. l
9. SWIM协议的GPIO口模拟: A$ D) E! e' x2 n5 b& Y

' S% |" ]' I# i: {/ p10. STM32F091空片使用ST-LINK烧写后复位不能运行用
; D) ], x/ E4 Z! n. ~
& r8 L) P8 P. `% m: }11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)* L9 I/ ^+ J, ~4 z, J& M

3 k3 A  a2 Q1 }) o% Z  l- r% O12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)8 b; G3 J5 B/ n- Z1 r# Z$ `3 {
. q' Z+ E" n- ]- u" q  l
13. X_Cube_ClassB代码移植 (2019.12.24)/ Q4 T3 f" J5 O) _( H3 z

* S* W) S) f. j
, w0 I9 m8 [- n' t
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)$ g5 ?# A. e  }! ~; T

* f. r# P& O! ~2 \  A& \) b5 d" H十二、人机调试& J) J% Y+ a8 ~: C! _% _
9 J" B) ?  @' l7 _, ^* U
1. 一步步使用STemWin在STM32上开发一个简单的应用
1 `+ ?! j7 F' A$ T' X0 x$ _) I. P, R9 {
2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计5 z6 D" {1 M' d  d" L  h! E) k/ J5 a

. H7 u1 a1 u) F3 z: _  |9 y. w( T3. GUI方案中ALPHA通道处理介绍- q, j- L& f& n$ t

9 f# y) N4 F! J4. 基于FMC8080接口8位LCD的STemWin的移植
$ b* v) M0 L6 v  v8 i( K
* M3 q  a7 k% R) T+ G4 m5. TouchGFX中Callback模板实现原理 (2019·9·12更新)4 b9 }3 T& x- `8 J
8 x3 Q  `! ~3 `( D- l2 R9 \9 w8 C
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)) y/ _( j% V$ V. h( }  s, Z2 `6 A
# ?5 D+ I& a0 U/ ]3 a
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)
' N5 c& ]* r- z. e! P
: i8 a( U% L0 D8、STM32L5中如何关闭trustzone (2020.5.12)
2 c/ [' f' l( }: k9 K0 f# ]3 G
/ N2 K( ]" A( ?* s3 F  x0 u十三、马达
" u: x/ D+ O" |+ B9 z% X7 ~
: U6 e  S# W- O3 a& s. T
1. 电机控制同步电角度测试说明
! L  t9 U  G- m4 i' @, h7 j5 K
$ [) e$ e% ^. ?7 }: `4 k& W: \# x5 R- w/ I7 v$ @' v3 z; V
4 S0 T" b8 M; I* `
十四、安全; l2 R2 M& t7 K5 k$ W! ~5 }
! j# y9 l! H2 `. {4 G7 K
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
5 T7 p, Q9 a( W; s/ U; z
0 f/ _# d, q! u; P, f& F: w& l* q4 x* T
十五、其他
6 {% u* k6 g- t" p
6 ^& c- X: g' T) I) @4 O
1. 跳不出的 while 循环7 S# l4 S  L& Y% U$ L, D

2 @, f  K2 ^4 V) n2. 外部IC连接NRST导致MCU内部复位信号失效的问题
! K2 o) _4 S7 i! E, g 2 v& ^* _7 o$ F$ p
3. 潮湿环境下不工作' T" ~/ K% M+ {# I; d
% e2 `1 `: Y( A4 l
4. PCB 漏电引起 LSE 停振
  Q  z% |/ z! ]' y" h 7 z* h; o5 s( e) p2 C+ `4 o' ?
5. STM8L152 IDD电流测量
( p2 ]- A6 Q* ]' ~: {
( M9 T; Q9 E- {& y; r) V6. 使用STM32实现锂电池充电器7 O4 |  X  K1 ^: b* E

' ]6 d' V3 X4 n/ D/ F& _7. STM32_STM8硬件平台基本检查% D6 Q  ]2 ?+ |2 O5 {
/ Y4 P, f: c, C: r
8. 验证STM32F401在STOP模式下的电流
5 Q- L8 e  n0 u2 a( P! g! D7 b* _# V1 W5 u% {
9. P-NUCLEO-IHM001 电机开发板串口调试指南
; T* q5 k3 Z7 j0 j
, a7 x& ~8 }% J% x10. 一种计算CPU使用率的方法及其实现原理
" U0 p- y+ c) L  A
+ r8 ^  c) C/ x2 R1 P- m11. STM32 RTC不更新原因分析3 t$ v! d7 ~0 [% b4 R8 B2 \. J& B

( p6 i# D2 c# t5 i0 H% C# o12. 关于ST库函数的代码性能对比
/ E: m  \  c  j( w) [4 _+ l4 G+ e* g) |9 q; p& Y9 l9 G) X, L3 H
13. 在IAR中实现通过将程序在SRAM中调试的方法9 _/ a" ]# Y( f7 N* |

) J5 K# ?1 y& C) E; j- u1 F. ^14. M95xxx EEPROM写保护配置
' M+ }3 H8 }$ j+ B  Y5 |/ O' v9 b
15. 4SRxx的GPO的属性9 e! _* e# T' i( {. m

" N' D. ~- Z# m0 H16. CR95HF的初始化步骤 5 d" h: s' b' k; F
' O' X: y, b$ y6 @/ E
17. 电机控制同步电角度测试说明  . z1 W  ^$ o5 z

& X/ D/ G  S2 [4 s# \/ \" x18. STM32+BLE通过 Notification与 Android应用程序通信的例程  L# F! h3 v: g. L" }  w
" x* A" J& S  ^  O* y
19. M95xxx EEPROM介绍
6 J% \( S* D* b9 i
; B, N& M- u6 {$ E' v20. STM32 DFSDM测量温度应用
, U" x0 v9 q* }" W4 f) l. J! q+ q- q& G
21.代码实现PCROP清除% v! H' }5 D% d# G; i' j$ |

9 O) E/ x, k+ W; o22. 理解与应用MPU的特权与用户模式; k3 t5 \8 l: X: s3 A  h6 @
) P  E0 g% E: c% [# q7 y
23. 用于电机控制单电阻采样PWM变形信号产生- Y/ j& j& v+ D% [9 B0 H
, n' Q4 ~: v* Y! w
24. STM32L低功耗模式唤醒时间测量
- y% j5 o( [6 d6 ~3 [' e( A1 J4 @. v$ k1 l" l8 V
25. X_CUBE_SPN7程序电机启动抖动问题
- \8 h8 \2 d4 _1 I5 Z5 i4 R/ ~/ |% u2 W8 Y- P, b! ]; X( y
26. 发现STM32防火墙的安全配置
# g0 t1 _1 F5 U' V' c+ ~" v
  y! o9 P7 |4 `. m3 ?! f27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改% I, Y3 _; i4 x8 Y

. p/ o3 x4 d/ l# `28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
6 w7 ^+ _8 G! D8 F* P1 t5 B; c# [0 v  A  V& L& z0 G+ o
温馨提示:
; s# R% G# B9 S1 J
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
+ r$ ?& n. l" N

5 _: Q* r% ~6 a2 f
/ `5 [4 C3 G  y! A% f
) c8 h" `( J* e6 s+ l8 B! z9 W

6 K8 p! f4 N. d; U; G! S# @  j  I1 d: t; V* `

* ~& r6 t- Q7 ]- H7 S7 M
" c$ c3 h1 D+ z- [* X, ?
' d; E  l. L/ w6 S: P' V( B4 i' z( S5 R6 Y# p  }) a

评分

参与人数 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
好详细,多谢分享
2 o$ M+ y3 ~; v1 F; E7 x. I
5768340 回答时间:2018-1-13 14:42:54
HI  
( [# g+ X6 d+ T   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
- r1 F* h% j' s% A  _2 h( y# `   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    8 y' ^5 c- l6 ~! `# C0 B
  2. 函数名称:Cdfinger_Bspspi_init
    ; n' m, ~- P0 G( S' u
  3. 函数作用:spi初始化函数
    * F! l. N7 O8 j% W; Q- e: N9 R
  4. 备注:
    2 U6 j& [+ W, |- q; ?& h8 p* d
  5. ******************************************/
    " B% X/ L5 @3 B9 |3 C
  6. void Cdfinger_Bspspi_init(void)1 u8 o; j, ~+ d+ U4 M/ }
  7. {
    - {* s5 b4 D8 h' Y4 H# ?8 a
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    1 R+ C/ g$ A9 q; o+ k
  9.         SPI_InitTypeDef  SPI_InitStructure;6 j7 }5 h" g+ a7 z
  10.         DMA_InitTypeDef  DMA_InitStructure;
    1 V& j8 p( _: i3 I+ k0 [& d  }. j
  11.         NVIC_InitTypeDef NVIC_InitStructure;- w% a/ i" H9 r* S- C
  12.   % f1 \9 K2 K* }
  13.         int ii =0;) q, K3 b" l- r/ Z
  14.         : c& m2 F9 p/ a- l
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);2 I& z1 W# j; o* F* Q
  16.         /*!< Enable SPI2 clocks */5 n0 U7 p0 C4 p$ D' F" w
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);6 W5 e( I$ {# m# j5 t- W3 ~
  18.         /*!< Enable GPIO clocks */$ D- o+ a: m5 ?' t3 n1 p
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);1 `% s/ a5 ?: @' |
  20.         /*!< Connect SPI pins to AF5 */
    5 Y! R) W& X* e. a4 S
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    + R( G2 O! h( W5 }4 M6 H5 j
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
    ; H7 W8 G* Q' x3 p, T# N
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    & y! g( ~/ y; ]) T& v; t. h. t. T
  24. # ~+ P, w2 n9 z9 }
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    7 y/ @1 f7 n  J9 Y
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: a4 S; K% h+ M1 @
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    9 ?- C7 \, p6 d8 C; s
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    & s+ J  ~! s# u* d
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;3 t8 i& k! {0 B* e4 z  ^7 }
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    9 Z, y! H6 h; Y4 ?

  31.   p( @# G' T7 C: B, f
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;5 M5 e' _( q4 J& [7 J
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    0 ?9 M7 W7 j0 `3 _( Q# {# o3 F
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    2 r7 s1 N8 X8 G' T; Q
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    $ Q  b9 s) `/ e
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    ) N2 y. L# o! u' h! N0 p8 X* S1 {; ]
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    1 s) e. ^4 i5 i
  38.         Cdfinger_BspCs_HIGH();
    ) n- w- b4 u% l$ Z% w  }/ r: _
  39.         //Cdfinger_Bspdelay_ms(1);
    5 v( Z" q1 I( H7 U) s
  40.   //Cdfinger_BspCs_LOW();
    7 ]% l* N: x6 |" {0 P
  41.         SPI_Cmd(SPI2,DISABLE);
    ( x- r4 ^3 m8 I  t( Z" O
  42.         SPI_DeInit(SPI2);  d) x' j3 j. L+ ~
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    # x0 T6 O& c/ L, w: I
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    6 A* t% z* F9 x3 _& C( \" C  l
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    4 ]; Y2 L1 {; \9 n; _
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;/ Q5 K- Z* u1 f& _
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    ( j0 I/ d0 @" D9 i+ U0 Z+ b
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    * s$ s1 H1 R- \; c
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    ! q9 Z$ H6 q* y' N& z
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    + g9 \; T" G% ^" Z7 ^5 J0 s# C. E
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;0 k8 \# Z6 G( k& O7 D* n
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    & U+ O; }0 Y& c3 J, H
  53. 0 o4 D  T& Z! B9 [
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    % k! U; ~" s5 Y: j
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
    ' w- q0 q$ H+ U+ i
  56.         DMA_DeInit(DMA1_Stream4);
      Z/ ~+ F9 U% y) t
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    8 |/ C0 e6 T2 a, A* s8 |
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);0 H9 z' @  d7 n8 H; G+ K3 {
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];
    0 f6 f2 Z! n  o/ N" H4 r( O- Z
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    - _3 i. F" q  s
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;, ^" `4 D9 O& |/ v, [
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;
    9 A2 X* W4 z7 k+ |7 v
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    1 {1 a0 O. f2 D, I* e
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    + `/ p5 B* |/ m3 y; D4 W
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;" H$ G/ m4 f; u% C
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;8 h$ z5 [8 k8 F( v; M6 P
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
    * Q; z0 h' d+ ]) U
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;: ^! a1 f  p% Y- a& [- k
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;/ V+ B8 @' r6 `
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;6 ^: T0 A7 \: G# @6 S" X' m0 E' u+ l
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;2 Y* O% f. h0 F7 @8 h
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    6 {9 p2 ]) {9 U' {
  73.   
    6 l" X0 ?$ X* |+ A5 H
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    6 n3 R4 Q! V) g/ p* F6 t" U
  75.         DMA_DeInit(DMA1_Stream3);
    1 x0 I' m' g6 o- d
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    $ Q; X0 A* @; G7 W+ |) C4 \
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);" @5 t# C! v- T4 S
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    % N' l1 n3 p4 R) z( u3 h  X4 g2 c
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    5 [1 F$ n6 I6 W% b1 W, _  Y. l% Y% p
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;: n. ?0 w9 k1 D& u( }: o4 J
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;, R& A" ]3 r* G4 Q& T" C+ {
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;; K% ^* f; M7 e3 l& {. b) p
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;- [; j: A1 u8 b- c3 a; R& S
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    7 ~* T/ N8 ]$ }3 n0 u" h2 W
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    4 g. P1 J# t$ E+ o
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    ( k5 D, `) _/ ?
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;0 u+ ~6 e* Q# o
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;& q' J% B1 `# q7 {, h( s" P- @
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    ( K. [, Z( z4 j) i
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    , b6 D. R+ m  Y5 E, t
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    ( n. ^7 G( |9 v* v
  92.         //Cdfinger_BspCs_HIGH();
    * W$ `; }# x4 S
  93.           n) L% ^  D  N- C: N- k

  94. 3 q1 H+ O; ]1 h; {
  95. - H2 _4 i8 z2 H9 S/ f# G: e& c5 I3 d
  96.         //发送中断
    + _# Y% A  U) k* l0 R
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);8 s$ C. M7 a" y
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    ) z3 P7 H/ F0 J- q9 a8 M5 r2 I
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;5 U- Q+ [  ?' ^! X. P- L1 L; M- U# U
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;& z5 M+ e0 H! Y4 I! }1 X
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    / [) y4 q* k; q7 S& ^3 D
  102.         NVIC_Init(&NVIC_InitStructure);
    - l! g6 O8 J. W. o% Q4 g' P
  103.        
    9 u, H+ s0 ]! Z1 ?: f; T
  104.         //接收中断
    5 V2 t% S' }1 T/ Z$ p6 u7 P
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);) g* ]6 Y) a  ^* f1 u
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;       q7 h( ^- R3 \
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;7 @" s+ g$ ?" H% t: h
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    2 e  I; N) Q5 i6 ?, u5 S1 X
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;9 P/ _! t1 N0 H2 ?5 r4 S/ Z( ^
  110.         NVIC_Init(&NVIC_InitStructure);3 i% ~& @+ K- F# ^# y
  111.         SPI_TIModeCmd(SPI2,ENABLE);5 n# T2 i" Z  Y. x
  112.         SPI_Cmd(SPI2, ENABLE);
    0 Q" W1 X3 X6 k  t7 D
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    ' s# F* _9 {. J% H- b, k
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    4 i! r  N1 y- E; L

  115. " A9 x, `6 {/ z  h& D) H
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);# m" `* }) {4 K& t, N
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    $ Y  s% D$ F& {6 S* C
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    5 F& s* |7 V* p- k% t

  119. " V( y* z) G: c5 ]; V; g" A; B
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    % Z: q! ^6 ]# ~" N! a3 ^
  121.         {
    ! S; s8 `. I: W6 C, F) M( g5 Y; a
  122.           if(ii%8==0)
    - T9 O* ?" e8 R* S( J: L
  123.                 {
    + \: T- a% W* P
  124.                                 printf("\r\n");
    4 e, _$ _1 k6 a" `" Y
  125.                 }
    ! @+ M' |* U/ N: {6 n/ B3 D/ j
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    0 e( [, q( L7 Q( N+ U
  127.         }
    , j) ~: n6 ^% b9 J1 y# o
  128.         printf("111\r\n");
    9 m, Z6 q& J3 p
  129. }
    % h; j" j1 R( }' J% ?

  130. 4 f% a' a6 D+ |  |

  131. . I, C; P& t, }' e
  132. void DMA1_Stream4_IRQHandler(void)
    / r2 l5 \% b, H) a0 Y1 E
  133. {
    - j0 ^0 ^& m" L5 ?0 I! U, w
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    " |5 Q+ U$ e- {- M
  135.   {
    * X; S) T: x1 x( o" w- K
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));5 `5 {1 ^$ x1 {  B  q* b6 _/ C
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);& F' k- ~* T( d3 Z1 n+ i9 A
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
    , D$ Z2 A! z4 V+ W) l/ ]/ b* |) U2 u
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    , k, v2 M$ w* n5 ]
  140.   }: W8 a0 M+ V2 E7 J) x
  141. }
    % N/ Q. R0 I4 r

  142. 6 J) Y% O. x4 U" h6 ^
  143. void DMA1_Stream3_IRQHandler(void)
    $ W6 b" f, y9 o5 U
  144. {
    : ^& B0 p% X4 x6 g  B
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
    0 c! ^3 M, H  G
  146.   {: ?0 r( S" _* P9 n* |
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));6 O/ z& d0 C: J# j. e: ^0 R! g
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    6 s3 C+ i& s7 ?$ [- P3 w* @3 X
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);% g7 j. v! y' {" h4 @+ ]
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);; w- ]0 @& C4 a2 ^
  151.   }
    ' m( l+ R+ ?& F. H+ L! ^1 O- d
  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的波特率是不是必须为相同的,才能正确通信
. _! c7 |1 d8 |- s/ A: {  p, N以下是全部代码:
# a6 p1 z; i/ a: S& u  P/ Y4 |#include&quot;stm32F4xx.h&quot;
, x0 \+ b) C" dvoid RCC_Configuration(void);
4 `4 K! t/ r2 _void GPIO_Configuration(void);
0 S' Q  M( \5 n' \void SPI_Configuration(void);
' P1 ]" f8 p& l7 Vvoid Delay(int nCount);
' I4 n2 U; G7 T' O4 Bint main(void)
5 |9 x' s  {% x, w{  RCC_Configuration();
% n, n* `: K6 {7 ^, a' y  GPIO_Configuration();. D( E% w9 G/ \  k( z) C) W' p
  SPI_Configuration();+ t0 A: `7 R, A" o- _
 while(1)7 q/ v4 f, O# C4 x- \
 { int data=0;
( g7 Y6 c5 W5 Q* ~- U+ _+ S  SPI_SendData(SPI1,0x55);5 l7 a( q. y0 V8 \9 y! x
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
8 h. ?+ _0 I; G! c/ C1 S  data=SPI_ReceiveData(SPI2);
$ \; _, F% @- E. H# e5 j! ?& |  if(data==0x55)% I* C  ^. }( D3 l
     {  while(1)
6 W% G' o( o7 q: s* r& V& b' e  W             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
* G5 L" T$ N; a2 B! {) L                Delay(0xfffff);7 k8 I* r$ C5 v5 [/ m
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);, _/ D- C* E; ?$ G) ~+ H
                Delay(0xfffff);
: T0 c; p. [8 H! Y+ p$ d  
* j& J8 I6 T6 a( o3 D             };
# `+ P# l- k) V" |     }
9 L! G' Q) S  o! z) F     else while(1)6 L1 O$ p3 A& K5 V' i+ l" w9 _! ?
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);. V3 y8 X6 Z9 [/ x
               //Delay(0xfffff);
: Y1 m% J7 \/ b3 X' P5 h) P4 G) x               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
( n. C$ ^% y1 _* A               //Delay(0xfffff);
. o; L0 S' ]0 f" M7 e   $ v. y. o3 c2 L3 n. g- y# g: \
            };
5 q+ [- {" \& X. f: ^- G }; l" b) `6 M# M
}0 D' E$ D9 @$ Z$ K  f5 m
void RCC_Configuration()% [* L/ w+ Z: a& T; y
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
7 j3 C5 y: `) e0 E; ?9 d( v  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
) S% y6 U( o1 a9 Z: o2 c' r8 J3 I6 D. g  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   % `; D. s* |0 x, o
}
7 D  {" G3 W+ C8 {0 Ovoid GPIO_Configuration()9 y' k( k+ D4 {3 h, v# V- G
{  GPIO_InitTypeDef GPIO_InitStructure;
# o0 Z" j. P: k  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;3 t/ `* l7 [, g5 [4 M6 ^
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
! L" y9 y  X- `' w) I% A; j  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
7 N5 b8 v7 O3 [: p  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
* e  X( _( [8 G3 e! w6 x  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
& L* x( _6 o( H; {  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
0 L6 U( l: T: \  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;2 M% Z% N$ Q% e
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;2 Q' ]9 e3 j/ J# U/ F
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;6 b% u6 t8 {: D! F
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;8 q; _: [) }4 p& g1 N
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;# E' G- ], c; r7 r  o
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);+ y  r% F' B7 y- H$ k
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
) a) W: ~. G: o3 J: {. R- b2 y  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
, B8 O7 |* f; I9 E}- V0 ~9 V* p6 m$ i  O6 l; ?( N
void SPI_Configuration()
7 Z2 o, X% I' s' ^! G( K' U{  SPI_InitTypeDef SPI_InitStructure;
8 K9 p+ {+ i5 F& ^  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);7 Q7 J: P; P) p. q& x0 O
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);& {: M' \8 h0 P! A4 Z
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
  S; n8 a. h" M$ W. D# r   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);1 X. J' ^. W6 W" F, h
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);0 }8 J# l' N" ~; V3 j* y1 k
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
4 Z) ]. k5 m, C% {  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
& }3 r! |2 U- ^9 m  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
9 d8 h: \5 f& F$ M6 h) U; W  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;3 d5 |6 B: x& [" H, K
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
% I5 i/ K# c1 s% N  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;7 n  I' R: ^% `! F/ K
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
! [0 S/ r  Y+ D; w   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
* y- f1 l0 i& `1 `9 |4 ~   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;4 q  h) a/ j1 c. M
  SPI_Init(SPI1, &amp;SPI_InitStructure);+ d, ~+ D9 N  Z/ Y+ e" s
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;( x+ a0 g% Q2 W
   SPI_Init(SPI2, &amp;SPI_InitStructure);
* C! X8 N4 _  C' ~: ^* ?3 [   SPI_Cmd(SPI1,ENABLE);
- p6 W; }  O; v6 g# {   SPI_Cmd(SPI2,ENABLE); % v8 k1 J( u3 V. f
}
6 C, \9 N3 i0 kvoid Delay(int nCount)
7 y+ I6 V' f7 ?" C0 T) o( ]5 [{ int c1=nCount;5 n* T$ o7 A/ {. x  F
 int c2=nCount;
( n' D+ |1 O7 H" z$ ]' j for(;c1&gt;0;c1--)
. q3 |- v& P1 V  r7 w: u- i" p  {2 m8 x: @) k, H
  for(;c2&gt;0;c2--);
# ?, Q9 ]+ }& r };( ]2 m! b% z! f7 _8 J+ g* d: Q
}; f" ~- p* U1 x5 A
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:
: V8 d6 w( F) C2 e1 s# ^9 O' t楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
0 C4 S7 ?$ o* Z2 s以下是全部代码:
- x9 w' b* s& f#include&quot;stm32F4xx.h&quot;: D. a% F! k/ W, @6 s9 r
void RCC_Configuration(void);
: \' B* K6 n; s# C$ e! Zvoid GPIO_Configuration(void);
' N' Z4 ^) a& g: V- k& H* h4 Zvoid SPI_Configuration(void);' A( m/ J" z6 H* {* b
void Delay(int nCount);. h- y- m7 T  V
int main(void)
; m* K8 V1 T8 r1 z# W{  RCC_Configuration();( w/ Y  N; |& M. g
  GPIO_Configuration();
0 R# A- m, W" Y0 Q' }  SPI_Configuration();
& J9 j8 r& V" R while(1)
. ^1 z8 ^9 \' [" c4 ~/ \: T { int data=0;5 J8 p+ p  w- t1 ]$ E+ p& V
  SPI_SendData(SPI1,0x55);
0 I" |8 K! _& C" c- W5 Z  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 9 {1 R# r8 v$ E1 p
  data=SPI_ReceiveData(SPI2);
; j' t% S2 d- J+ w  if(data==0x55)
& U% g  n9 \( T8 m( p     {  while(1)) C* i8 i+ |0 j9 ~  [/ y
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
4 a! g2 {1 u3 H" I                Delay(0xfffff);( ]. E3 V! x% h% d1 F' r/ ~
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
+ c& o3 ^: Y- T  k! s5 K* V                Delay(0xfffff);4 z" l7 ~8 X2 W  E; M# u$ {
  
# ]( k+ I) L5 X' H             };5 l. Y+ x4 D, A
     }
7 Y$ l$ ]) s4 U     else while(1)6 e2 X; k; A; l; b
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
( E. ^; Y" U2 I' i) M5 l( z               //Delay(0xfffff);, a/ y; {4 j* m5 W) F+ }% \* O) Z4 K
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);: s9 u9 U) t! V  k
               //Delay(0xfffff);# J0 e* @! @) Q! j9 ?
  
7 T; U3 A$ m& i% b( ~5 c3 ^$ \" D            };
3 o3 y! j0 G6 X" N2 @1 i9 a }
" ^4 a( O, @( L# T+ q4 J}& P% F1 {. L; C" J% L5 [% y
void RCC_Configuration()" S6 l% _* G# Y) q2 K
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
' d3 N& u5 v1 a  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
! b8 d& j* M1 h* I+ ~. C! I  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
% `  w$ g/ N2 a2 a}, i' J, w) c/ E% V8 [- Q" B4 i
void GPIO_Configuration()
* [. z% m: \  i- x/ l9 f4 C{  GPIO_InitTypeDef GPIO_InitStructure;! q4 t! T: Q0 w% |
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
; H- G' A# i+ p3 |- d7 e1 f& d  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;: N  N: Z3 d5 F9 q: z
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
6 E/ o1 U  F5 ]* I  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
: y# @# u1 C9 f4 q  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
. W7 e! S( {$ {, W  M  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);) d) U& W2 y1 o3 I
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
; O3 U% R5 ]9 i/ v# h  W5 q% j  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;# P9 N8 ?7 w6 i4 A. ?/ `
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;0 w" y! h9 T! v* q9 e
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
) V9 c+ X  x7 F' b. b  g  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;) n1 Y9 |  b# [  Y4 L) I
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);3 P$ b9 L% k) \0 ^
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
. y" W( s( x" g5 ^& z  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);4 Y% Q! h) }- L, L5 _/ Q# P
}
& C1 p: u- ]: {3 z" h; wvoid SPI_Configuration()  t2 ]' v" N3 U) w# C4 h
{  SPI_InitTypeDef SPI_InitStructure;5 f. q+ `1 t  i
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
5 K0 _2 U* q2 ?3 V+ ]  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
( x3 Z7 w7 w) d  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
; Z8 z' T1 i& L- \! ~   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
3 F# ~4 F$ M$ [& a  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
5 Q; c) D( I' `+ I1 B: N! N  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);/ f0 f; E3 H, M% ?4 v% i
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  p/ }2 e: Z" s* N) p$ N1 O  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
0 Z: o& x7 i* ~1 r6 E! m2 p8 _  W  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;2 w' ]1 ]7 r7 ~$ X* d/ j
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;. W: e1 g3 w+ x; H0 U
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;9 J: c# c! f3 P+ X) P) P
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
9 O" W: Q4 ?- @# V; v9 I   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
) H  y$ M+ P' _   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;/ e& ^8 }, c5 _# r
  SPI_Init(SPI1, &amp;SPI_InitStructure);
) r, o4 t; q% s8 g3 }  t  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;; C5 V$ b2 |2 R8 ]5 \
   SPI_Init(SPI2, &amp;SPI_InitStructure);+ K( a6 ~  j1 W' V! }: W: U4 u5 b/ X
   SPI_Cmd(SPI1,ENABLE);5 y0 u/ C' [4 i' G( n; s( ^
   SPI_Cmd(SPI2,ENABLE); 
, z0 G# K9 L5 q% \}
/ r! U. d9 O& r1 F+ t% T& W3 C9 Jvoid Delay(int nCount)- {6 y9 R2 p  {. s
{ int c1=nCount;
5 U) ^+ ^0 _! ]& [! q3 t1 z& B int c2=nCount;$ \1 o' w1 `) c4 _6 K
 for(;c1&gt;0;c1--)
8 ~& }& L( s( @: ?7 E% [  ?  {
) G9 D) x: P6 i. r+ ]* k8 ^7 R6 R  for(;c2&gt;0;c2--);% g6 k1 @) ^, d! Q4 f# Z4 ^1 n( D# d
 };# i1 n& |/ v+ u; E
}! l  ?  g1 \3 R7 s& q8 C: a; u
先谢谢了~~, N! m- u" }1 t  r, N3 i
 2 Q% j1 h& J+ X' m4 O

" I0 J& b! e6 O3 p楼上的问题,看我帖子给出的提示哦~
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发表:9 Q! C+ f- E4 K$ i. c2 q7 D
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
8 b7 r7 I% B5 d9 a1 q! u/ M) g 6 I+ _/ q# ~3 g

3 H* }! R) C& u( m' g多谢支持!!
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 运算效率不高

  
8 G; j; G3 m& M8 \鬼魅一样的Hard Fault
4 ]5 e) s3 {$ `. E) V* \% M' X) P 
$ n5 |) y# G2 y& c; J6 t该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。( C; n# k- s6 N  v3 t' D2 s
   |" @" Z2 a7 y+ t7 R/ |
咋解决?
chunlei233 回答时间:2014-5-7 19:50:50

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

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

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

DSP是MCU的短板啊

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版