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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
% [$ Y- b- V9 `# i, B4 f; r# M2 d2 u5 F
3 J" g% {$ C5 O
社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。" t0 x8 W# q; @- P2 E' H, {" L/ @# q
6 D% A. v3 l% x1 q% V# [
提示:点击各主题,进入帖子,可下载ST工程师解答详请
7 {+ i9 p% C6 m, c3 {3 R9 d ) `) p- j. W  o1 o

% a# d+ ^8 S& e9 y% {8 q一、通信接口) L0 \% |& F& b9 Y
# {2 @, r0 [) r3 u# b' M
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新$ f3 g# l& b8 }- e' N

4 G8 Y6 v! Y& ]$ J2. SPI 接口发片选信号导致死机' A+ ^2 S0 Q, g0 Q  \
" O0 z+ `0 e: s9 V
3. USART1不能设定600BPS的波特率
0 K9 t6 ?0 @# l1 v5 D8 [( p
/ ~8 h' N6 t( y$ X, ~/ K+ R4. I2C 接口进入 Busy 状态不能退出% |) N: ]3 T4 o4 F& ~- M

% N% w# j+ `' U3 d: |' J* \/ s5. 对 Flash操作导致 USARTU接收丢数据
. |. L, s8 \" @' P* h+ ` * `6 v7 C3 @$ e. a4 F7 b
6. USB接口易损坏1 h$ E  Z6 ~( C( m4 N$ S, _9 e
& S7 h3 b9 v2 x; Z3 [9 T
7. UART发送数据丢失最后一个字节, t% n/ _% d+ p  Z7 z# {
) K; U, G0 n4 R5 w( T* q6 i
8. 使用 CCM 导致以太网通信失败9 A" V" r' U0 V& w, p6 v% q% u

( c" T. {6 Y% j5 u$ J- W0 i' }9. SPI3 接口没有信号送出& i  a8 e6 W* A
+ D# |5 v8 \/ w. j+ Z; Y2 U
10. 时钟延展导致 I2C 通信不可靠2 V6 Y; d7 O9 c0 k
% b2 @/ |! t) M5 [3 X4 e1 S/ u5 w
11. M0的USART波特率自动识别问题
! {/ l# V% l6 F+ l4 q6 M
; @0 c, f0 _( H! d4 H5 F3 x12. WK15 OTG做U盘主机兼容性提高
& D" l4 x; D2 U" B  e* Z3 C , H7 Q/ L, [4 L' h1 ~7 Y
13. 以太网电路设计注意事项
4 E2 s4 e) V# I7 j 7 o) w/ }& L. [1 K! I
14. OUG主机库在BULK传输上对NAK的处理1 d% h* R$ s  |, `) G9 \1 x

3 a0 I8 R5 V9 T8 q- L6 M15. 串口断帧检测
$ ?0 [& @& \" L. p' V# E% j 9 ?  C# h. y' I" y2 \
16. VCP例程用于数据传输时丢失数据的处理
3 A+ B# k. z3 ~9 i" W( i8 ]1 E 8 J( U! O( P5 c6 x$ z
17. STM8L051F3P6串口UART数据起始位判断的问题, o  H* A) G8 p

9 K# {8 q6 o5 I# Z) y18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号& x) Q; n/ i& |* C: {2 [

( i; I5 X% S1 [0 A/ u19. STM8中UART奇偶校验的使用方法* G. O7 J/ f; H- E6 i
3 `9 ]; G, v$ v  Y
20. STM32以太网硬件设计——PHY3 f! ^$ m/ C; N6 p* \5 u, ^3 {
& r& P0 i3 o" {; `8 o$ w' V7 U# u
21. 一个判断I2C总线通信异常原因的方法
0 ]$ ^# h  j0 P+ i) Y
: A! q% C: }+ L* L. d22. USB device库使用说明9 e' g$ ^: W! i( v% w9 W7 ^

7 Y* S' _1 P3 _: W7 g3 g2 d23. STM32F103上USB的端点资源
8 K9 R) f+ `( o! v7 D
4 u; _+ |  f0 k- z8 k/ G24. 使用CubeMX生成TCPEchoServer程序7 r( z8 \! ]8 Q  B+ Z

- d6 Q% ^+ `: w8 k2 B25. SPI接收数据移位
+ Y7 ^  w2 z  S2 a
- v7 C$ v5 g& j# w1 x( z26. STM32F0中Guard Time的设置
$ ^4 l- ]+ p5 j* v! v0 x* C) R% \- ]1 V/ s: K; N; g! y9 l
27. LwIP内存配置+ p6 @4 v8 V1 e' o
6 w( b  N4 L  `* F0 _5 l
28. STM32 USB Device的简易验证方法* ]/ ^5 X6 ]9 g! p

8 }6 B5 f3 Y3 E: ]( H2 n29. USART 中断方式接收无响应问题的一种情况及其处理方法) n2 G$ E& b! }5 a9 J5 h% @
  p3 ^3 ]8 T" S+ B% O! ~
30. STM32 基于 Nucleo板 CAN总线的建立
9 A7 E8 E9 s" k4 w% b# o" x) D  i" G7 c$ @: g
31. STM8 CAN总线的IdMask模式的讲解  n0 c- e! }, c9 P, h5 A! v
- q6 |5 x. s) z5 J
32. STM32F746ZG USB 驱动不正常 $ [3 K* m- N2 s

: z- ]* Q2 G) k$ H33. MCU在STOP状态下通过UART唤醒分析
, q4 [8 g- ~+ X& b& s# y+ S6 Z$ r# a$ v7 K5 U( [+ ]
34. 通过STM32CubeMX生成HID双向通讯工程
" y/ K' g) k9 S2 P1 a$ ~- w* p/ Q2 E& e; J5 \3 @5 @8 T% a
35. 串口工作在DMA模式下有时接收异常
9 i1 W8 J6 X( F& k* l  h3 f$ G6 C- v0 }7 @# {
36. STM32 Bootloader中 DFU使用限制
, i) T1 R' }# C3 |$ u+ F7 R7 i5 x7 R  ^4 P  V1 `' h& G
37. UART异常错误分析
& Y. L$ \7 U. K& A! Q: O: }. t( P/ L, M& }0 t" Q
38. 基于Cube库无法检测CAN2的接收中断 ; p: v) d% m0 _6 }* y* `) C
5 ^" I0 d' O" d7 b
39. 基于STM32F7的网络时间同步客户端实现
5 l4 j( X& h$ b& K( Z% a; u0 n
/ V% A9 }3 B: i$ P40. HID与音频冲突问题
/ L1 G( }. s' v
+ x2 C$ f* H% q6 Q- Z4 P3 y41. 在进行USB CDC类开发时,无法发送64整数倍的数据" B+ V: a3 _# b9 ^* b% @! \
5 I+ {  d- G4 Y' |1 H! R% v1 t) s
42. 从零开始使用CubeMX创建以太网工程6 a7 F- z  w; g# h3 i2 h
% y' Z* y; h0 B$ H; H
43. STM32F4xxx的I2C总线挂起异常处理2 A- z4 p4 H# K% R

- C8 [( t7 U* Q44. LPUART唤醒STOP MODE下的MCU
+ X" E8 X( d" T. G" v# J, E
! U# k7 c4 x% b9 m0 u; y& o1 ]45. STM32系列 MCU模拟双盘符 U盘的应用
1 t, W8 F, ]# g' l
  z2 B- O. S; a3 k& H46. CEC输出的数据和数据长度始终不匹配
1 M9 b% d- x" \/ Z
& I0 [  h" ~( K+ H+ i47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
3 m, d3 u8 T5 K/ q& A+ `/ w3 C# B5 `5 `- X* U* z1 f" g- o+ G
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
0 |. K4 ]. R: w( I+ K! d* |3 Q* g3 @4 b7 J2 d
49. 增加UART接口应用时的异常分析
, e3 I1 L- \# p
+ ^( M0 ~8 b8 \* `  }( s2 m50.UART应用异常案例分析4 S2 ]: g% ?0 Q2 L
( Q+ G! T! y& E% Q" r
51. I2C配置顺序引发的异常案例
2 }, p. U. a( s/ r' ]  X: {
! B* D; G$ W5 M9 X8 p$ W6 D4 D; E52. STM32 USBD VBUS GPIO
/ `0 b- M: k$ g+ C" \* o( N) _/ [4 m5 l# l
53. USB传输数据时出现卡顿现象# Q- j  v, F, B% I# ?6 c- r

, S8 v4 m& S! w/ l0 y8 v: s8 o: E54. STM32的高速USB信号质量测试实现7 j8 O% w/ T5 P
. I3 d+ \0 ~* A3 j
55. 基于STM32 I2S的音频应用开发介绍
  L5 f: X- H+ a) H- f! L: r( J" U7 e, p$ ^8 U' V
56. HID_CDC复合设备在WIN10的识别问题  & N& @' q" N" D5 M2 W

, a4 ~1 d) A/ ]57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  & `5 `4 v' A3 [& S
& z8 h/ Z8 j9 O/ n' d1 R/ |, t
58. 一个关于LPUART输出异常的问题分享  
0 `0 U/ i/ |/ O% `% C! X, a( k+ t
5 g7 T4 z# h- h$ F- W0 S/ o2 p( {, T
59.通过 DfuSe 工具控制程序跳进 DFU 模式+ A  ~/ I$ f/ {& J# I$ p# C  ^

( H6 @0 k3 I, t9 Y( n9 z2 D60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
# F4 j, L+ e/ P5 ?$ H4 m
9 N; {% y1 s* Z2 B! i/ w
61.一个因初始化顺序而导致异常的话题 (2019.12.24)/ c% s3 ~8 e7 d. k3 T9 v2 c, o* C
" o5 M6 U/ L% Q. B
62.MC SDK 5.x 中增加位置环 (2020.5.29)
) ?, J( a; Y" p2 ]  m1 L
& b- @' B/ H, Y* ?
63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)2 G" z/ H1 c% k% k! z: K4 M: d$ M: t
7 L" F- }4 s7 r# K% y" x
64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)+ A+ m- m0 S/ `) X

- ]% J0 r4 n: Q& C$ x# ^' u二、电源与复位4 C( E) r9 T0 A$ V: f

  b7 }2 [) _3 H, ?1 p4 V/ ?1. Vbat管脚上的怪现象
% h% X) g. i$ G
$ d* I% ]# {$ G9 c3 S0 P1 Z  y2. 上电缓慢导致复位不良
$ N7 [1 D( K. `1 u; B% E* X + m9 b: `* |2 s8 y1 x
3. 关闭电源还在运行
; W5 j" C8 w: \7 {& R
2 [4 v& d, g/ {. t$ Y6 O/ c4. 使用STM32 实现锂电充电器
" c' y* N* b4 C( [1 M5 K, u4 x
6 a" W  T" w2 |- `# U+ q' S' q8 F/ R) d5. STM8L152 IDD电流测量
, ~0 ~8 o9 F/ f2 {2 x( n 1 g9 U3 |: E9 X! N: H
6. STM8连续复位问题
  w4 G: X/ X3 [9 u- }& f 0 P6 c# i  w; n
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
; F" ^/ y5 l( @
$ w& h* Q: R' r8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流. U! A5 U0 B/ l- q6 {

1 T) e. A: b  S7 ^) w9. STM32F7与STM32F4的复位序列比较  }2 \, E  x) K3 |( V
' o- o: x9 Q: r2 O% s3 r
10. STM32F107 复位标志问题
0 I! ]+ H+ I6 ?* d  b
9 [. U& u0 V& T11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
: ^* v+ u2 x$ `; r( C
7 s2 `* M7 @% b 12. Nucleo_L053不上电也能运行
& k* c$ f* M& \, B$ D# Z$ \
2 w& G5 I. B+ f; D0 T7 p13. STM32L4中STOP2模式下的漏电流
4 H$ m  s3 I. d( c/ s! J; |3 w0 |7 w: X1 ?6 I
14. 在没有外置晶振时HSE_RDY异常置位
+ u/ t, Z7 c. `$ p; _7 B( c% r% Q8 P- V7 T
15. FLASH被异常改写   (2018.5更新)+ B+ `9 K8 W: A9 a! c0 u
. G" S) e. P: a- e! ^( v
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)9 I, J3 s6 j1 l
, T- r; v( `! O7 h
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)( y/ h5 {3 g' s# N) ?
6 w. G4 G2 o- f& v
三、IAP和Bootloader8 C# }. L! d5 k, w0 ?) ]( G7 C, M
& I# O% {+ P# b3 |
1. Boot Loader与上位机通信不稳定
* X" Q4 W. |8 a# B1 ^- B1 [
& f, {: N; g9 K9 r9 _$ F+ S2. IAP+APP 模式下不能启动 RTOS, _9 B: T6 ^9 t

2 m# S( _" q/ z0 m* C. R* m; h3. 从 IAP Loader 向 App 跳转不可靠7 B; s$ V* k0 K- Z- ^

  n+ e; J  l! |& |) C' z4. STM32 MCU IAP例程跳转到APP代码简要分析: u3 D4 d7 r+ u: Q* s! y2 p9 W. E8 a) ~
$ @9 E+ ?+ W% j: ?: X6 g
5. STM32F091从自举程序向应用程序跳转的问题与解决" E0 m& s$ |# p, f% {
7 v1 `" Q( D! }! G0 O
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码' h2 K% ~+ B& }

9 T1 m& s6 w% N" j: N) i7. STM32F0启动模式相关问题探讨1 ^# S( T: `2 F( p  d/ H- M3 O& k
/ Z  B+ H# m: a& L/ a
8.STM32F091空片使用System Bootloader下载代码' z- o) F, l* @4 E4 W
6 O- T$ J$ X/ s7 F& N0 h+ `
9.STM8L  IAP 应用程序中编程指导7 U9 {: q0 E( h" i# R2 ]/ R; M$ ?$ u# p
5 k4 v; H1 |' O: H: w8 E, a3 a6 h
10. 如何通过STM32的串口实现简易脱机编程器2 f( K+ G2 V, {5 T5 W

; c: y3 A( _9 O9 Z3 i11. 一种从用户代码调用系统存储器中Bootloader 的方法  , p8 b7 X1 z; @
& v. Q+ f( w7 v# H4 s9 [( Q" n
12. 利用 USB DFU实现 IAP功能5 A3 X, T" l: G: u. e+ z
4 g( e  \6 ~: X8 ?" Y* _9 K
13. STM32 Bootloader中 DFU使用限制, b( J7 L5 T/ b" c  _$ F% i$ H& C, G
6 C3 P4 b' o& h) X6 q7 B
14. STM32L011x和STM32L021x启动模式注意事项. B- f" d- h+ {( y+ e
2 R. G; I/ ]6 Z, r) z) y
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项 $ c# J: n% @4 m7 T. i
, d! m  _! w0 `6 t; M7 j- E# E
16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级 7 u: m3 C" g5 j2 |8 H" d- p; H4 ?

3 I1 g+ i0 P6 j  t) k17. 如何使用STM32NUCLEO 板来测试串口Bootloader
; f; x3 Y& K1 N4 j# k( K# D1 r; d8 @7 w8 H- e% R) [- v( a
18. 在STM32L011上通过I2C接口实现IAP
9 y; C1 Z# c+ k. n# P: l% e$ ~* ~3 h2 J: U/ Z" z; E
19. 在IAR中实现通过将程序在SRAM中调试的方法2 w/ [$ \" E0 y9 ^8 K' E
  {, f( H& A1 Z* h. W$ e0 Z
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题2 S9 t& h: l6 E; x2 u0 i$ C

- r3 x- E% Z5 Y21. USB DFU IAP 例程移植的两个话题
8 L2 q8 f9 ^8 }! G" o/ j- X+ W* V# n, K+ l; P* r
22. STM32F769双bank启动4 x% e, q9 m) b' E  P3 c
% k8 f. F( N; H7 d, [) b6 }& z4 b, l2 H
23. DFU加载 工具 DfuSeCommand的使用
7 j- E+ L! Q( q4 ]0 ^5 |$ Q; @) H) \% g9 q
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码    ) C; \" ^- e$ O: V# x/ h* A) n
& i8 v6 ^3 n' W
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)" V. m" q2 Z' R# U8 L
5 t# U( R, T" m, c5 e
26.STM32 Bootloader异常复位案例(2019.4)
7 w% J" N8 d$ p6 a( n: c7 e- A: k: `  L1 D/ l1 T: |
四、存储器
6 L/ E; i# c" P$ B& S& P
1 Y8 \8 z$ m- ^3 ~' h% u& x5 Y1. 对 Flash操作导致 USARTU接收丢数据- {% ?) Y& Y, G& L$ u4 _
0 N5 V2 V6 A4 ]5 O7 Z, B' E
2. 使用外部 SRAM 导致死机
) b* m8 S. W# l/ [8 K: [ 7 e  r  o2 D( Y
3. SRAM 中的数据丢失3 @5 O5 A' Z7 z' H3 L% Z
$ B/ p  s' j! `$ ]" u, u
4. 干扰环境下 Flash 数据丢失8 [& i1 t4 g' c6 A# l8 f+ e; x' M
- C( _+ T6 A; Z/ ^/ w5 Q
5. 使用 CCM 导致以太网通信失败, T/ s6 p  J# V
) Y5 D  E  x' `) Y0 P5 i2 I
6. STM32F429使用外扩SDRAM运行程序的方法
( @& h% ?, o8 f, P, p& n
6 q1 P' {" [, D3 j, L; e4 H* I$ r7. 使用STVP实现对STM32L1系列EEPROM预置数据
/ `6 J6 n3 f" w: U 5 h$ E1 t, {$ A5 D, r. F; S) I- P8 h* r
8. FreeRTOS RAM使用情况及优化方法
4 }- Q. S# p# s+ @5 R: t0 Q, O$ ~3 B
9. 在IAR 6.5下如何将数据存放至flash中" T  ?* f4 m5 v- U* Y
: h0 V9 h* H3 N% h/ W7 v
10. IAR下如何让程序在RAM中运行
! m3 H- W1 w5 W 8 I, |" y: ]) e& [! V# ?5 }2 z3 B% R
11. RAM上电后初始值问题
# D4 i) t( i" F4 e" @0 \) I0 @4 ]" e/ c
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
2 W2 ^4 M' n. a( ^3 [; j/ c* I% v2 K* m- A9 Q% D1 t0 Z
13. LwIP内存配置9 Q( C0 D; ]- |% f6 F* Z

. Y# o/ h1 r( q14. STM32F2高低温死机问题. ?+ f8 b/ V0 l- ~
% G, C$ }! Z* N4 Q, S
15. 使用STM32F427的CCM RAM时遇到的问题  O  _1 M4 P( e1 V& R; B" `6 b
: {, U8 G6 H+ n7 m
16. 利用QuadSPI外扩串行NOR Flash的实现  1 J( {5 u+ V; k  S2 P# S0 j

/ L7 U7 B/ V9 g% u( t17. STM32擦除内部FLASH时间过长导致IWDG复位     
1 \  m  i4 ^4 z& U* C- Q% z3 ~; A+ |" z5 z( M6 y. x# P0 M

( s  `" i3 w& z" Z# U18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)# K( M* G- q- H7 m3 f
2 T7 R& V: \, g5 q% {" i1 P3 l. ~1 V
五、模拟外设. m1 }! t* H% s
* V) Q( x4 |: D) S- Z
1. ADC对小信号的转换结果为零( M  E; J7 r' a; {! X

  o/ F$ K( w/ o  g2. ADC键盘读不准
  f% I, T1 H9 D/ h- ?, N2 n ' B) @, G" Z6 x  L* a
3. 扫描模式下 ADC 发生通道间串扰
, X) s# B3 _* B+ q7 ^& C$ B
5 Q* n( [& j, x4. DAC无法输出0V的问题分析解决/ f1 y6 c( r) f' p- V

+ J1 A8 w) {$ }4 l5. DAC无法输出满量程电压的分析解决* `' Z8 i  b6 ]3 ]

! [) N0 t; F( z6 _, o6. STM32F30x 的ADC 采样的傅立叶变换
; a" M+ w& s! m* q! m  a. c2 u" t4 v7 r: e, H
7. STM32 F1系列 DAC的示例详解
* @$ l9 F1 H/ G1 O: ~
/ }4 Q9 o7 g0 c* X/ b8. ADC 连续模式采样浮空引脚问题& H( m* q9 o& o! U$ g* ^) V; K
* e8 ~' n9 ]+ x: U/ v
9. PWM硬件间隔触发ADC $ [1 b. Z* ?/ ~, @, K- _* j4 O8 V! n

: g1 w2 C5 `! O" Z' u10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC" c. _; l4 I& W; z

! W' @; N) M7 h9 k: J; y' V11. STM32L4 系列中ADC 通道配置上的区别
4 q$ y7 M' C$ Y* k1 m+ A6 {' `+ n3 E! O. g
12. STM32 ADC模拟看门狗及其应用
1 ^0 w5 G5 j  N, }. C1 _7 @  n
13. STM32L053 comp2 比较电压无效问题 . A' S4 ~' O/ t  z$ M, e
# q6 i* [/ Z" `8 x
14. 运算放大器OPAMP在STM32L4上的应用
; U! W; S2 d; k; C6 I1 p
  {0 R3 Z* H- a15. STM32 OTA例程之ESP8266使用 . R: n" ^* z9 D: Y( c

) S8 l* Y6 L' K$ b* O' W16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
: _7 q# W# a8 Z) Z  K
7 [. b0 }0 o( \" U) A, M六、计数外设$ @! V9 D7 B& ^' V

* Y  K1 I  |  |1 H# ?1. Watch Dog 失效* H: o3 g4 F& `  V& J/ f2 [
& [: s$ A5 f* B! \, i& w7 [3 P; E( Q
2. RTC计秒不均匀. n$ m$ s+ [4 r/ _9 U5 F" i; {, N

6 ^/ A5 e/ s( o9 k3. 软件启动模式导致 IWatchDog 失效
( \4 x+ H/ p( Y9 [1 ? / H# T1 ]/ x# ~) X
4. STM32F030R8 定时器移植问题6 C2 r3 t2 N/ z) _0 N

1 i# k# W+ D5 `4 z4 Y, _0 k5. STM32F0使用RTC Tamper的几个注意事项. Z; J% N& k2 v" ]$ d, p7 o. C
8 w' f* F' @- ^1 U8 B& f  R
6. STM32L053可控PWM脉冲方法之DMA% B4 f7 D: C' H) T" M- ^5 L7 G$ X2 T% {

* j5 P! Q* E9 e( I6 ?& s; ^7. CounterMode,OCMode与OCPolarity关系
0 ]* w# J! ^! |& H, a0 ~7 @( B. a2 B6 e$ A4 X8 v% {* V; }
8. STM32L053可控PWM脉冲方法之DMA
) D  e# _7 Z8 {# Z. b, [/ x7 u5 z- y! {$ t. Y0 |" ~+ g
9. STM32F1通用定时器示例详解—TimeBase
% ]! @; |  O% G7 J6 X5 j; d& q8 k* s& T0 |6 s0 Q6 |8 w
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals# L" }+ @( Q! x7 ~
: [  i! f) u# f1 U: m6 h: x
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
  R. V" {& b7 o0 R- j6 i2 O8 C/ _5 L. @2 s
12. HRTIMER的多种Fault事件联动机制
! j  v1 y2 ~7 R$ B  @
; `8 s8 [' ^; u9 Z+ k13. STM32通用定时器 示例详解 —One Pulse
+ z7 e3 @3 n2 i
9 L: A& X& O# r14. 如何用LSE校准STM32F4内部RC振荡器
. E! ^: k1 U* i4 i. w- v. [: N( R) a' y- t4 j) W
15. 一种使用Timer测试HSI实际值的方法3 b! @$ `) E5 y& n- T% g9 x
7 U: Z/ {! c. u
16. FreeRTOS定时器精度研究) I7 H* r9 X7 Y5 Q: O

7 g. a$ a/ _4 O4 S. S" m4 m5 M3 _17. HRTIMER产生多相相移信号  }5 X; z0 B' A8 V

7 u6 ^6 p3 R$ ^0 n3 v4 ^18. 窗口看门狗启动时异常复位问题
7 h  M4 k/ `, N0 ?+ H0 L' o* W; B; I6 _5 ^8 a, P
19. PWM硬件间隔触发ADC& |+ ?( W3 }3 V, z4 U

  V# x7 w9 R) ]8 z, S1 K2 u" I2 [, @# X20. STM32F030低温下RTC不工作
( g9 M/ N. O( G: r4 {
9 l' Z- l7 A3 d$ D21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   
+ n. |/ K: `5 q( O+ b4 r: L3 p' H5 e$ H5 p% p8 D6 J$ }
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
8 @9 _/ e) F. p& r& \2 N7 k. S: B- D2 X: {  g# Z0 H
23. 基于STM32定时器实现定制波形的示例 (2019·7·25) ' q! m% L  g7 g' z, C; ]
7 M: L2 g0 W- F! d; w8 m( ~' A
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)% x. @! Z- P4 f- }4 E' x

8 I) K# X: }% x0 G5 H25.MC SDK 5.x 中增加位置环 (2020.3.31)
4 m3 K; q$ k- g9 `5 d
( r- K) F  q- ^! g9 S
26.STM32高精度定时器PWM输出话题 (2020.4.29)1 b% ?) n% T# X: ?+ `2 i
5 k, X6 O) S" Q

# f% N( A- i; ], U& U7 h9 P27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)
; J  K( _! y: z5 s5 y+ k

/ n; X; B9 G3 u- t- K; Q1 b9 M七、内核
3 D/ M4 c; y; ?) n# z/ S" x0 _ 3 {  }3 c5 ~7 w0 M) a8 i; d$ R* O
1. 使用指针函数产生Hard Faul
! T1 u! n. f- `$ U: y$ F ) H( T/ @0 i. ?
2. 调试器不能通过JTAG连接器件
% O5 l# j/ p8 q9 f- u 8 N+ ~$ |$ `' F1 u
3. 鬼魅一样的Hard Fault/ N$ T8 h/ u: y
: O) C* Q; u% {! c( f
4. 进入了已屏蔽的中断[  k) O  L" e: D4 n
5 f* p+ I/ h, u/ A6 J5 ]! z
5. 浮点 DSP 运算效率不高
# ~$ y/ \- r% d# A+ a- D) e! V+ S. s) e7 K
6. STM32上RTOS的中断管理2 }8 S9 E9 O0 z: h

, y& ?$ G; I2 c8 i7. STM32F7与STM32F4的复位序列比较
/ N( d6 {. a2 g5 {; X2 \9 i
* Y3 h9 q3 R% L8. STM32F30x 的ADC 采样的傅立叶变换8 z( n$ ?2 W$ l( P/ z3 u
& y# Y" [; |/ O$ ^
9. EXTI重复配置两次导致误触发中断的问题
' L# N' o6 k' b' z5 s( }5 E
- K% g/ v: `' |! f* ^10. STM32F3xx/STM32F4xx使用浮点开方指令
: ]" O* N  u! H/ [! j' ~7 [' i* _! }4 k, }! b
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响
2 |$ G, D2 v$ I% Z/ q- L. ~9 q1 O- C5 A" Z
12. STM32F7 MPU Cache浅析  / `9 R9 O* h, R1 E
: p' N% K! X) V# ^9 e/ c
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
1 i" x  s. |6 d6 M( Z: @" u2 P: ~

8 d! T4 e5 @; e  e/ [- [7 [14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)- y7 e9 P8 E' F1 P0 ~% h) ^
. {- N  ^- m( t+ d0 u& ]
+ M( m3 f/ \0 ?6 G
八、系统外设: |- h, C# q' [. h; e
5 D, R% I- J9 l7 u) {/ x) N
1. PCB 漏电引起 LSE 停振. a4 a0 l/ r! ?9 v0 Y* C. R" z! I

" O7 n: P& `" K2. 时钟失效后CPU还会正常运行
* W5 V3 F1 @6 E4 d 1 [2 s- I- E6 ]( o; n& E
3. STM32F2中DMA的FIFO模式
" V: J* E6 K% W* k0 F9 W1 m8 A' k2 M$ m) h7 ~# ?3 Y5 {
4. STM32L053的GPIO翻转速度的测试
$ l! P" c. j! G6 ]+ L* Q4 Y# r+ H- g, g$ o
" d; f2 m! r0 P5. STM32F4xx PCROP应用' j6 a7 E  H: O

: a5 X/ Q1 O( W7 E) T6. STM32L053的GPIO翻转速度的测试
! d: E9 B, x5 e. o% `+ L$ g& h9 }  M, i. g
7. 如何在IAR中配置CRC参数/ e* c. z& t3 t  i5 u

4 k' r) R/ J' x- Q8. PCROP区域函数无法被调用的问题与解决! |! P4 n  i1 ?

  C& F  y5 u5 d' D" c0 B$ @9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
6 y$ H/ J# j7 g8 i
/ Y8 \" Z, C' L10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
2 s: z' e5 T. n) ?
6 s. Z1 V- \5 U( q% ^6 W1 \7 T9 `11. 如何用LSE校准STM32F4内部RC振荡器0 g8 {$ z1 z- h# s# |4 p
# z3 X4 `# E+ j6 v9 a7 b  Z, \
12. EXTI重复配置两次导致误触发中断的问题  ; c8 k; C  E* [' K4 L# A
! d/ F1 ^. ^! p* o& K
13. 时钟安全系统的应用(LES篇)  , R3 A/ Y5 O8 L3 X7 r6 X% u
, Q, @1 r6 o8 a: _% v# c
14. 利用DFSDM开发PDM麦克风应用介绍  
# }" p( ?3 w4 W# P/ @
; z* K' m/ x. ]- d5 T
15. STM32H7的FMC外设在DCACHE使能时运行不正常
- V8 [, t" B6 o: a4 M, u5 v( k& _, a6 _  x8 _
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)
' z  n) \1 g% W, U
1 N$ P; S5 v6 P5 z7 w  H3 g5 H. T8 j7 U! U
九、标签和收发器
, q0 j; v# v7 A8 X+ E0 u1 y% S
! n6 L+ x# o7 p; N  [1. CR95HF的初始化步骤
2 K: t* B& B3 W * a4 W- f8 P$ p4 p, Y
' q7 d# e/ \, h# E) z" W1 G

5 ~/ ~! }8 Q" R) I& A& e十、生态系统
: W5 l8 {( R" t
: D2 ^( G+ L/ V. ^+ X, u/ e- W4 k1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题
- F- u2 ~' Q( s; j5 _8 w0 p $ M+ U2 ~5 ~; W
2. MDK Logic Analyzer 功能在STM32中的实现问题
8 q  d" K8 t8 A; d$ p4 N/ L, U. M
) a. ?" z/ |2 R. G" V7 x$ [/ I3. 在IAR6.5下如何将数据存放至flast中; D5 t) b( C, D' A) j$ _2 A) z
7 {2 m  x; k8 {% C) r1 r
4. FatSL移植笔记# J, W! {- w$ t( E8 c+ Y

9 F. o# b( _" e7 l( ]7 ?, O5. Keil中使用STM32F4xx硬件浮点单元
6 }$ h" R0 S4 i7 }( l; h . U* c& W$ b! j2 h7 ]8 a/ v/ S
6. 如何生成库文件(MDK和IAR)+ u/ V' ]  W* D! I
0 i" x' N$ ]3 C8 W
7. Nand Flash文件系统解决方案# c  F2 f! O4 ~" g* j9 n
( ~' K# Q6 q& n; Z
8. STVD在调试时弹出“Cannot access configuration database”的解决( x2 w4 j- K; ]. t/ |8 h
, Q, B8 D$ H# R) V* g# m
9. RTOS低功耗特性的设计原理和实现
% X# b) f- k3 B- p% }
) @  e* V' o5 s2 R) H4 c10. IAR下使用J-Trace进行指令跟踪
+ y4 \$ f& |: j1 ?% Z& ~. G  V2 C: T( f. R1 V% V( S
11. STM32上RTOS的中断管理- e( G8 a% H1 h$ L. H
  ^$ a9 p# {0 X& \9 n" U
12. IAR下如何让程序在RAM中运行
! t9 |, P( G8 P( Z3 o8 V/ l2 B' d: ~6 W& F. E0 R4 L
13. 如何在IAR中配置CRC参数9 T3 K; L# y6 I. I4 F) M3 j

" I3 J9 m# d5 L& q5 ~" n* ~. `14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册
* \, R4 Y  @5 Q$ ~
/ ~' ~2 h) w, A/ o4 p$ _15. 使用mbed进行STM32开发及STM32F0的时钟问题/ b4 Q9 U+ `% }; m# m' R  \
- U" X7 ~0 `, t5 w) [
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能, @  S& W" V% j/ z# E# c
5 v- h  k* ~6 w
17. 多任务系统中的不可重函数使用注意事项
5 R, M  [3 {* r3 y: D- E1 s
0 x5 O- r! G) M- E, m18. STM32 utility的hot plug功能
+ \! r5 o" x7 U* @! g# M& P, d
$ c6 G9 D9 _0 `, C19. 如何将CoreMark程序移植到STM32上7 F6 m+ S4 Y- \- H" J" n

& C9 M3 f' ]: e0 N0 g20. FreeRTOS定时器精度研究
% v5 T7 u4 U( [, n% A
2 t/ \, b+ k1 K21. 如何使用Eclipse和GCC搭建STM32环境
. A# Y: ^% c) ~, w9 q4 A+ T+ H) J( \% ^3 i
22. 如何建立一个基于GIT的STM32库
/ r& Y5 d+ ^3 b$ Z0 Q, K0 R
6 J8 y" P+ W2 g4 q& P23. 从零开始使用CubeMX创建以太网工程0 ]5 k2 B4 X- n( w$ e0 R- w" j
2 b4 Z' I+ ]7 G3 I
24.从STM32Cube库向标准外设库移植FatFs文件系统
2 C6 D. \% F2 H2 r
& V# R: w( h2 n8 l25. 基于 STemWin的屏幕旋转, P5 U/ w2 H0 G, ^. p" |

4 n) L4 Q: o2 W+ A! ?' a26. 编译软件 Hex文件烧写 ! r: m1 |" D; p1 ~

- B4 I9 v+ U$ J) T27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 : {( @$ ^) U( A$ l3 H1 ]: b8 x. y# P
* ~3 ]# \+ t" k5 V1 D
28. USB CDC类入门培训' j$ m/ q. \9 n2 L3 Q% T' t
$ Q0 i; T  o" ~2 X' \" Y5 Y
29. USB DFU培训 ' U1 `8 G$ X& l1 M' g

7 c1 e  J. y3 ~9 Q/ R+ ]! z! L. |& o30. 用于量产烧录的拼接Bin文件操作
$ D8 c9 s" l9 @3 N" T5 @! o4 A: j: e) N. D
31. STM32免费开发环境该用谁
3 [3 q! b2 l- A4 i5 f0 x$ [
1 H  F( z* N& U32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
3 w$ P& R3 k9 z' N7 Q5 o! S& d9 Z9 G& |$ o, z9 q% G. R) E$ N" b0 k; A% k7 g% Z
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)* @3 D, m( k3 b
! C5 t; M4 C0 Z% i) O5 t8 W9 c
34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
2 e1 A7 t9 N! p$ V! ^+ n
9 U  }  T4 _1 K35. STM32 FOTA 例程之 cJSON使用   * Q( n8 G* {, N2 _5 S1 M# Y
( i) z/ z+ E) D: ]) M
36. STM32F769DK 云端固件升级例程使用说明
4 @& E+ r6 Z. P; S0 d& Z  L5 C
0 R/ w6 {1 k7 f! S1 a$ t
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
9 B/ l1 I4 W) B2 j9 Q8 B# \3 u  \6 _1 a& v, [' J
38. 基于 STM32 的阿里云物联网平台方案
) u4 S0 O9 K# _9 e( k6 ?
$ ]8 ?1 B0 x7 X* h39.AliOS 任务上下文切换原理分析  
; k) @2 L6 d) f, ^- k# x
' B6 w4 d- t4 t2 k$ ~40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  ! Q) u+ H* I8 w- O

. j. Q& P9 f, X& u6 s8 L41. STM32F769DK 云端固件升级例程软件开发文档  
" l& m8 t4 P/ Q$ z! B3 ?: L4 e

" m; P  e8 ], a1 h# h1 P9 H42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)2 R0 E' V( ]5 }

$ T, U; U# ]) _1 j7 u7 M43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
  g, |) |7 W9 \3 K) @. E0 ?- i, Y4 t9 u8 W
44.零基础快速入手STM32MP1 (2019.9.19)) i8 b- ~/ R5 ^+ y8 t$ {: J

! t1 m1 a  p( l: h+ n, M45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
7 L3 D) x" i6 N
9 `. ~' d+ R4 F8 P& L: E" z( r( K' [十一、调试! G9 j1 c$ y* ]- K3 z; Q

8 n) X9 y! M6 b( u1. 关于STM8S SWIM Error[30006]的分析
7 x5 P  X4 v& @& `6 `1 R8 ?9 ` 1 v0 {* R+ v' h% q8 f4 ~6 p4 V
2. STVD在调试时弹出“Cannot access configuration database”的解决, ~+ p- b5 P& E. z; V6 E

* r& z% l: }: g( l7 z! w0 G3. IAR下使用J-Trace进行指令跟踪" s; `) u% Z2 h9 y* h! m

: }5 c  @% E( I+ w# L( ~- C3 ^& Z7 M4. 菊花链 JTAG STM32
; n/ ~( b7 }6 ?% G3 i# E" U  m
5. STM32F411CEUx 能下载程序但不能执行
! ~. R0 r4 T" R& V: ^8 j
4 d" R1 ]: N7 `3 v; ^6. STM32F103C8T6 程序上电跑飞
. I- W; `, M3 R4 s' y4 R$ I$ ?* x) _, i
7. 使用STM32 ST-LINK Utility 设置读保护后不能运行9 k! t8 A5 y% Y% u
! H& C- V( x" L3 ]& G2 ]
8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
/ ^& ~' B7 p6 ]2 t% C8 k/ |8 D# d3 O% U9 ]' G- x' L
9. SWIM协议的GPIO口模拟
. ]* ~& K" O' z; S/ W! O6 n
5 M0 N$ e* b7 r: ]% K+ r1 w10. STM32F091空片使用ST-LINK烧写后复位不能运行用$ b' M0 m$ {: j5 ]2 L
* P' Y5 h7 B$ Z; g
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)
' F% G4 ^0 x* J% O9 ]" ?$ x8 h& L7 ]0 C  m
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)
) N+ H% T. Q" u( Y8 Q7 G% W' P/ B5 T, g* |
13. X_Cube_ClassB代码移植 (2019.12.24)2 c8 p' [+ }" C

: m0 z. L6 \1 X

# v7 l1 ?  J! q; U+ p! o14.Keil中烧写STM32F750内部Flash方法 (2019.12.24). ^1 m5 ^+ l' T3 c7 Z
# v" A! I5 h4 R, g
十二、人机调试
1 J; e1 h! t: C* J3 u0 S; j
* h, U  j- I1 I+ {( N1. 一步步使用STemWin在STM32上开发一个简单的应用) ?4 M! `" Q2 K+ n4 n: P

3 u, N# E2 P% Q. J2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
+ E5 f2 H' A, v* O0 W1 P  {5 c% U- I# |/ I& @/ t* ]
3. GUI方案中ALPHA通道处理介绍
* l6 w) v# \3 t; U) n) b6 q/ Q& C5 C. U. X# h. d
4. 基于FMC8080接口8位LCD的STemWin的移植
. I: s* z% f1 Q
/ x" z+ p* k; S  _; z5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
' v. S: K  [7 Q9 N3 h' f
5 H4 @: q6 |; O6. TouchGFX快速创建滑动应用例程 (2019·9·12更新): r. d& R; p5 s2 q6 ?3 }$ ]8 s" s
6 s- d9 N" S% ^: a) {, v
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)9 ~, i$ j6 v5 T, y  \

- {. a- C9 }1 R0 j, p* _, v4 N3 N$ l8、STM32L5中如何关闭trustzone (2020.5.12)
5 o: I5 z) M: |; b: r; a
( z( M$ s; ~" ~& H! m十三、马达
; u: n4 ]- U9 P! e& O8 k7 H+ Z- Y, P% V
1. 电机控制同步电角度测试说明, z+ M8 P9 c( [1 X
$ R/ `8 g' d8 m' w
2 q% g8 F$ O8 ?- P0 d8 ?0 H# X
+ L- v1 G% K% r. K# P+ n5 {! w4 u
十四、安全0 a7 N" @0 m. B+ E& `) M& u, R

% i2 P1 e/ f$ q! }5 m9 M1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
5 U& S  p8 m9 d2 F+ t4 ^2 G: K2 m
! z) x- l& z7 h/ X6 [, P- z
: X) }2 m( S5 c# c7 g) \$ v十五、其他7 m5 }1 M+ i2 J0 k. |8 ]* n+ F4 A- m( K, q
  t! `( f9 s# @/ P9 n# d" X- ?( z; ?
1. 跳不出的 while 循环# g/ B- N  F& a7 U  ^
; q4 E4 r% q7 |4 D
2. 外部IC连接NRST导致MCU内部复位信号失效的问题
# D; e, i% s0 s 3 M3 o# c; [5 f8 X: E5 m
3. 潮湿环境下不工作3 N0 R7 h, Z# o: \

, g" w0 ~5 c- c2 J5 T) Z; f5 I3 f4. PCB 漏电引起 LSE 停振4 C  i# ?# A, t, \7 l" P. g% A% ?' ?
. m& A% Q- Y" }3 G) Y& G
5. STM8L152 IDD电流测量
1 ~& _* N& h# g3 W! _/ F ) N+ S+ V3 J, u0 i
6. 使用STM32实现锂电池充电器
. t) }, c1 t  v5 O. m5 _ ; ^/ h9 h2 E" U7 s- y$ J
7. STM32_STM8硬件平台基本检查9 M5 h7 G9 y) v# `/ }; j

2 V' O: O# J3 @* q8. 验证STM32F401在STOP模式下的电流
/ P; w# G( y, j5 L  q+ k7 I1 i8 \* b$ P+ i1 {3 p+ {
9. P-NUCLEO-IHM001 电机开发板串口调试指南; S9 P3 ^7 z! Z( ]; x
5 I5 |$ O: m, R9 c) d2 w# N* {* F
10. 一种计算CPU使用率的方法及其实现原理
9 t: i5 _! A9 ]1 E" k. J/ r* P$ K1 H- Q7 t  C+ X
11. STM32 RTC不更新原因分析
$ L/ _4 [! l& ^4 E& A0 W
0 Y' _6 Y% W6 B% @12. 关于ST库函数的代码性能对比
1 s' N1 B. ^" w3 B5 w! M0 ~; F8 {' [+ M
13. 在IAR中实现通过将程序在SRAM中调试的方法: t" \/ J4 L; T* `: x: c% O+ w
/ t2 s' f- \$ Y' ^8 V
14. M95xxx EEPROM写保护配置
: h1 j) E2 P) t; c, a. N7 K, j2 f5 c$ c
15. 4SRxx的GPO的属性
5 f: M& o0 o# s+ [& @& N; p
  S. S; ^+ x+ o' j* r  [16. CR95HF的初始化步骤
: X  d+ j0 n* D. O
. j2 t" Y4 x6 Y  c+ U17. 电机控制同步电角度测试说明  6 p% C3 X; |; c

, q" K: o7 b2 @# f. A6 b18. STM32+BLE通过 Notification与 Android应用程序通信的例程) D2 e; ^3 |0 D0 g6 \+ M$ J
1 D, b& ?, b7 x) q# c
19. M95xxx EEPROM介绍
7 l8 U" V' _" t. r9 b! Y1 o) Q( L0 t6 x7 o
20. STM32 DFSDM测量温度应用
  R( O: i* ]* j3 t7 {
7 k2 J1 A; D9 s5 A21.代码实现PCROP清除+ ~. N3 {7 f; L# _4 V
8 q$ [  U) z9 \% U
22. 理解与应用MPU的特权与用户模式5 }9 e) x5 n: K% M* s4 c9 h" \
6 P7 j1 s1 [* b- e: h0 f8 }
23. 用于电机控制单电阻采样PWM变形信号产生3 `7 @3 F+ L* p) e  s' ]0 X

5 l' J6 f1 b5 P# g; ?# v24. STM32L低功耗模式唤醒时间测量
- u# {( g% }+ k7 g& C( n# v4 I$ \
25. X_CUBE_SPN7程序电机启动抖动问题
  V& R, O4 F: m* p" v8 s6 v0 v+ _% H6 b( q+ G
26. 发现STM32防火墙的安全配置
5 _  M% `- H! ]! h' R9 q. G. }
7 y% o! w+ u3 u4 G6 f' J& N0 D- b7 X2 {  ?27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
, W( I. R* o4 }* b& p5 I- |0 J- S! ]# _
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
0 b8 W. {- k+ T5 ]) q% p  ]8 w0 B
温馨提示:

* I+ \. a5 h2 e2 S- X4 X. C6 e
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
" p# {- k$ j0 d( e# w- Y! N! K$ s
: m/ Q1 W: x0 M, x

4 {3 s6 A  R# w$ i' y- q$ c3 [- e
# b3 B- u& S2 D  Y6 G
1 I! x: `! Q. L" O  S* V
9 N0 O7 o; o, U. b2 l  V
! k4 u3 M: f% _. e. M# ^2 i6 K8 p+ o2 l

1 }+ S, h- o" j3 ?* V
/ i0 K4 {* y% b, I- b. d
1 R; `( `  F3 D  e9 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
好详细,多谢分享/ e4 H7 ^5 K7 u' N5 i6 c5 S! [/ o' h6 v
5768340 回答时间:2018-1-13 14:42:54
HI  . U5 A" P1 S  ^  R( L- B
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:1 r  b. j3 r0 _# y
   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    1 b. l! W8 `. O  B3 `6 _* Q! T1 R
  2. 函数名称:Cdfinger_Bspspi_init! q* L9 m) c; W2 d! ?" }" C( [7 B# `
  3. 函数作用:spi初始化函数& m* t% [/ Q+ X2 M4 s
  4. 备注:
    $ X( k, Y3 o  j0 }; m' H+ p
  5. ******************************************/
    + z1 v: k1 u1 c
  6. void Cdfinger_Bspspi_init(void)% f) [5 ?! o% }
  7. {! r& W- W6 H1 a2 g" @( @
  8.         GPIO_InitTypeDef GPIO_InitStructure;$ f$ }2 ~& o1 g2 B4 b0 ]) u
  9.         SPI_InitTypeDef  SPI_InitStructure;' }5 `5 {' P2 C# s( _7 @3 c
  10.         DMA_InitTypeDef  DMA_InitStructure;8 v2 J8 k# {/ Q
  11.         NVIC_InitTypeDef NVIC_InitStructure;9 d) d! n# ~: T( x- u1 t
  12.   
    . s" s" g6 L% L+ C! c* H' a
  13.         int ii =0;
    9 ?) L( O# R/ `0 x  t
  14.        
      M) O7 r- O- q9 r7 x# W
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    ( B/ C# Z3 ?! j6 p6 S. ]& Z
  16.         /*!< Enable SPI2 clocks */
    : D. j5 o  J2 K9 h- E" |
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    % ]) x: q$ Q! _# G+ w1 u8 O' g
  18.         /*!< Enable GPIO clocks */
    6 t  k8 `4 f" I# O
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    1 z8 z1 a5 z5 x% g: P+ H
  20.         /*!< Connect SPI pins to AF5 */: H$ Q/ c3 R) X. h- K
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);  x8 v* p# l% M( |
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
    * K1 r' L' R0 G
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    1 h! c- F9 d! e% E! U# A  q
  24. + C4 P5 _( E. a/ l: L* ?& b6 I
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;1 Q# v6 k& I% g3 S$ `
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5 o% \! T$ c+ k( G1 x# ~
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  e! z! n' I8 S: F/ o( h- i: r
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    ( W' O; E0 ~! J, e7 B8 E4 [8 a3 N
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    5 V9 Q) Z7 t  H
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);( M" G/ J3 ?4 E0 N: I) p/ e
  31. ; I/ I8 l# V5 _0 p' b( N: \
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;$ q; h- }. n* T2 }" |3 f8 R* \
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    " S* _, w; |" N. T  r: F
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    0 S% v. H8 Z6 Y% @7 t
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;! `# [2 t( z. e5 E5 c8 V# f& \
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    7 n: Y; W. m9 A/ K- \2 P5 W6 r
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);& D' I) F& r: b* e1 _& y2 h
  38.         Cdfinger_BspCs_HIGH();9 c/ K) M+ [0 D$ [* g" O2 _* g! h
  39.         //Cdfinger_Bspdelay_ms(1);
    4 o. G- b5 w/ j& w9 h7 [
  40.   //Cdfinger_BspCs_LOW();. _4 i  Z3 I5 i# I( U
  41.         SPI_Cmd(SPI2,DISABLE);$ @" q+ `2 j: k* ?' k( r
  42.         SPI_DeInit(SPI2);
    " S2 y/ i0 k3 q5 ]/ c3 k8 i
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;2 {. |: Z, G5 L  k
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;5 L$ L9 {6 j$ _. R4 b
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;( k( W7 n& T5 }1 Z9 e
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    - T% m' u& i6 _8 x9 V0 y. ]* B
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;2 L4 }( L' U( Z+ [7 r7 D0 t, m
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    , q2 m1 Q* `1 y4 l1 j4 n
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    9 {  X, A, ?8 K1 h$ _
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;% x( ^+ d3 {- b; i, F- ~5 l1 C$ p
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;* S/ P, X- P' K7 x8 p  v' I
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    0 l* \6 H1 W$ [4 l7 A3 R
  53. 3 d. E- L, L! M
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);% s' S6 f& ~& S; k
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/% a4 X2 u) A! K2 W
  56.         DMA_DeInit(DMA1_Stream4);
    1 q) @$ l, _1 w8 u
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    2 ^6 y8 U& n3 X* s: p
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    % _: m9 N* y! m4 r
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];) m  w+ b# O; P
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    3 P+ w& @( x+ R9 \, G
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    , M+ w2 e; z4 b
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;0 c/ s! N9 w4 \9 D# T2 }
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    ; ]1 }- ?; ~! W) B  N# g
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    1 W3 n2 s& J% s5 K$ D
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;$ ~! m+ `& N  Y: r
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    0 I) l) }( J  B
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;% p. \; t+ U! ~" v$ M+ W/ \# t
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;/ j0 i: l/ D' e* G/ Q
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;$ o4 Q" i* T9 |2 M
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;' i  Q4 x, y" c) k$ d4 U
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;+ n5 y7 @4 h2 d9 X' j
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);9 l6 H: O6 ]: f
  73.   3 o# p& ~) q0 X+ V* [  B% ]
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/+ v, V6 ^# M. t
  75.         DMA_DeInit(DMA1_Stream3);
    4 M) o. C4 y1 J1 q7 m# S  e
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;' Z% ?  t: x6 t! U' o
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    0 f8 k- q9 H* c- D) C( m
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];& {) t# _. _+ @+ g
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    ' c$ y* d$ l, T/ W- p
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;; C7 S9 [+ F0 U1 b/ Z2 v% _, {9 E7 P& z
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;- w$ [% h2 I- V: A+ D  B
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;2 `7 u- z( I# U0 O% T
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;1 {/ F9 Y5 W- Z3 V
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    . n5 \) q; p8 ~% Q2 {" F( _# d" Y
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;: P' E8 Z6 D+ |
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    & [1 Z5 Y2 E6 j+ X( j% g: X
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    / [/ ~$ ?" [6 i- S* E( f+ c. H
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;" a8 e/ [: j. @1 t7 t3 L
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    - M+ v9 e* x' k# K
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;' V5 W) _7 Q/ X9 G* y
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);; U8 F1 p7 ?( a8 K
  92.         //Cdfinger_BspCs_HIGH();/ F  i) C: T# d1 b# K
  93.         2 t. z* n5 O' T( T

  94. " R6 B) k6 Q6 `' n3 |8 \
  95. 2 p  V7 ]2 M0 F2 x% H( Y
  96.         //发送中断
      G, J' o! v* s( Z0 O: R" ?
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);2 c6 g' e) q- O; j: R
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     4 L* F/ G4 K1 Z; A
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    ! ?! R: R8 q4 z5 l2 {+ ]
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;6 ^+ T5 @/ |# ^6 ]% T
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;5 L& M* u3 O; T: `7 J
  102.         NVIC_Init(&NVIC_InitStructure);) N- R$ {5 v/ [. `( C( f7 r
  103.         2 H' k: H. C: @
  104.         //接收中断5 f5 K7 S+ w  A6 I# H* R# o
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    ) I5 p& A/ l9 u/ X* w/ u: ^, ]
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    ; P" {7 \) C: a. g# n3 `; A
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;6 `: a7 R  R* U4 W. L  M* y
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    , k  @( K! ~! B. W( v9 a4 a
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    / h  v- [' @3 a, z$ v" Y4 H  f* _
  110.         NVIC_Init(&NVIC_InitStructure);
    % R% g" S1 o/ R, h
  111.         SPI_TIModeCmd(SPI2,ENABLE);. `. H8 n& i0 B  {& P: k1 D$ p
  112.         SPI_Cmd(SPI2, ENABLE);
    9 {9 l( }9 c2 L" g$ z
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);, ]. T- `7 D5 l
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);4 h' H; v' T% t( V  f/ t$ }3 W

  115. 9 ^* d$ f; {/ ?' M/ J9 I
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);: d0 t6 F* h9 D! w) r
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);4 A( q1 c/ M% o7 v" E* a- \
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    9 J; k5 z6 q% G
  119. - J" ^$ Y! m, S# H
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    + o# Y% C4 S; B4 E
  121.         {
    , G8 q  c0 V4 U. }" u
  122.           if(ii%8==0)
    " k! s1 N$ m; g. u0 P4 b# f; s
  123.                 {
    5 K* }, n6 P+ C
  124.                                 printf("\r\n");
    5 p2 h' Z" P1 f& D
  125.                 }
    3 W) k& a; r. B! D' D
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);) |7 y5 L! L3 _6 c, K, y3 k
  127.         }
    # H  Z+ q1 l: |8 Q" b: y# g+ w
  128.         printf("111\r\n");
    # \3 A+ L1 Q$ l8 R* U( L
  129. }
    6 E8 f$ {! k5 X& r( [

  130. & S9 ?9 p' \  y* j( p' l# D

  131. % Q- e) A; M$ U
  132. void DMA1_Stream4_IRQHandler(void)
    7 x( l/ d' q7 A( `* T
  133. {/ A; \5 Y/ @" b) T
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    7 O- N& u2 s! p7 C. N% P9 Y
  135.   {+ w& E$ S9 U# |) d  O
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));% ^; s" ~* Y2 H6 u# b
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);% O( @0 d- N( m+ R4 [
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
    : V& V/ o: D8 M0 p
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);8 F% r6 ^9 S& k/ x
  140.   }4 R2 H5 L" Y1 \$ O7 v
  141. }8 O0 R3 {# U) m$ c# s9 V2 b
  142. 4 ?! b/ R. i: b8 H  ]; Y' w* v' x
  143. void DMA1_Stream3_IRQHandler(void)
    : G9 U. v, k4 V5 o' {+ p# i
  144. {' W9 }+ B7 ?( o5 i/ R
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
    2 f* C' b: B) V9 o6 Z* v* w
  146.   {
    0 J$ z0 K6 J* [$ `* Z' r- Q, \
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));: m8 ^7 p% [5 K; C, ]. r- M
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    ! c1 I7 ?2 O3 L
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);# z+ K/ ^. u) V0 f$ P7 C
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    2 A$ t6 d% U1 @6 _4 C2 P
  151.   }
    ) M2 u/ Z( Q! `, e' M
  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的波特率是不是必须为相同的,才能正确通信5 l; g2 W# y! v* m& B( x0 m, ^
以下是全部代码:
) z+ z3 N9 F8 d2 {; s& s5 s4 ?3 @#include&quot;stm32F4xx.h&quot;( ^; d' b- F  x( B. ~
void RCC_Configuration(void);% l$ ~# v1 I/ k1 a
void GPIO_Configuration(void);
. K4 e9 w. ]  ], J# ivoid SPI_Configuration(void);
& }" s# e6 H# `, P. L$ ]void Delay(int nCount);/ f1 X* H8 \( X7 I) S) e
int main(void)
5 S" g! c, Z3 p/ p; `{  RCC_Configuration();
5 f7 c/ F1 ?; w* k% A  GPIO_Configuration();
2 r/ ?" W4 O# y- y1 q" C  s+ a  SPI_Configuration();5 c' j/ @; b6 s* p& k. D
 while(1)) j( Z" K' l; Q: T# m! U" C9 ^2 B
 { int data=0;
7 V+ D1 b8 `/ R2 L5 i0 L  {! O  SPI_SendData(SPI1,0x55);* w8 I# W' [0 p
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); # h0 H/ J/ Y1 s3 `8 p/ G" ?' d
  data=SPI_ReceiveData(SPI2);5 l" y/ @& k# j+ v: H
  if(data==0x55)
# L2 k) T1 m8 ?, v1 m5 g. ^0 t" C     {  while(1)
, D8 d1 `0 Z" x% p# r             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);5 Y! n" v  |9 j1 v
                Delay(0xfffff);
4 _9 \, K$ x! d1 ~                GPIO_ResetBits(GPIOA,GPIO_Pin_4);/ G$ ?: W8 m' C: e
                Delay(0xfffff);
9 n# v5 J: h4 d7 N  
" s0 w% N( c4 s# J$ x( k             };/ K* _5 N! e7 S- z8 f
     }
" j  `1 ]9 c1 z8 h+ \! b& P- H     else while(1)
, c- T% ^: f0 d            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
- Z( w9 h. U( G               //Delay(0xfffff);+ g8 |# e. w4 [9 H
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
9 l' v# B, o. e4 Y% n  a               //Delay(0xfffff);
' t1 y2 o/ ]2 Q" e1 t! F5 p   ( K3 x- Q$ ^8 a
            };
  c2 W1 F, o% L0 `0 k }' l5 U/ J+ k2 V3 O6 _
}. ^6 S$ v: x$ |8 X9 p8 D
void RCC_Configuration()  z" q" ?* E5 a* P2 Y2 S2 t- {& T
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);" Z+ M( ~1 E. t% E. T+ C
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);2 t6 R) T* e. h6 v: W% l. ~
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   - f! l/ T  Q6 a* b- m8 h2 u2 Z7 E
}
% B' k" l% k/ K  b* {void GPIO_Configuration()- C! }) j. F6 j7 q1 V
{  GPIO_InitTypeDef GPIO_InitStructure;
0 t. A3 T4 m; Z6 L  |  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
9 B- s1 }9 p, w0 f# K6 g2 T) u  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
3 @( N4 k: h- |+ v. D  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
& C" g# C* K! B! r! I  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
4 |  q: d" N& r7 }; ^2 W  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
5 W. [" _0 a4 T% W  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);' N7 u$ f. I+ c! `. y
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
! E( _" q' R0 p# l0 x' Q: r  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;9 T& U& f& A" z1 C- x% r1 \" e
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;% U6 k: O" B* E
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
) f6 E- r- Y3 X3 R+ J  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
" Z6 O; s2 D+ e3 T! `+ V$ W4 I( E. a  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
0 |! u/ f5 {* E+ F7 R  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
4 V- ~) }# q8 g4 U2 W9 L/ h8 o  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);2 p& u" |3 G1 U7 P) `* t
}
. q5 e3 R- r6 G& f! ]& Zvoid SPI_Configuration()
; }: M- E- Q& J3 p9 i{  SPI_InitTypeDef SPI_InitStructure;) N- n* \/ D% ?, F
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);% a& ]* ?# k! O4 U' Z5 d& x
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
2 t* M3 ^4 J" l  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
/ e4 r" u& T+ l   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
" I( _$ f( y( T- S- K  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
$ K8 ~% @6 a5 [, `, t7 r- I  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
2 A- l5 v( |/ N2 |8 i5 Z$ o" S  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
; G7 p' \* z& u  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;& x% v) [3 i, p; N+ ]) t
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
8 O0 A5 P( U+ {( L& Y  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;) x: f  b/ n) ?2 V% ~( d* q
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
- d7 K/ E! M/ x  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
) M7 I" W- j5 m8 [   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
, C$ I4 k! Q; f! ]" w1 o) c' p   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
7 a2 U$ b& K- P3 D5 q3 W: h! f; U/ c  SPI_Init(SPI1, &amp;SPI_InitStructure);7 i& o. N" p4 b* C' @7 {6 Q
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;' s  h2 y' c, D& w/ n
   SPI_Init(SPI2, &amp;SPI_InitStructure);- i( s6 i7 K* R- v2 |
   SPI_Cmd(SPI1,ENABLE);
& F1 j) O! d$ T5 A, `( h6 [9 R   SPI_Cmd(SPI2,ENABLE); # k( Y* o3 C4 e# G- Y
}# Q# C! d* V  y/ P
void Delay(int nCount)
$ v  d* S( T6 M( S, G1 M{ int c1=nCount;
  d2 K: A$ b: v5 R, x int c2=nCount;. L) R4 r% Q# E" T" v& A
 for(;c1&gt;0;c1--)
0 T5 s  O9 k% R6 _2 B2 l  {: O4 _; _, H+ P% G4 j
  for(;c2&gt;0;c2--);
& t' u: g) p/ I( g };4 ~2 F# U( a* Y: U7 M
}, [$ a2 u( O* n: h% N# o+ a
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:+ V' X0 \1 P( T- g# `: t- C
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信$ e1 O: T6 q; v
以下是全部代码:8 t$ g! b4 [/ W
#include&quot;stm32F4xx.h&quot;
% j8 c4 c, M; w# Xvoid RCC_Configuration(void);; }4 Z. E: B2 g9 X/ y2 a! q1 H
void GPIO_Configuration(void);
: U0 e8 b" E$ K9 k, _5 R- \void SPI_Configuration(void);
0 @3 ~  d! v0 t) E% qvoid Delay(int nCount);2 k  ^8 S: X2 `6 y' ~& Z
int main(void)/ M1 ?0 i' `* I9 b% ^
{  RCC_Configuration();
  I, {/ Z0 ^2 v' _3 @  GPIO_Configuration();# y& J1 X9 \, F1 O5 o6 @
  SPI_Configuration();# g( {% h: V$ R3 U
 while(1)
2 }7 H1 L  C# }5 o- x" c) f { int data=0;) n" p) m6 S, B+ a/ `0 k6 L, ]
  SPI_SendData(SPI1,0x55);
( {8 q  M# P9 J& G  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); / x8 ^2 H. o: S1 D! ~
  data=SPI_ReceiveData(SPI2);& K* B! Y: R  ^
  if(data==0x55)) C2 `* R* U6 y3 K; z
     {  while(1)
, D- e: X9 R: j6 E0 i8 v             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);/ e# r( X) W4 J6 p1 m/ @
                Delay(0xfffff);, d: y! q8 p& V: c) R" K3 @
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
- u9 y6 Z# H; B( \2 H                Delay(0xfffff);3 s/ q+ }; c% \& n% N3 L7 c
   + U) [; s# O/ q% i
             };+ b% m; m  P2 T9 |# m, X0 k+ x
     }
8 L2 L# x( u; G     else while(1)% m' l$ B* ?" r
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);5 G- I8 U& o# F' {6 I5 B) W6 ?
               //Delay(0xfffff);
) \* M2 A  p' F               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);+ w$ D  T! q. Z6 |" w8 ^
               //Delay(0xfffff);) M  j/ c+ ~; M! @* J
   0 p. r1 S! I  V; L5 b* L
            };8 |. i4 n  j0 v8 w1 R" K; }+ K
 }
$ k9 I; J; h- o' e" \% D* M}
7 p" ^; M" c5 U) R) H( e6 c1 avoid RCC_Configuration()
2 G' i. I1 @! n" }{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);: s. V  g5 ^! J5 E0 U
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);9 Z% d  a, y3 s2 `( d: g  L
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   1 t$ q9 [5 m* \% A4 c6 M/ ]) b
}
6 w. K& x  @* f8 `1 _9 m0 r" mvoid GPIO_Configuration()
  p: S! w! |& z( D& \1 L, r{  GPIO_InitTypeDef GPIO_InitStructure;
5 n- P. E; _; A9 I) r/ D& O8 d, L0 @  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
, m" t6 \5 q) A  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
% j9 F1 j$ s$ v9 W: W( w- \' m0 C  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
; i9 G' X2 F4 ]- l/ u  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;# f7 |' i, Q9 \' c
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
4 A8 D4 L' _9 P1 P$ q. Z6 `  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);! b- P$ j! z1 p
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
% ]+ y3 V% S: C; F8 z. W0 H- o  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
' O  c4 q. @) a$ w: x  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
8 \# Z$ w  y. k  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
7 ]5 g  s- e$ E4 W$ l8 v. V/ B5 y  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;0 s: U; _" i$ q3 \
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);; F' p5 @# u, l6 {; x# f. L5 ^
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;6 o2 l& M$ h+ L
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
. R7 G; s' G& J. U: Q7 t6 k}
4 c- g6 \2 R! |. i2 Jvoid SPI_Configuration()
0 }5 u. e) g% H$ p5 x  W8 ~2 L{  SPI_InitTypeDef SPI_InitStructure;- G; h4 D2 g0 O% K: H8 s- w- h. f
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
5 s# E( q' M5 [; ]2 b5 }. E  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);# v% D9 A" b  V( l6 [9 p
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);" _  ~( b3 d$ K- {8 s
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
! [5 A8 ]3 t6 E* B8 ]: ^  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);9 o1 p6 Q7 X" \" |3 B3 @
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);2 D7 m7 n1 g. F
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;- l- p+ f- [2 ?2 H0 A: I; T" ]
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
! D! L" M. y( Q1 {  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;0 {' t; \7 E: \0 D& K1 D/ y
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
: c+ r, v4 U, @5 f- O) ?  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
: {# \9 h9 L* }9 z: ~  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;. D: Q; n: k1 N) d9 r: z
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
* ^: c: Q% k* a0 w$ w   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
) m- J( x8 i3 D% {/ Y  SPI_Init(SPI1, &amp;SPI_InitStructure);1 B& j' H" h. x7 v5 c' e* K# v8 p! ?# V
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
! J  y6 B# d8 g$ D- [( q/ f7 @   SPI_Init(SPI2, &amp;SPI_InitStructure);) {; K; M5 V/ F6 k
   SPI_Cmd(SPI1,ENABLE);
" R" ?' F! `$ \   SPI_Cmd(SPI2,ENABLE); ) E: u! e4 V5 Y1 g# a2 t) U
}
( r' U2 P& l: V- k7 ~void Delay(int nCount)
: z) {5 {: s  A2 E) A4 [{ int c1=nCount;
) f! G1 x+ F: P0 ^" L int c2=nCount;
7 Z+ W  ~% h/ E1 ]: j2 D7 m1 u0 H for(;c1&gt;0;c1--). n* q/ |$ ^7 ]$ C' x; L
  {
4 R9 b, J+ ^- B9 |0 {. k1 ?' B  for(;c2&gt;0;c2--);
3 H2 C6 G9 v: A6 I  G };" j3 @* P7 R2 L% H9 a5 L
}  j! {  o4 l2 s
先谢谢了~~$ S7 n1 a( \" Z! n  P" k
 
, ^7 X: {+ P5 F9 x$ a& E& e$ j5 |4 u5 U7 m
楼上的问题,看我帖子给出的提示哦~
lkl0305 回答时间:2014-1-24 09:53:43

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

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

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

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

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

回复第 5 楼 于2014-02-14 11:37:16发表:
3 v3 w" P' B0 R/ ] 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
* f; s+ N4 A% w6 b 
0 q# V6 J* E) E6 r7 {2 ~- Z
+ L' W. @  S* h+ @. e* `, D2 S多谢支持!!
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 运算效率不高

  
+ e, v5 H% q3 H2 R0 L, _6 u( B1 E鬼魅一样的Hard Fault" F+ D" |/ m, l" @
 3 T# a' F2 d9 f8 r, P; g
该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。+ f/ Z( v$ g& x* z2 w$ z
 
: W" ]. a5 a" |6 Q. A1 k咋解决?
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 手机版