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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
7 k; ^3 x3 V+ k& B
: W  Z1 r+ b8 m9 F& _0 P2 l+ b+ K  H. }8 b
社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
: t' t/ I/ C. C$ y; m
2 I: @7 i! {3 ?& `/ \提示:点击各主题,进入帖子,可下载ST工程师解答详请
$ U! ]; Z' I# z ' h1 V; }1 |6 p7 l) E5 t7 X0 `6 }

) Z. g* L6 L4 L8 Q% s一、通信接口
& Z# L+ g, w8 p9 v
: ]& z* A$ d! x% p& ]: W2 i1. STM32F2x7_Ethernet(FreeRTOS)驱动更新/ h! y) Y6 N, F; K$ G' z

; G4 [8 ]0 X7 }  D2. SPI 接口发片选信号导致死机/ X& Q# q1 M( D/ @8 ^
) Q1 c# c* o& ]8 _) L3 ?
3. USART1不能设定600BPS的波特率: T# b& E9 A1 y# G9 j
/ S% ^  v/ O8 C8 K4 y
4. I2C 接口进入 Busy 状态不能退出
5 r/ P3 l0 ^7 j' K7 w. H . v( G# v6 _0 a$ ~7 ~. `% b6 L- {
5. 对 Flash操作导致 USARTU接收丢数据+ s! Q0 I. ?$ |# [8 \
) q" b/ g8 j. e+ x- L" S
6. USB接口易损坏1 @4 |5 L* o2 d
2 M  V* H& |3 F- E+ G1 H1 I  M
7. UART发送数据丢失最后一个字节
  _4 Z6 C6 h8 C# h
- K! U% Q: r2 v8. 使用 CCM 导致以太网通信失败
6 @: \+ f# ]" ?( \, r3 u, ?
. n. [, S& s& a3 g, J. L% P% x; G9. SPI3 接口没有信号送出' S& h1 L- }2 T6 T

; C2 z# g6 {. J9 `( B10. 时钟延展导致 I2C 通信不可靠
% J* [8 w0 U0 C- q) f
! V) C1 y. N+ }1 D6 m* l; i11. M0的USART波特率自动识别问题8 B1 Q7 k/ m& q6 X+ R# \
# O# }# r- ?# Y9 |6 s
12. WK15 OTG做U盘主机兼容性提高8 x8 U0 J/ q( c1 h- b! v

, G" J) F1 i1 ^3 b13. 以太网电路设计注意事项
& ?; G+ Q; Q% ?. D$ h / }! r5 @1 O8 x. b" q! q0 k
14. OUG主机库在BULK传输上对NAK的处理
" ?( Z7 F3 @8 Y: p 2 d' M% V+ i. r! e9 B5 U2 a' @
15. 串口断帧检测
5 w: o- d) L6 s2 f( J
5 l( H" B' P  o/ t5 ]  c16. VCP例程用于数据传输时丢失数据的处理
; j* Z* Z" j' N$ p  ~$ O3 u1 w. ^
/ d7 w/ q, |; x8 L% @4 n) K6 `17. STM8L051F3P6串口UART数据起始位判断的问题
2 P7 X' {. }* l$ H" J& u! Q: h 7 N# j' u8 I: J" A$ `; x* }/ v
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号
2 C# r! m7 V6 F. X: m/ H 1 a% \: {6 W* M+ {9 @+ c
19. STM8中UART奇偶校验的使用方法
  L; p; F0 x% e! h
$ x' R, I4 ]; H; @0 \20. STM32以太网硬件设计——PHY# H- J2 h* z, w; ?/ I. G7 R

! H0 O$ f0 G5 V9 m. b4 x21. 一个判断I2C总线通信异常原因的方法, S) [! ^# S; B/ o

  ?, k5 b# a4 I, O7 n9 T22. USB device库使用说明
, b7 O4 H& N: a7 l4 `8 B) c+ P! C8 u2 n4 n9 D# P
23. STM32F103上USB的端点资源  S7 r( b/ `+ i) N

- D7 V$ t3 E1 f- ]7 u6 W24. 使用CubeMX生成TCPEchoServer程序
" |, T" u. s  x, q
; {9 E# O& l& ~' |& P, y. J$ s7 X25. SPI接收数据移位
! f5 n) b4 n  u+ [. C
/ |1 d7 T) |4 e2 \% r; w26. STM32F0中Guard Time的设置8 F( {  F% d- M4 w2 b
, y) M2 t1 p+ K, L+ \; V) N6 }
27. LwIP内存配置
# J+ N. H3 X1 g2 b
! h4 x: W0 P& P$ d6 V( `28. STM32 USB Device的简易验证方法
; l1 Y7 ?+ h% M0 g- n  U/ f
+ T& P/ J9 x2 A9 a* h! J29. USART 中断方式接收无响应问题的一种情况及其处理方法/ i- O9 a1 F3 T5 ^
7 B; o' c, m1 B! B# V; E3 i2 `
30. STM32 基于 Nucleo板 CAN总线的建立# f. x5 k6 X- o- [7 |
& b0 y! y' N- A9 V, h+ l# j
31. STM8 CAN总线的IdMask模式的讲解- n+ f& d2 M, g
1 b- W# ^+ V% L/ R
32. STM32F746ZG USB 驱动不正常 3 W7 k$ O' \* m( N& \! Z
: z8 |' R  o! U, f# s7 f. ]
33. MCU在STOP状态下通过UART唤醒分析 / |2 t9 A' R& }3 _3 m3 x" B( g
! |' B$ X0 u* P
34. 通过STM32CubeMX生成HID双向通讯工程
# `" m; f$ q: n) b+ J, s6 H: q7 r7 v) S
35. 串口工作在DMA模式下有时接收异常
- T% [" X# d# n# A3 ]) r, n' |8 K  E; y: z5 W
36. STM32 Bootloader中 DFU使用限制2 s4 i& z6 x- V( G7 e
% n1 u* V3 Q/ n8 I
37. UART异常错误分析
: r( o6 v  _! X! ]% x5 I$ @2 z( M# T8 R7 R! J" E+ U- h
38. 基于Cube库无法检测CAN2的接收中断
1 L, n) K! i1 c, ^3 `1 @- [
) a6 S2 Z5 W1 q39. 基于STM32F7的网络时间同步客户端实现 , \( K# Q. \$ ]* V( \
9 \, n0 Q' T+ x9 T: J% |
40. HID与音频冲突问题
8 [$ B# F( k6 ?% J; f1 v
# A6 S6 ^2 o& J( s. ^1 x41. 在进行USB CDC类开发时,无法发送64整数倍的数据: g+ ^4 K" M3 l+ L9 d- S- R
' b& c* I% g% X8 G
42. 从零开始使用CubeMX创建以太网工程$ I5 d/ a& L+ }6 I5 P

% P$ r! a9 @; i7 ^5 O6 v43. STM32F4xxx的I2C总线挂起异常处理
8 W) F2 @0 H. N
( `' j) l5 |; l9 S8 d44. LPUART唤醒STOP MODE下的MCU( J/ c) ~' i2 o6 d- q

  A! B+ U6 \5 [/ \) w- `/ I+ h45. STM32系列 MCU模拟双盘符 U盘的应用
9 j) X: c  b( T% v, C, D6 ]
( n3 G# M, ^- C# n5 C46. CEC输出的数据和数据长度始终不匹配
" E% {. o6 @( c4 V; ~9 z- Y* Q+ K* q4 t9 ~: M6 N
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析2 n6 K: q- o) v4 B! {! S
; q" x  f2 f! _
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
( Q4 ~% b! K6 h1 |" `! b8 F7 @- n4 {  a8 ~# d# x9 c8 u* N) j
49. 增加UART接口应用时的异常分析0 |0 Y3 S% L( \3 n1 O% o) S8 j
" b9 h3 S# N, o+ ~; T. W
50.UART应用异常案例分析+ b  i: q/ Q3 C2 X% A2 v
: M2 W) |8 f8 W
51. I2C配置顺序引发的异常案例
* U; L- i: B% ?# c! k! ?( X" {' I# _) ~* y
52. STM32 USBD VBUS GPIO
" P$ s" ?3 n% p7 M4 t" d  X/ P- G, ^' n, r
53. USB传输数据时出现卡顿现象7 V- e+ U; e6 p6 _  X4 @" p) ?. p, F* \

5 J8 T- f+ n, N1 f7 [54. STM32的高速USB信号质量测试实现$ ?" x/ d: v' M: C$ ~
6 ]( }- B4 \9 {5 T4 k9 e/ G
55. 基于STM32 I2S的音频应用开发介绍
5 i9 l/ t( n$ M# I- e# Z4 P$ w! }6 m& p  V5 Z6 t
56. HID_CDC复合设备在WIN10的识别问题  
' l  W, r0 n) U; ^
% w0 j2 P+ d8 X. z  n0 r57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  # g* X/ l2 b, m/ l0 ~6 r

7 S0 X1 r; a: U58. 一个关于LPUART输出异常的问题分享  
% c% y! }5 u- R9 r
; j" G( A/ o; b! X5 O: s
59.通过 DfuSe 工具控制程序跳进 DFU 模式
' I* I1 [; b/ L: L* s: M. e
4 S. [9 ~" f$ E& z0 R& U
60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新). x( O# O# Z7 P) e2 {5 z

+ L1 S! v9 @4 t& L+ X9 U61.一个因初始化顺序而导致异常的话题 (2019.12.24)
3 h8 i  ~5 v* M& P# L7 [+ `
+ N  D2 t* W( T0 Z- U! A
62.MC SDK 5.x 中增加位置环 (2020.5.29)
: ~5 Q0 [; k( J' s! f

2 T2 ]5 n' I9 w$ m! e63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)) j- A) |4 ~, P% a1 S& l
0 P9 }" g0 _/ Z# l
64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)2 k, e; A8 C; `; j; B
& e/ U% d. |% T, c* {5 D
二、电源与复位6 O; M& x/ N# m
; q! D$ R/ _$ [2 }/ w4 e* Q
1. Vbat管脚上的怪现象8 C% n. O: M" C5 Y% t8 E) n
' }9 j2 j; A9 r, I
2. 上电缓慢导致复位不良
' o* P& V/ |2 Y+ X
8 Z6 d8 E( |# C3. 关闭电源还在运行
2 m; q, z- Q1 G6 f  t% X% @
9 L; B3 b- g$ S8 q& ?5 u1 H6 T4. 使用STM32 实现锂电充电器
/ P- f8 |6 C+ u2 z & D9 m7 [( R6 m  \5 d3 d
5. STM8L152 IDD电流测量
( [8 s8 m1 s) P( }
6 C- I9 ]4 J2 ^( }8 e5 N& N7 f8 w0 I6. STM8连续复位问题
+ [7 a- u) h7 X- u& {! C + i- p( b5 G' _* A8 J
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用2 N0 R6 z2 {/ L" m6 l+ w) D

1 J# N. y, S, {' H8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流
/ B" I: s2 N0 A/ x; A
( l& ]1 ]1 m' ^8 ^9. STM32F7与STM32F4的复位序列比较
4 k+ N- J7 D  \( Q+ @7 E
) A$ g9 h3 z3 T8 h- E1 H+ Y7 p10. STM32F107 复位标志问题 ) H1 f9 [( f: _, l( z9 R
- M" _+ r% z- f
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  7 I" J+ a  I$ i' U

$ T# F2 p- w4 @) N/ H 12. Nucleo_L053不上电也能运行
8 q( K' V& ~. E1 T
! P5 h- Y. I+ ]& n( j1 Y+ k3 p13. STM32L4中STOP2模式下的漏电流
* M+ L8 P. P2 x' w5 k# j9 S% p" {  a/ z
14. 在没有外置晶振时HSE_RDY异常置位$ J, {2 @* G! Q# E4 d+ y' I6 Z

0 `6 [. }; r5 q15. FLASH被异常改写   (2018.5更新)
. Y% w+ {; t' F$ _# ?. K# y- ^8 q  [& q5 i
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
+ X( |3 P5 J' I. g
8 [# z! j% b2 v17.一个 STM32 芯片异常复位之案例分析(2020·2.27)$ t2 h. k* `; [; ]( _
) X: ~6 }: w/ _0 j
三、IAP和Bootloader
1 D4 v* I* Z8 V0 O- p % C! S" F" T  y9 }. d8 c( p
1. Boot Loader与上位机通信不稳定+ N: a. r$ D+ c9 c1 ?! {

" x1 Q6 z- Q# [4 n- Q2. IAP+APP 模式下不能启动 RTOS9 Y1 L, m; ]. V% d

$ w2 M3 K& T- Y* i! h3. 从 IAP Loader 向 App 跳转不可靠
% Y9 d0 W, e; D7 q2 Y * m8 C; p9 _( H+ V, N; Y& G
4. STM32 MCU IAP例程跳转到APP代码简要分析
2 n4 {- L+ o  V( v  f/ q( X
( l4 W3 i  l2 h$ I9 \3 z0 K* h2 m* r& r5. STM32F091从自举程序向应用程序跳转的问题与解决# `& a& q. k* Z8 Z- G2 G# Q

6 k5 _/ d7 P& }8 f& d7 b6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
1 J9 x7 |# G6 @. u! }8 K  E% X+ U' n# C0 P
7. STM32F0启动模式相关问题探讨
$ ?, I2 P1 d- i! h- u( g9 S, W
, M& G, S6 f9 ^: R8.STM32F091空片使用System Bootloader下载代码
9 r; d) m7 E9 I* L. `# m: N3 D& r1 |8 G8 n  ?
9.STM8L  IAP 应用程序中编程指导% S$ w& _, x8 M' ?2 [

5 t" o/ p" m: I10. 如何通过STM32的串口实现简易脱机编程器# D% _$ |/ H/ @( j6 p2 g0 w

3 @( F7 q/ d0 y3 u  e11. 一种从用户代码调用系统存储器中Bootloader 的方法  
  H# r/ o  |% X6 x9 v6 e9 r$ ^! ]6 C/ n2 ^3 y& v9 F0 m. k
12. 利用 USB DFU实现 IAP功能
: }, ?2 q5 L+ S  ?3 U
" ^: }! y; M3 N: j6 ]8 C8 T( e13. STM32 Bootloader中 DFU使用限制
) J- l- o; M% \$ [( E1 T2 |1 N
7 t" i7 p# m% V: S/ c5 w. A14. STM32L011x和STM32L021x启动模式注意事项
. M! O7 x$ b. Q: L0 Q: Y  b8 g6 @/ o$ g$ N  x% \
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
2 f& ]; h  s; \) w$ k& J5 M( N/ V% h' g! e4 S: Q
16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
# U9 U% j- b5 X+ C' L
7 I4 B% l' m& X) x2 E* y8 n# I17. 如何使用STM32NUCLEO 板来测试串口Bootloader& y& q5 r4 V% \

8 d, b7 V: O& s4 T# y18. 在STM32L011上通过I2C接口实现IAP& T- _& P3 g% L) d  C4 b$ E" |$ j

# ]& v3 d5 S" v, Y  c& b) E19. 在IAR中实现通过将程序在SRAM中调试的方法
8 L2 D- l2 W+ W, f8 {- f7 ]3 U
! @0 o, F- @3 Z( x6 ~, G! }6 g% V& |0 l20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题; I3 o" c# e$ x$ U; Q, p& \
- Q" {+ X, G9 p! c
21. USB DFU IAP 例程移植的两个话题
! C. o; P. B* ~6 ?/ k- a9 v% h! t
22. STM32F769双bank启动* P7 B* l8 P5 F  O5 u

/ M4 L1 e- ~0 h) g$ z23. DFU加载 工具 DfuSeCommand的使用
/ O: g" K+ d3 m. ]
6 K2 q7 ~1 [# v% D24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
% L) m4 \4 G( V& F+ z! @  v% b& a+ b
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)
+ |) k4 b- E0 A3 X# K" j' A! a) c1 g3 ]( I" V- c4 d
26.STM32 Bootloader异常复位案例(2019.4)
/ S" D8 b$ z( b
& x, E) k  K5 n4 v
四、存储器- I: I6 [) c4 i+ ~- o9 M6 ]

9 t5 i% k7 I2 [! Y- F. V) c1. 对 Flash操作导致 USARTU接收丢数据( Y4 k7 d) Y5 r9 P$ F
5 V& o) O8 p* H% A+ u
2. 使用外部 SRAM 导致死机
# L4 b9 t- e* N( w" ?1 Y  |7 b
% }( q* Z, a" I/ R/ |* M3. SRAM 中的数据丢失7 |" C0 }  M3 G( u) E

1 ^: t0 q0 N8 K% b4. 干扰环境下 Flash 数据丢失
. }5 f  J2 V6 L2 ^" B
9 X0 D. R+ \% S- T8 {) l0 F5. 使用 CCM 导致以太网通信失败/ m' h4 H: z( {  n; `6 q# n( ]

' K3 s5 _& T9 q2 G8 v0 u6. STM32F429使用外扩SDRAM运行程序的方法2 a  ?0 t3 T' m' u+ @
6 s3 H  y; R2 P/ Z2 A
7. 使用STVP实现对STM32L1系列EEPROM预置数据
! c0 k0 S! t; P/ F. v/ z ! d1 V' J1 L2 {0 M/ P* L; h4 y
8. FreeRTOS RAM使用情况及优化方法$ v/ v( q" D# t; a( c$ J
% q& s. I; W# R1 y7 j
9. 在IAR 6.5下如何将数据存放至flash中
3 S9 x7 Z, k# H
+ s  }- L5 I$ x% e* E10. IAR下如何让程序在RAM中运行( I; j3 ~* J, R! O( N' s

+ R! @2 L9 q/ P1 d11. RAM上电后初始值问题2 Q( ~0 f" A4 ^/ K; q. M0 i' s
- ?3 L1 n* l# j/ \. e" B( o1 g; U$ h
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计4 l  o) g& E2 _1 h, y) G8 a- }
2 v; x8 ~+ L: J& j2 R4 h
13. LwIP内存配置
9 I* H! o! F8 E- N, H6 ]
5 r& {# ?5 k+ c) P* s5 C& Y) z, I14. STM32F2高低温死机问题
) H. O! u/ v: O3 u: x# M) L( S# F
15. 使用STM32F427的CCM RAM时遇到的问题
; }$ A9 ~) }8 M. f2 X; A1 X* M$ a! u, z( |+ p/ n. D$ f2 C
16. 利用QuadSPI外扩串行NOR Flash的实现  ; K1 Z  H. x/ S2 E9 N& h" D

& y; ]$ ^/ G+ p8 v" o17. STM32擦除内部FLASH时间过长导致IWDG复位     
- F1 Z$ {: E3 u( P1 M
: t; d7 u7 h; Z/ C1 ?2 a& |" b

7 N3 W% ?" e0 \& U3 F: S' q18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)- \9 i* Z# K/ K: J9 C

" d# ]- O# G3 \1 @. ?/ q) u. t7 b五、模拟外设+ m3 x, y2 x8 y5 z' e
4 V6 E; w* K/ T" N
1. ADC对小信号的转换结果为零" S9 o5 ^/ I( G/ W7 A
; s/ E; S0 W, y% |
2. ADC键盘读不准" B9 z6 w1 s0 B* V) {! d

  }, a+ u, J8 M1 I; x3. 扫描模式下 ADC 发生通道间串扰( @$ t: Q% \2 k. [8 t+ \2 |

0 v8 K3 t. K* K+ u  g# ?# M4. DAC无法输出0V的问题分析解决
$ k  ]0 P  `) o' G$ c( O
6 s9 g  o) M0 n' E. S/ Y5. DAC无法输出满量程电压的分析解决  @! l' ^. |5 q6 e1 y
8 H- b% H4 Z( X0 g: m, N0 b9 i  c
6. STM32F30x 的ADC 采样的傅立叶变换7 ?# }7 ?+ }: p8 Z" i5 ~

* I, ?6 a" [9 C7 c7 H- e$ |7. STM32 F1系列 DAC的示例详解+ D0 n# m- j, H) s
$ A$ {5 r& \* Y5 f6 R
8. ADC 连续模式采样浮空引脚问题
0 O! J3 J$ `) G; u) l; x7 n4 K8 o- B# g0 s1 [* b' `5 l
9. PWM硬件间隔触发ADC
0 E1 b7 H# l* v8 X' k% B& _5 N9 k5 B6 Z) n/ s
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC
0 M, s- x. m1 ?3 K: R. H" C; I
8 x) d( J, M% e" A  q* l) T11. STM32L4 系列中ADC 通道配置上的区别. {2 O( r5 j' k# R6 Q

* w- {5 `& k7 `+ S- ^12. STM32 ADC模拟看门狗及其应用
- g) x' ]+ C& t, B/ ~
3 x- C* n* r$ v* G, Y) ?" ?13. STM32L053 comp2 比较电压无效问题
% `* |% M: P7 O% b, c
7 y3 a2 E% U! J- a8 z; }( y# q# l14. 运算放大器OPAMP在STM32L4上的应用
7 B% g( l: e, K- R0 R. ?+ S( d+ h/ u: p% ?( j2 x7 [7 s
15. STM32 OTA例程之ESP8266使用 6 X2 j7 `% x: J. l

; t& O; c( O5 D4 D16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
+ `/ s& B5 E& K' G* ~7 {) ~( v
1 ?3 F. ]" b; z" A( Y: {$ s0 A# `& k+ }9 F六、计数外设& t9 ?. d1 O% k0 \4 t" c+ `; I

; u7 x( T  _# n9 [) ^1. Watch Dog 失效3 j8 k4 n9 }  o9 d7 ]( `/ f0 M

2 n- F- [6 F, Z$ k5 o6 E2. RTC计秒不均匀
- m' Q4 Y& ^: N! w& D. g3 G
6 j4 I& Z& F; `) M5 S& A& g/ `3. 软件启动模式导致 IWatchDog 失效
! E4 |: Q7 r* { ; e& z4 b4 Q, T2 U1 R$ j+ N
4. STM32F030R8 定时器移植问题
, R9 @5 Y2 X7 F0 O1 G: Z
0 C! o2 V" ?: F$ y4 Q5. STM32F0使用RTC Tamper的几个注意事项
6 U# Y4 ?4 x5 o! x, x) n0 C! Q
2 V7 N' o6 c+ P2 l; Q' F6. STM32L053可控PWM脉冲方法之DMA  U: H1 e( M6 v8 S5 C; i7 D

- D" ~+ R2 X8 M8 @6 r7. CounterMode,OCMode与OCPolarity关系
3 N6 Q: l3 c* @# H2 N+ t# A1 _6 S2 y1 D
8. STM32L053可控PWM脉冲方法之DMA) H% @7 i( T9 m

' R+ K+ @- T. ]1 h! `/ W& m9. STM32F1通用定时器示例详解—TimeBase
0 V; o' M; k' U( |, a7 Z& i% s5 z, ]2 O2 a2 {/ e
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals2 O! C. n4 ^% Y9 n0 U

1 P# b# J2 f0 v3 p11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生- v7 c: e) }. i! Q# O/ J7 X3 J

1 G/ ?. G& K; A  S( t. L12. HRTIMER的多种Fault事件联动机制
7 @, C3 p7 b  k7 d ( K7 t" d" p) D7 [2 H
13. STM32通用定时器 示例详解 —One Pulse: Y. v9 X1 x$ s  I

+ a2 o' n. i0 ^1 P/ p8 M14. 如何用LSE校准STM32F4内部RC振荡器& l% U8 a1 ?" t9 }8 `4 j2 Q5 o
% i7 k9 {9 ^" ]8 X: `. n
15. 一种使用Timer测试HSI实际值的方法+ U' \- }9 H+ H7 G% G7 _6 n' h

% W1 y- m7 G- R6 K& o16. FreeRTOS定时器精度研究
/ l% n6 t1 ^' T* d
5 w) u3 E2 X% U6 B17. HRTIMER产生多相相移信号
4 `+ ^6 C* u( ^/ T9 l0 ]' v$ K! R! R# V1 u5 F  X0 z
18. 窗口看门狗启动时异常复位问题
+ Q; M5 t( P' s) \7 z" E0 ^' w
2 x* O  E' r4 H. P  n0 [" x19. PWM硬件间隔触发ADC  b6 L) S8 q  T6 o' q9 h
; |# ^3 I9 f) z2 Y7 [5 F" ]
20. STM32F030低温下RTC不工作
, M& F0 \* N4 z. w/ S+ R' H7 g% ?* d" C3 D3 P8 ~% a
21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   ) s  v* s; |$ f6 {, b! K! |
" ]$ }9 d; g- w. w, f
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
6 |  p& d3 A9 B7 x% g. X% D
5 Y& t1 r( L( J23. 基于STM32定时器实现定制波形的示例 (2019·7·25)
5 W- V. ]: ]: u) L# z" i+ E. J% K; s$ C' ~) L
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)) r4 }' b. s7 {9 a# q
2 U$ B4 A5 t5 N: z+ \. r9 @
25.MC SDK 5.x 中增加位置环 (2020.3.31)
7 @) j% t8 v- V7 \% B: v
) P% U& ~8 V6 H  Y/ f
26.STM32高精度定时器PWM输出话题 (2020.4.29)! s+ F$ f+ v3 P; A' i7 F( P) ~/ P( g
3 U4 N4 M  b, L0 [
3 O9 X8 p/ Q9 ^) U1 V. d
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)/ n% Q# P9 b3 a& ?7 ]
* @( w& ^( ~/ x" Z+ h/ u
七、内核
+ P. P, U5 E3 F
& c0 W6 U& C& N# g  o" `4 o, K1. 使用指针函数产生Hard Faul
7 ]$ D) ?6 Z. A) J; [1 X- W& a
7 E$ c- K  _" L5 C  u2. 调试器不能通过JTAG连接器件
, c, K$ p' n9 p2 s% d8 ^ 8 `2 P4 H8 ^; x7 T
3. 鬼魅一样的Hard Fault" C* S; o0 r# u5 }4 l
. N/ F3 |7 N2 R. U5 ?% N7 g/ o
4. 进入了已屏蔽的中断[3 j$ Y; ~7 v* g$ e
- u! T+ O0 B+ B* Y. d3 ^6 |
5. 浮点 DSP 运算效率不高
: V" G' ~& d2 T( L5 c5 V* @
( p9 B5 h: o9 q* b6. STM32上RTOS的中断管理
0 _% E7 @# A+ s* ?6 s  K0 l+ V
1 k* V/ w: ]: E3 v' X; L  d7. STM32F7与STM32F4的复位序列比较" V, w0 ]4 R& F; K
6 X) q- y$ ~: v! B  X9 B
8. STM32F30x 的ADC 采样的傅立叶变换
' q) i5 n6 }3 s; v- M
4 ?- d. ]! p8 C6 [8 @9. EXTI重复配置两次导致误触发中断的问题
3 z) T8 k$ k% @- e' z9 L
2 E% p# \* S$ x) s10. STM32F3xx/STM32F4xx使用浮点开方指令8 k5 R. Y$ E% Y1 S2 H

) Y  I0 S3 h+ S& ~7 U11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响' U! }* X' I, ]  q% j
& d0 U; ]9 ?+ I: @! z
12. STM32F7 MPU Cache浅析  4 ?7 ]( b( P1 M. x- B

3 p7 o7 n0 k  \2 u& |13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)5 B- z5 R7 g" h/ H* m
& U1 a+ v7 P* {
14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)
+ w1 d+ B. O& ]: N! m7 v
7 o- g" R) q0 ]. E! ]6 I$ ]5 {

2 x1 A* F6 }4 t: W八、系统外设( K( t7 e: I) R- U5 Q
0 @2 c+ o2 k( T& o( w
1. PCB 漏电引起 LSE 停振
% }  f# |5 d- O4 V4 j7 c! P . |& S; i/ g' a3 _% s& J
2. 时钟失效后CPU还会正常运行1 p  L) B; w# i& e0 r8 a. a- G9 ^

9 y. C/ p6 z6 |6 T7 \9 j2 O0 |# n3. STM32F2中DMA的FIFO模式2 f/ j, O* g' Y( H0 i! B
  b0 L+ A, l' V6 D
4. STM32L053的GPIO翻转速度的测试
8 z8 V: F5 }7 f: V7 ~/ f' e/ g9 Q& X) |' g- Q
5. STM32F4xx PCROP应用% l: i6 C9 ~$ ?; U4 `! J
" a) c2 _) _+ i8 V  y  ]( s
6. STM32L053的GPIO翻转速度的测试+ y& x9 B; P+ n3 J- T! k- n
( X" `8 R/ ^: s6 e+ b4 x
7. 如何在IAR中配置CRC参数) S2 g0 r2 c8 |3 j& Q  o
# p# L5 x; f0 S/ n% ^, h" l7 k
8. PCROP区域函数无法被调用的问题与解决7 G7 c" C6 n  q0 O( W

" \; r% `$ |9 U; w2 R9 B3 c# O9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
: _- R* K! @4 V; X  @# O
6 I8 j2 z( n% i0 o3 q9 @10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
9 z1 D$ D9 y- V' j
9 _6 p9 }& q$ z9 a11. 如何用LSE校准STM32F4内部RC振荡器
6 o. ^' H* ^* P- Z* ]9 r+ u4 `, t2 B+ {
12. EXTI重复配置两次导致误触发中断的问题  
6 A% N" ]+ n: G
! P$ ]' L9 v/ t. x13. 时钟安全系统的应用(LES篇)  ( {; O, G& a7 }/ l7 }1 R" _
9 E# s" Q, ^: a; `- x! V1 ?5 U
14. 利用DFSDM开发PDM麦克风应用介绍  
# R! a/ P4 @' Y/ V$ H
& S- n; A3 l2 |, J! r+ }
15. STM32H7的FMC外设在DCACHE使能时运行不正常 # N0 G' V/ r* `% l3 b
1 T2 v# O) u6 Z( d
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)
' E# E! ~$ }1 p: h5 t, ]2 O' j) I6 [5 D

8 |/ p0 g. c" V. g- t: x九、标签和收发器  `4 e3 Q$ Y' }" o  k% h6 J5 g
7 ^* }5 s4 \2 R9 L: m
1. CR95HF的初始化步骤
; }$ n; M' J5 L! \
/ h: Z5 U7 i& V# R1 ?, r/ |- ^, i  Y/ B9 e

- c0 j3 D: p* @3 T! H/ g. l- Y十、生态系统- D" E6 b1 U4 d7 @; s3 ]: k

# s3 A5 U( j9 a; J9 w1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题
' i4 D$ \+ I$ g1 Z   ^! n' E( T+ F! c' y
2. MDK Logic Analyzer 功能在STM32中的实现问题
- d$ e+ J! A+ v; a
- M# e, H7 X% _  [; M8 f/ g3. 在IAR6.5下如何将数据存放至flast中" q& V% w  }: X

8 Y: Q" ^/ z* c# f: e4. FatSL移植笔记  s3 h+ F) r; W% ?& [6 m( |
& w- G* o. k6 f
5. Keil中使用STM32F4xx硬件浮点单元
8 ]- F4 P4 E, G: M4 e # _- W5 {3 w% |- Y" S
6. 如何生成库文件(MDK和IAR), T# ~" O, G$ D" K3 M" V
8 g  b/ i" U. n( e$ \
7. Nand Flash文件系统解决方案' u3 {# W" ~2 V+ G# q7 Z5 g+ r
9 ], ?! Z+ U* G& g$ I, A: @
8. STVD在调试时弹出“Cannot access configuration database”的解决
$ w/ B5 Y$ N: q% E0 r) S 3 [& V$ x4 K  w
9. RTOS低功耗特性的设计原理和实现
, H: h) ^9 R. Y7 q 0 R- [( C8 B' O  E  \1 ?
10. IAR下使用J-Trace进行指令跟踪
6 f; d/ {  F  B
. y  e% [. T- s0 x9 e: {11. STM32上RTOS的中断管理: d( |# w$ D1 z# o

$ F6 K% }) }. B# h$ P: A3 F- f8 j12. IAR下如何让程序在RAM中运行
* s# a, v5 C0 \- h1 w  z& D, Y
! t* s5 T  }2 W0 ~* @! d2 d13. 如何在IAR中配置CRC参数; M) @4 ^5 i. }0 W+ N
4 {' p) F. q% r
14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册, x$ J) ~$ F$ h. A* ]& H
- q1 s$ `0 z8 z
15. 使用mbed进行STM32开发及STM32F0的时钟问题
# D* B- r2 u4 t" ^1 L
& l" R4 w+ l+ C) P16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能! z3 v- r5 }) f! S3 A6 r

6 j6 t0 [! o2 q  _( V7 b17. 多任务系统中的不可重函数使用注意事项
$ @2 B# c: ~4 N) V6 o
! F% {8 P8 A8 F/ v0 Q' a1 z* f+ {18. STM32 utility的hot plug功能
' q" W9 O9 Z; ], l- Q' k% L) ~& [0 S
19. 如何将CoreMark程序移植到STM32上
; W* m0 y) h7 k, z1 s( [+ ~6 k1 \9 p( H& E7 X
20. FreeRTOS定时器精度研究
& w/ f6 {) `/ z+ Q$ K; e* Q; k1 s! ]' c1 l2 v- W" q$ O
21. 如何使用Eclipse和GCC搭建STM32环境
0 \& [$ B& d) @/ u( q9 R+ |. B6 ^# w0 |
22. 如何建立一个基于GIT的STM32库
0 O% p8 `" f; D2 J# w# g4 t* T9 s4 y/ m7 y* k* S/ U
23. 从零开始使用CubeMX创建以太网工程
( s+ m* k( g/ ~: j) @/ Q+ T: k3 o  {( R* E8 b% Q* m
24.从STM32Cube库向标准外设库移植FatFs文件系统
% r5 n9 M4 G* j8 }( m8 X4 U& F, e; {( ~/ p# {
25. 基于 STemWin的屏幕旋转
1 r* D- Y' r5 F3 _
; H. \7 ^- P. m- p26. 编译软件 Hex文件烧写
$ w" y' X1 G! F/ g* u
' G, Q' U% W) m6 j( w* W! B4 ?' m( d27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
: j& e. E( q0 i  v
) y- Z1 i  E1 F9 w: ~28. USB CDC类入门培训
* D) Q4 A4 Y1 b, `* [
+ }2 {; f/ C8 I8 \' c& m29. USB DFU培训 1 C% ?" j0 l( }5 {

2 u1 t2 D1 X# L. i( W30. 用于量产烧录的拼接Bin文件操作9 ?1 g+ @  D3 Q$ k2 x

( Y& K8 K  x2 \' C: s31. STM32免费开发环境该用谁0 l% c4 F+ x! a" N9 s+ X" ^
2 w" n; F! I5 D. q5 S
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)$ J6 q1 o; Q; l. V) H8 h7 b

0 F5 T- p2 v3 ]: X33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
- A9 ]4 b! D4 T( x  M. d) i: E. U. V& G
34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
: E, V6 l+ b# u
0 [6 }% \/ D  ^6 k" f8 `% N$ q7 L35. STM32 FOTA 例程之 cJSON使用   + j6 p1 c5 t6 T1 B# @

; p7 `9 O9 C; m7 `3 V2 a36. STM32F769DK 云端固件升级例程使用说明 ) Q/ L7 {3 Y; v% S9 X* s  f- s

6 t$ a% s! [. R* \& `. d+ `37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
! K( m( q% [1 z" F8 U# c/ K' N0 ]: r
38. 基于 STM32 的阿里云物联网平台方案
6 [2 b( r# ?# k8 j; Y/ i
: \( g( q2 ]$ t1 U39.AliOS 任务上下文切换原理分析  2 |$ h. c! W$ N, t4 S: P; x, Z

, k, z  V- i. S9 v  d# j40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  
: `+ H! @" Z1 x0 F  w3 R
8 ]/ j2 [0 B9 s1 G41. STM32F769DK 云端固件升级例程软件开发文档  8 H' z1 ?( M3 b& Q8 V6 f$ k

' x2 ]* O1 c# z! o1 v5 U42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
& Z. B2 x0 ]' }# `6 w) o. z8 g+ y( B& F# w( T0 s4 K/ X% q
43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)- J0 |! w0 e1 k
) h7 O. L! l& E, W" q4 W
44.零基础快速入手STM32MP1 (2019.9.19)
; K( C2 f6 J2 F1 J6 E/ C5 `
: _% \, {3 r- F1 a& @/ l3 R. v45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
* }/ J# E$ U- A& T2 W, ~, Q" s7 q0 w- A+ ]
十一、调试  ^) O: q+ _; Z  [' w  k, D

/ ?2 O3 l- g1 P) D7 U. o9 l3 _1. 关于STM8S SWIM Error[30006]的分析
/ [/ _. o/ @# L' _. d4 G+ ]8 T 1 y& r( R) D$ r" ?
2. STVD在调试时弹出“Cannot access configuration database”的解决( [/ a$ I, e! |9 R! a! X! ]

& h% G7 F, {) |3. IAR下使用J-Trace进行指令跟踪
" K6 E2 y- o* S" D
/ x* j: l) S3 B9 Z; L4. 菊花链 JTAG STM32
! g5 x. ~0 [  A* e9 O5 h8 Y9 |& D6 j9 h% }% E7 S! E4 m
5. STM32F411CEUx 能下载程序但不能执行
2 g6 N; M% e4 P- ^& [- O. J+ b2 d/ T$ g% |; n. J; j7 u( @; F2 Z) c
6. STM32F103C8T6 程序上电跑飞5 ?% y: C6 `% F2 ?3 \" `- h9 f
% G$ }3 V: D$ b$ r4 _$ B
7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
4 a0 k6 O: ?  Y! h" i+ o5 P3 X
8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
6 I% N8 O. e0 R, g# c) J& M1 E$ H3 A3 q. V, w3 [/ c5 N& e
9. SWIM协议的GPIO口模拟) O8 w/ S& ~* }
( o) C5 i1 G( p( t
10. STM32F091空片使用ST-LINK烧写后复位不能运行用, U6 o% {3 Q+ Q

) x/ k9 R  ]4 _  L11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)% o: |) Y+ t; p7 @6 `* W
1 ?) e* I' R% \3 q% C% r0 Z& s
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)
8 Y$ g: r- f5 f, v& }* e
- D# P% e6 o0 g) Q9 U5 C13. X_Cube_ClassB代码移植 (2019.12.24)
9 o. t5 P9 r& P- I* `; F
8 j3 s+ X  t: l) s. X* \
/ w  L1 k& |+ X8 }) P
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)
0 N2 X" W$ ~% u2 D( n0 h* _$ Y) E( s$ |( ?: |1 w$ ]# b
十二、人机调试" ?: y" H9 E( |1 i0 J
* r& h1 |% r% @; q
1. 一步步使用STemWin在STM32上开发一个简单的应用9 T5 \$ z! W- ~5 C9 x7 g
7 a6 M7 T' \6 t) F/ f
2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计; y" r! }% }! p' A) S9 {

$ [9 X/ N$ N% r5 f( p: K3. GUI方案中ALPHA通道处理介绍# A7 y+ _3 z1 q6 p9 }
1 O' p: z+ G9 e; w. e( _
4. 基于FMC8080接口8位LCD的STemWin的移植
8 x1 _0 k7 D5 [9 w6 S5 d# J! N/ s* |; K  @: N' O' a/ P
5. TouchGFX中Callback模板实现原理 (2019·9·12更新)! |9 r! X9 U$ g5 O

% ?- ~! w4 N$ k' r  b6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)+ H0 e9 p+ [4 ^1 K: d6 r5 c6 `0 n
! ^/ n1 O1 ~5 m- C! \$ l
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)1 K4 T  Y& e9 q% ?0 h' x& u/ ?

8 S, p1 E7 ~9 [9 I8、STM32L5中如何关闭trustzone (2020.5.12)3 g  n. ~) g! m5 K# w! o
, p, e& x* \' T: I+ k) W" E
十三、马达
- r1 C" ?6 [7 \
% Q) }9 `" B0 i2 V, A
1. 电机控制同步电角度测试说明
7 K' |$ U7 G4 }
# ?; ^4 z1 J* F' l4 m
4 y1 x! y: M& C% W$ J2 V' R* g5 o" y$ @  P8 y2 |  [8 H9 F
十四、安全2 \' |" F) T7 g2 y2 i7 W) q# K$ `
/ q" u! Y9 U, `# {4 b4 O" L  A) u
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)* U& y  a0 @7 s, E/ @2 k

& _. ~- G2 O7 g, o. Z- t
9 o; Z7 n3 F# ]( c十五、其他
: W; _& X; c! J4 K

; q5 l' _! F; I  |1. 跳不出的 while 循环3 J9 l& ~% f$ o, l* G5 C

' W6 _$ M6 X# R! y2. 外部IC连接NRST导致MCU内部复位信号失效的问题
' u7 ~7 C% r8 _" t. H8 \5 g) M
! D9 R9 ]3 w, i! C2 K3. 潮湿环境下不工作
% |, C# H7 T5 j/ L5 N% m , k% o6 N) V6 |8 ^2 ?, K$ F3 }
4. PCB 漏电引起 LSE 停振- k8 t* R3 f) u" V# C
: E. `/ v5 V/ |$ ]; e: H& T
5. STM8L152 IDD电流测量) w, y, j: i1 e

1 ?, K8 e5 _" Q6. 使用STM32实现锂电池充电器
4 f# \. D; \! N' i0 L2 {# l
$ |: T6 A* u" [1 D7. STM32_STM8硬件平台基本检查
0 k7 R) u" x, J- K  N% G7 p7 s# v0 O) f
8. 验证STM32F401在STOP模式下的电流1 ?, i) ]+ U2 P& `0 S/ g( I

, B5 {, R: |. P7 m- j9. P-NUCLEO-IHM001 电机开发板串口调试指南( X3 T( I. L0 ]. u! s" @1 @9 x6 N
# r$ u" }( `) ]# J
10. 一种计算CPU使用率的方法及其实现原理# E; c2 E* Q8 ~1 d# H3 u

0 C% g8 d/ [3 J# q/ B% j/ K$ S11. STM32 RTC不更新原因分析
- n) N, U2 A: ]5 o/ T, L1 C2 x3 P( C6 r
12. 关于ST库函数的代码性能对比
/ E7 |& Z4 L, V+ v! s. Y& k' _4 D
13. 在IAR中实现通过将程序在SRAM中调试的方法7 o& }5 H7 t/ Q
8 i" z1 Y: \; C' ^/ N+ L, J
14. M95xxx EEPROM写保护配置) ~0 F" D. }5 g. k2 K( j. V

1 G% D* a0 |; {. A$ U4 k9 H, S15. 4SRxx的GPO的属性
& o1 ]; h* z& |# O. B9 R; J1 e0 _6 B0 Q; d7 k9 e6 Z3 z( T
16. CR95HF的初始化步骤 : f! ]) s% F! f7 C( z) Y9 x- w
9 t! L3 r7 B- x% S" N! y
17. 电机控制同步电角度测试说明  
, z, ~$ r8 z2 C: c, c8 M: V- Z7 _
% O# L0 e- T+ ^3 p0 i! l18. STM32+BLE通过 Notification与 Android应用程序通信的例程1 `% {( b2 N) @: e1 l2 x
* T+ s$ H5 ]9 ~- J
19. M95xxx EEPROM介绍/ F) u$ W2 f/ B0 e2 k

# U4 J; p" N' M6 V6 h20. STM32 DFSDM测量温度应用 . c* E: e! q7 |! [, a0 e; q% {
$ a7 n1 F3 Y# z
21.代码实现PCROP清除0 O& s, t/ `" A! t) w0 |

& K, {4 v7 Y4 {8 W- I9 n2 n* s/ C8 T22. 理解与应用MPU的特权与用户模式0 k5 g' L* _- A1 V
+ M- T! {* R0 Z
23. 用于电机控制单电阻采样PWM变形信号产生: n# Y' p% g" r' A
% C- p" `, c: [5 b: [1 O& e$ ~/ w
24. STM32L低功耗模式唤醒时间测量8 _/ r2 v! ]2 L% b! ]) W
6 t0 N6 X! g: L3 P1 p
25. X_CUBE_SPN7程序电机启动抖动问题2 B2 v/ I# Z( O5 R& B
/ @) ^$ |) V' a, t
26. 发现STM32防火墙的安全配置
/ L0 r" k7 y, `! g- e: K7 B2 L; F2 }: N
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改7 e/ t/ Q% @3 C/ E3 B3 B* P

8 y* W# O9 J1 V% V28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
- U9 k# C' h0 T
& `1 y1 ?. `8 U
温馨提示:
- `7 b9 U8 b' `6 B2 K3 a
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
- V) U4 e1 o/ _$ X7 [

  M7 W3 i+ B$ ~% u6 j0 P% @3 a
( N: V( {4 E4 m7 j. }
7 g' W& x6 o6 r9 O0 ^4 g3 J: n8 l4 _% V) p6 u7 d! I

9 V/ S# A( e- \* g& B/ @( ]1 h9 U( Y' s2 v: |0 `

- t* a6 m9 ]" X7 o4 z
/ W% a, G+ r: k) n9 X0 j' E. S
8 n- `1 B+ B. A' ~0 z+ B. }% v* h2 Y2 }" z  i1 [; 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
好详细,多谢分享
: e3 e% F% t; R* w8 S/ m+ ?3 @" `
5768340 回答时间:2018-1-13 14:42:54
HI  ! a8 m$ s: O3 D4 A
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
9 j3 \# q  g, v5 `7 ?; _   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************8 ~4 v' ?! O9 P
  2. 函数名称:Cdfinger_Bspspi_init
    + u) h8 n/ W5 U3 p% Q  I
  3. 函数作用:spi初始化函数
    + g9 t0 l2 T& l  R' w8 v1 [
  4. 备注:$ W" u2 G2 }6 p* n, C
  5. ******************************************/+ s9 Y# V0 n* F- Y: n" Z" _% u7 r6 F
  6. void Cdfinger_Bspspi_init(void)5 \6 ]. t. O4 b# a+ i) O  E, m
  7. {5 E9 ^/ l6 `- h4 g8 \; k
  8.         GPIO_InitTypeDef GPIO_InitStructure;7 a$ }8 Q; F* R% S: j  d5 R
  9.         SPI_InitTypeDef  SPI_InitStructure;, v' G; t! K' t! T/ ?: s) C, x
  10.         DMA_InitTypeDef  DMA_InitStructure;( X( G! ^6 L( Q) e6 j
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    7 C# [( e: @( H! J9 n
  12.   
    $ O' z6 o% z  L% y
  13.         int ii =0;* c8 [; u0 n$ r& Z9 y
  14.        
    ' ?1 a, y5 L$ x# C& n
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);0 p" D9 T: r1 z6 h# J
  16.         /*!< Enable SPI2 clocks */
    3 n" l& v4 F: Y) Y) I, l; r
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);' M5 B- z+ p( Z2 i$ D
  18.         /*!< Enable GPIO clocks */
    9 Y9 j+ ^  f& w9 m6 b
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);4 z% e  M# Z. h* b4 ~' d
  20.         /*!< Connect SPI pins to AF5 */5 h7 P; O  t* X, {1 L/ u
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    - T5 O, ~+ L7 t0 g/ K
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);( J% i( D: f5 X3 @8 g) {
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);0 a0 {# s9 @8 k! u
  24. 1 V& g0 b$ j0 H0 U: B7 ~$ l! }
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    * G% g' u9 o+ ?6 K$ K3 x! _8 }
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    + p: I; b" U) {; U1 N4 b. }: @
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;4 N# o) q4 G: @0 x% Z( C
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;; z7 c0 c+ c* Q2 z5 K
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    1 Y( m4 d7 j8 l( v
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);& {* I3 E8 L: h. \) @8 f/ g

  31. ) N$ m/ [% x5 b6 a! G
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    # `8 s6 J3 b9 p
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    , i4 E+ x4 _  x/ A3 Y+ q3 I9 q
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    " Q8 B, X. B* o" V' J2 |. \/ ^& A) e
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. P& I- o# T8 ^5 K$ b
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    9 }8 D) o0 Y5 v, x8 K3 D
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    5 ]0 V% O6 K4 O2 L- q
  38.         Cdfinger_BspCs_HIGH();) X/ E4 G5 z; J: [" A7 o. {
  39.         //Cdfinger_Bspdelay_ms(1);
    ' h5 B8 u8 e- a7 \5 N
  40.   //Cdfinger_BspCs_LOW();$ R) x: s8 ?! X9 ?+ ]
  41.         SPI_Cmd(SPI2,DISABLE);
    & H/ E2 I* c. ]% ?  H, i1 V
  42.         SPI_DeInit(SPI2);; `0 y" b/ u9 F
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;, G8 g5 m: U. j2 _& C. `1 e
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;" P( W: M" V- S8 j+ S4 v8 \$ p
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    - |% \9 i* j! b+ g8 e
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;0 S+ F( B7 k# A, z5 ?
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;6 i+ ~; Z0 Y4 K
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;- d  d0 y5 i' g6 J9 E% K
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;. K: B* {# _3 D4 Q3 z# `" _3 _
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    ; m6 h( @( C& j4 ]( c$ z
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;
    & W) V0 `: s# Q% q4 _' {/ O
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    - N3 \0 M5 l& e7 c# \

  53. 7 H% r5 P% S5 v
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);4 ~8 t: B- l; w  c/ g% F' f! l( d5 T
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
    2 ]: b" K0 q% b$ @8 Y7 A
  56.         DMA_DeInit(DMA1_Stream4);6 J' x0 q4 `& Q* G1 a
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;$ G  e4 {; H( {6 e. ^
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);- Z6 C& ^" a1 S; x2 v
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];. d  O; I& h2 v  v+ D8 v
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;, {1 X' o( V' ?# C) V! m' j" [
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    ' P2 D5 ?' y, }* V
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;$ _; k( X9 L" v5 r
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;1 `  U6 |( T! [1 h: s* S/ v) s
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;% a% K0 \% @! m! |$ x
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    2 O, [. }) a$ `  u
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    5 ^7 W* A/ m8 x
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;' q3 A2 ]  j, ]8 B$ b1 U
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    7 h1 y  l0 l3 h2 @" ?
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    + R( h& S, p( _4 i% `
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;8 r/ h8 d0 k3 ~' E! B/ r  {5 G
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;6 x! ^; B& I; z, X
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    & M( I4 T6 a7 N! ~: ^
  73.   7 |; Z* z( x" p/ y2 R% T) _7 [/ M
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/! q2 B7 B7 E  x2 I; E- Y5 J
  75.         DMA_DeInit(DMA1_Stream3);( e& o& @! K: _7 V% \
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    , v& S; T, U# K/ I+ {! m5 c
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);/ V2 H) |9 y) h7 F( U: }* x
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    % U. u4 _" o& Q3 z/ {& K; u
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;  H4 \* m% o8 D1 s+ m$ G- w
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;  p# q" t/ g& U6 I0 U+ f& b- K
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    4 B9 V6 O. A( \& n& w, I
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    " T7 S7 Q" w. ]0 C5 M! d4 K
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    ' f* U0 M+ l4 a: g- E
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;0 G7 q6 C' v0 a2 v
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;& V9 u8 ]6 a5 i$ D; N% Y" b, Q
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;  `  K8 u0 M% m
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    8 ~( i' E) C5 B+ o- P9 M
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;$ T. V* v( c) r) a, P9 C3 c2 }
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    1 }2 ^. B. N! t+ ^
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;! v1 K; d2 t& p% \8 @, b1 y
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    % j. }# W0 x# Q7 k/ Y  Q) W- m2 n
  92.         //Cdfinger_BspCs_HIGH();
    + o& B7 X1 o( e2 x
  93.         9 E1 l4 b0 {, D# e! h

  94. 4 d" j+ t1 F2 a- i
  95. ! a, x$ z# z4 H! Z
  96.         //发送中断% W1 [/ h1 V0 ?! X+ d! O2 S
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);' F4 j/ _1 D1 Q+ ]6 ^
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     - k* `7 u8 X, p8 @
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    . D. D( \& f' ]+ {# S$ b  J. j
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;. M2 y: a6 e( ]8 A/ L
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;# e7 p0 X4 |& z: q6 X) h
  102.         NVIC_Init(&NVIC_InitStructure);6 C+ F* |' u( J# Q7 d
  103.        
    1 k  m8 k! B  V0 m$ E# ]2 {( c
  104.         //接收中断( g* F8 o+ p$ J+ R
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    " c3 p/ D$ H/ v, N" K3 C! c
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     - M) m7 @% K6 D  d' K
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    ' {* T" A6 q# P! V% b
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;4 C$ H" j. N6 n( j7 @9 ?* D
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    - B7 q& @* ?& |/ a( O2 W
  110.         NVIC_Init(&NVIC_InitStructure);
    " ?, L. D# Z4 |# h
  111.         SPI_TIModeCmd(SPI2,ENABLE);* x5 s1 a5 o' |2 {' Q* I) D) @
  112.         SPI_Cmd(SPI2, ENABLE);; Y+ I' r4 K7 Y' Y  x
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    1 o9 k* d: R5 T5 |# [1 J
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);0 P; E8 O: ]/ N5 X9 d3 k2 U/ h* s0 a
  115. % ]+ r. I, K7 j4 S/ b$ P0 Q* }+ d
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    - v1 \$ ^: c% z$ ]6 P
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    # j8 {* p/ Z5 E4 B4 @
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);+ V; E# X" S5 K
  119. * L  G8 H; x7 Q; n
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)9 D" W/ z9 T4 y5 _2 u2 p% d& [: Q# O
  121.         {
    ) T& E' t. t* T0 \/ \
  122.           if(ii%8==0)) k9 x- T+ h( l$ @5 U" S
  123.                 {
    , d5 V! k) e0 x' A+ U9 o. I& M
  124.                                 printf("\r\n");. ?5 \" j7 L. ~1 w
  125.                 }; B* C2 q$ A* l) H* {- F) F
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    ! v! I: v  w" `- k
  127.         }
    9 E9 c$ O$ |% q6 c6 @
  128.         printf("111\r\n");
    9 o% N& P6 Y/ S. M  N
  129. }' v  q% \; x- F6 @8 B
  130. ( d" P! B# B& O$ V2 Z

  131. ( D2 Z2 K8 i7 _( x' a6 C# R1 J8 e4 o  m
  132. void DMA1_Stream4_IRQHandler(void)
      b) h' p% o+ @  P% @" p
  133. {  C) \; P9 G0 _& _
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    ( r; v( U: Y# M3 ~0 K  i! X
  135.   {6 J- @, K/ k( A$ @
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));2 e- H% ~5 |/ H. ^
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);' }& c& s0 J2 C# k' G
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
    * s4 t& N7 O' k+ ^
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);4 \: W! N. h! S% ^/ Y) r4 B6 M6 i( c
  140.   }2 S+ H) a# R; s9 \
  141. }2 s  _" n/ p+ C. N  N6 ?/ {) W) g" M
  142. " I3 z  U  Z+ Q- \
  143. void DMA1_Stream3_IRQHandler(void)
    # c* s, K$ d* J! {- I0 Y6 S
  144. {
      r6 |0 y; X9 `1 @# ^9 a6 v
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)1 {/ ~1 Y; U, \0 b, p4 f( G3 N. P8 X
  146.   {
    $ d0 p  G7 k% {5 U/ k- b' {4 D' D9 x
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));& z! {* o7 y! G& L& J) w
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);! o8 T! l! w0 M- D/ |; D
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    ; b1 x! F& T6 ^3 A$ d* P
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    - E2 f; `, z* x/ R5 e5 w( |8 ]
  151.   }' A4 }1 v' ?! L* S0 V
  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的波特率是不是必须为相同的,才能正确通信
, f# y: \$ q( y7 s* X. a1 ]以下是全部代码:# e/ y; C4 H6 R2 J7 }  K
#include&quot;stm32F4xx.h&quot;
7 P: C+ {4 H6 x" V- T& `" \void RCC_Configuration(void);. Q0 ?! O; j- M5 I5 m
void GPIO_Configuration(void);9 p- ~0 R1 ^( v- u5 x( {0 L, k
void SPI_Configuration(void);/ Z" z" K( W  @
void Delay(int nCount);8 ?3 R  T3 i! E. ?* ^, v7 i- ?) d
int main(void); _( f7 v9 j/ O# a( k
{  RCC_Configuration();3 f  p0 o# ^4 M$ Q, @- T
  GPIO_Configuration();( q' T5 Z, T" Y% T9 W
  SPI_Configuration();
+ T5 w* [6 l% ?1 q, M8 j4 | while(1)
1 D, Q3 e% }; e; | { int data=0;
7 U7 O- _" i5 k) \* L+ G# m9 ?  SPI_SendData(SPI1,0x55);
+ \# {- a- O% K8 Q  x  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
$ m* i: A7 @7 d0 V" }3 _* U4 `' l  data=SPI_ReceiveData(SPI2);
  M- S8 l( m( Y. Z  if(data==0x55)  D+ p9 h3 p/ Q7 `4 i/ V( d: B' N2 [
     {  while(1)
- x6 o7 ?: R2 n& Y8 K7 E/ _             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);5 O% Y0 p7 x) J: N8 X, j6 f
                Delay(0xfffff);. F' P$ r" M, c( k8 z
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);3 j+ {0 V' e7 P8 }7 H( [! j
                Delay(0xfffff);
4 B  Q$ |4 y0 U5 I, C7 F  
' Z, a8 i" g7 b0 _3 Z             };& i; a: f$ t+ {" N! l% l3 ^
     }6 z+ F4 q6 z& S9 ~
     else while(1)+ g$ x* u, J* H! J' U, T
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);! j. U0 V- Y6 E) w
               //Delay(0xfffff);
+ c+ m5 G4 @. q/ G) I1 f. |0 q" _               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
, v- U; z  j( f$ h& m               //Delay(0xfffff);$ H0 x/ k7 w, z( g  u
  
( P6 b1 [1 S9 E* `2 v  a, X            };
, h# ]' G  z' |0 a* ~$ f( K  t9 p: [ }
/ y+ d* ~1 Q8 E2 ^4 C}/ U) ], U4 t9 ~0 U$ E7 ~
void RCC_Configuration()
# S: J- @1 q9 \7 v! ~' T{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);) k# s0 W% J8 I' Q4 N  X
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);+ g1 u1 H" B* d  x1 z( c
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   $ }6 e* W3 c0 x, L5 C4 |
}
7 f! h% Y* ?& `void GPIO_Configuration()- Y) o. M- T" c- R
{  GPIO_InitTypeDef GPIO_InitStructure;) |& V. i( \6 `9 r/ h1 m
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;& h& p- k; ^4 y
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;: p! V6 q- V: r4 |$ c' m
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
# l5 T$ z; N7 ]# x" w7 l0 a  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
8 ?4 V4 l% w1 {0 ]9 l  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;3 w3 z( |- B) k1 r- J2 d% a
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
) l8 B! W$ r" A! A5 E& F3 ]  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;6 A- X5 y: p5 ~5 t! r( w
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;. ]( M: Y* r) h. c, G
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;3 l% c  o2 B% n! Y; z1 g
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
% n& f" V9 X6 u  W' O7 t7 x9 x  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
! R6 h2 U- p3 J6 a  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
; n* N- s2 [& }- p* s  g" K  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;' r4 i+ r& S( F3 {! J$ a
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);, V' k; u; o* O7 k% ?0 _- H! H- V3 z
}
7 Q0 \7 R; O# x4 p7 Lvoid SPI_Configuration()
( D8 K+ F. n- q' y. i; {7 D{  SPI_InitTypeDef SPI_InitStructure;
3 W5 s7 r6 |* \& d! ?/ |. e1 Z  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);! z" O4 ]3 p/ z: O; L
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
! k6 e& i6 F% j" c4 ?3 f& ]  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
% o6 W1 m1 ]2 }   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);4 j7 U9 `& m& v  y& @
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
( m0 {) `+ x; N$ v9 [0 w  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);& a5 s6 _8 A% {$ s
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;! d2 ?2 D3 l/ P0 s' N
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
! W& e% s$ ^4 D' v  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
" ^* s5 {5 Z9 q% k* ?  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;4 u9 U, p& m* m9 `9 s: Q# S
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
5 d1 J+ H& b* F, N. F% @  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;& P8 h) f) r' |( L) E. n" d
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  [+ `+ l1 [9 p6 X: p, D0 [   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;6 G" y5 ?/ q! x0 C
  SPI_Init(SPI1, &amp;SPI_InitStructure);# Y) I) F' ~# L+ u/ F, ]
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;3 D) o& |% N  w# o2 _
   SPI_Init(SPI2, &amp;SPI_InitStructure);2 T& a* X7 x8 S& \5 t2 M0 b6 f
   SPI_Cmd(SPI1,ENABLE);9 j/ U4 c! ?0 @+ n6 ?! B' I! b
   SPI_Cmd(SPI2,ENABLE); 
' i) s# x: y% `: i- E6 h}
7 T! {8 t3 ~' n% Kvoid Delay(int nCount)
$ q. g; S2 T& p$ a. l5 i8 C{ int c1=nCount;& P& V! s- t! K/ n: H4 a
 int c2=nCount;* C+ u* `9 v: d  X  f) ^
 for(;c1&gt;0;c1--)
  I7 n( I7 B/ ?8 A3 e  Y  {( A0 }1 a1 }5 e/ M9 Y0 j1 g2 ]
  for(;c2&gt;0;c2--);
# j  N0 S/ d4 w7 z };
, y9 l3 d; b0 C8 Q3 z}8 |  n8 t3 `, h
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:  w- @% l6 x  }. Z# x
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信* [, z. M/ {" r1 f7 ?* x, n" j/ g
以下是全部代码:
/ j. g0 _( g9 f#include&quot;stm32F4xx.h&quot;- q# `7 I- c' ?' J' _% v
void RCC_Configuration(void);( u  r$ U' z' X; a
void GPIO_Configuration(void);
4 k. f- i* j5 T, Ovoid SPI_Configuration(void);1 u$ h, a* b$ {- q+ z5 J3 M
void Delay(int nCount);2 r/ |& T" {  t
int main(void)  q- J7 L" B! G4 K$ z% g$ j
{  RCC_Configuration();
- w1 d3 P$ W2 C9 f) i4 H. E  GPIO_Configuration();
; C9 i1 B2 S# q& f. v3 g! y( D  SPI_Configuration();
1 b, A# ]  g$ e) o$ t  k& Z while(1)
  G, r! P3 ]% f- Q# @) z { int data=0;
9 c. p0 ^- e2 X% O  SPI_SendData(SPI1,0x55);
! D9 U* z; [% s! u3 u& [  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
# y1 O7 q% ~# q% ^, F$ a4 a  data=SPI_ReceiveData(SPI2);9 ]* ^8 a8 r% [: A
  if(data==0x55)
* P8 B7 V! M% x- R0 b$ M& H     {  while(1)
# ?2 [1 g: O* I5 y9 p& S% W             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);9 _; g2 g' x) A# k" y  P
                Delay(0xfffff);/ y8 ~1 A, g1 R7 g; F9 x
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
' D) i  |! i7 f8 i. A7 o  v                Delay(0xfffff);, E9 g- B# D1 E$ d4 u, @
   ; }/ ]- v4 C/ s6 m  t* q) I, l
             };
; K+ A+ S. W( s0 T! n; O) J9 W' W. o     }
6 t( M& a/ d% t1 q7 w( O: g$ g" b3 l     else while(1)
9 W- Q1 P# t. Q( s: F: S# T            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);2 z3 R6 H3 A" k+ o0 g0 L2 [
               //Delay(0xfffff);
  h( x9 Y" j; i6 x& ?( O3 L/ H: P/ T               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);- r& p5 @8 {# K; |" K
               //Delay(0xfffff);1 W0 n1 X" B3 m* a7 T3 u
  
( b9 u  _# L6 L2 ]            };6 p+ ^, @. \8 }) A  C
 }
$ S6 k( }; _7 ~& D# `& w  q' f}
  A6 J2 Z+ }4 [+ H& I8 w% `* Wvoid RCC_Configuration()) D( o% c6 |. y% e: r: w" Y
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
' ~, b& q9 m9 D4 Q) ^$ T  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);" c4 @5 {" m; T! [' S
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
# B: ?- V' ?9 o9 ]9 V! \}7 g0 c! i1 p0 r! j
void GPIO_Configuration()8 q" G, ^- Y( V( |$ K% Z/ g; ^
{  GPIO_InitTypeDef GPIO_InitStructure;  Q+ X9 W) e8 u% U
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
- q0 V% V" ^9 e, T* K$ U4 b; w( m  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
' c8 r+ A2 m& |8 z0 z2 x5 S9 m  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;- S- {- q7 V. c
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;, S2 \# \) z1 o8 N
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
# q) _5 S. y& O8 c8 I  l  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);. c  P$ |# n( F5 n! U
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
* k3 l- W9 A+ N7 R5 s  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;( m, I& X9 @; Y. z
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;4 @- B: ?- n5 j5 \; n
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
. M7 L4 {! \' l' y+ b9 ~% @1 o  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
8 N2 [* N9 f$ x, ]7 w. D( C7 c- M6 t: A1 C' B  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
( [, Q# T" ^5 n( |; ?. W4 [4 J6 k  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
4 p8 E+ `5 S* f% W7 y) \( F; q. W  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
) ^# q) g; ?+ O( C; c}
+ S( q& R* V6 _* Z2 pvoid SPI_Configuration()
9 u; V/ J4 P8 U; l9 {{  SPI_InitTypeDef SPI_InitStructure;
% c2 q/ \9 X: g  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
3 h  \6 y% i! G2 @# a% j" q  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);1 e- m3 n3 V* e$ T: a6 Y5 O
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
/ ]) A* O9 @( h   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);: `: a. e0 g, U+ \: _, m
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);8 O7 M" O" _& T2 |
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);* e3 e1 p8 m1 b- Q4 ], O: M
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;2 v" f* J! G6 a- `7 M
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;8 M- J# E* I. F  a2 n, ?6 G! W
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
2 `- F5 R7 A+ D5 |6 R' `/ b  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
9 I4 L& _$ C& c7 [/ B/ D  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
+ X8 I/ Z. ~. R: U  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;" G1 E* N9 B+ R2 C; w7 L
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;) o! g5 @# }  L8 U( [% y/ `
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;$ G3 O1 l* I' [( }7 }. A* M7 ~& f$ }
  SPI_Init(SPI1, &amp;SPI_InitStructure);
  Q- X4 W" ?- @5 O8 F- F1 W  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;  R( D. v1 ^0 @4 y
   SPI_Init(SPI2, &amp;SPI_InitStructure);
1 T  M  y- L) M$ d& L2 m# T* R& I) |   SPI_Cmd(SPI1,ENABLE);4 d9 }# c5 P! d" H
   SPI_Cmd(SPI2,ENABLE); + W% `% ^! K* o+ w
}6 p3 ]3 C  ~: x4 h. T' V; _
void Delay(int nCount)4 l- [0 H8 s/ ^( }
{ int c1=nCount;! u8 F/ e* m! z. ]- z4 t; C" b/ o+ v1 Y
 int c2=nCount;
. K) U; n  i- X" b* O/ s% C for(;c1&gt;0;c1--)% w0 S; J- G8 I6 q7 Q! d
  {- k( z; j( R1 f( I2 z5 b
  for(;c2&gt;0;c2--);
8 F. [8 l! T1 T+ f. P3 x" C };
' a7 L7 U' `) A9 Q% E, J}2 j4 s" o9 I; b) O
先谢谢了~~
5 ?8 n7 U7 g/ j: t+ Q 
/ A) J+ |; r1 E. f. T7 `2 n
, E) u) D( ~0 d( [6 n- U7 N& R楼上的问题,看我帖子给出的提示哦~
lkl0305 回答时间:2014-1-24 09:53:43

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

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

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

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

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

回复第 5 楼 于2014-02-14 11:37:16发表:6 J5 s. M: a+ ~0 L4 s- x  J" N
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。2 B9 k" n# J' e7 B# A6 Y
 
4 t2 }3 V1 |, p' t
! j& L- w* U5 |( r; z3 o; `% T多谢支持!!
abner88 回答时间:2014-3-9 13:43:20

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

ST社区做的确实很好 版块引导很好 资料分区也好
stm32f103vc 回答时间:2014-4-3 18:52:58

RE:【ST工程师 MCU实战经验30篇】之USB接口易损坏

非常好的帖子,希望可以及时汇总更新,收藏了
renqinglei 回答时间:2014-4-4 18:00:50

回复:【ST工程师 MCU实战经验30篇】之USB接口易损坏

非常不错哦,支持下
renqinglei 回答时间:2014-4-4 18:00:51

回复:【ST工程师 MCU实战经验30篇】之USB接口易损坏

非常不错哦,支持下
Jack·Owen 回答时间:2014-4-13 08:09:50

RE:【ST工程师 MCU实战经验30篇】之鬼魅一样的Hard Fault

都是精品。大大的支持
gougouyx 回答时间:2014-4-16 14:40:33

RE:【ST工程师 MCU实战经验50篇】之鬼魅一样的Hard Fault

谢谢汇总,
anan555 回答时间:2014-5-7 17:49:29

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

  
% _0 p8 R: i( G鬼魅一样的Hard Fault
5 m& m6 X$ W! p/ e, V 4 `8 `" R9 b) p" j4 I- q, R- p
该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。( @: k3 u/ ]' L: r5 Q% l: S4 M* r+ y
 0 k9 k: v' G' s1 {6 h) ?
咋解决?
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 手机版