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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表0 X6 L5 g+ p( z. m  j! c% f

; P  P& s3 y  t9 k4 @: u- X6 f
- i: a; _+ @  u* F$ M1 |. P社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
2 z9 l, W$ q& L8 D% H # C% T; m+ L1 s4 r' H
提示:点击各主题,进入帖子,可下载ST工程师解答详请( v, Y7 J' r& N, u; C7 B' n2 ]
( X  j0 }% t. d) b, v& v+ Y% J, j4 j8 b

  T' a% s3 y/ ^4 ~. k一、通信接口1 p' H! M+ V5 B. ]

1 t7 E9 l7 y! W$ G+ B1. STM32F2x7_Ethernet(FreeRTOS)驱动更新
: Z1 u; ~" T/ @ & Z: g0 H8 {( f" G3 ~
2. SPI 接口发片选信号导致死机
$ T1 B% b6 X% U' S
1 c, q; o' M, Y5 N6 ]+ P3. USART1不能设定600BPS的波特率
  X4 L# c- Q2 |) i9 D7 F$ ~ 0 U* V' L8 r$ n0 a7 |8 l: U# W& l& \
4. I2C 接口进入 Busy 状态不能退出
; i" L4 e5 y) R) B# H
& h" }2 ~( }6 n5 s" Z5. 对 Flash操作导致 USARTU接收丢数据6 p" }) x( U7 e) G9 h3 h' }

5 v( O: R  g! e4 e$ j% j6. USB接口易损坏7 o- R  F8 t5 a+ n7 ?9 ?3 h1 _# @
$ i7 }, y, n2 q0 S2 D, ~4 O
7. UART发送数据丢失最后一个字节( L3 Y, l* g* j6 O- R) y( O

* D% B! {4 r2 c& n+ C; S8 q8. 使用 CCM 导致以太网通信失败
: I. d, A( ~: N7 ]0 ~ , d7 n" b0 G$ h, c5 P5 u
9. SPI3 接口没有信号送出6 H1 H) p0 _( j6 h$ W3 A
- E5 _$ q. a/ j- ~$ R
10. 时钟延展导致 I2C 通信不可靠
& F9 r, b! F* B: {) t8 ~
0 Q9 C+ Y  v1 Y5 g" x" ?" g' ?11. M0的USART波特率自动识别问题4 X, E  L$ Z' s4 a  Z
! O' E2 v9 _. R' u$ q3 I8 \, ^
12. WK15 OTG做U盘主机兼容性提高0 ?9 ]9 m1 `3 s( n# F

5 D( H6 l3 c: T0 x/ _" ~. _% G13. 以太网电路设计注意事项
/ o- D% m# a$ w  A% _$ o - O" j" S& k. ^
14. OUG主机库在BULK传输上对NAK的处理, M: Q: r% X1 o: U+ [) p1 X

7 d8 C0 b) ?3 i15. 串口断帧检测$ z4 w: M( H7 H4 S

0 C1 `0 k  m  j( {, `' h16. VCP例程用于数据传输时丢失数据的处理, K) j" m* v* n
: Z7 F5 q  @, P' O0 d- v
17. STM8L051F3P6串口UART数据起始位判断的问题( P' }( O/ A- `1 Y; n
0 F5 i' }( G: u5 ^% x7 a
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号
, }2 C2 j5 l9 w% x! C! K" ~9 ^
* Q4 N% f9 Z/ P/ k1 l19. STM8中UART奇偶校验的使用方法) [$ H3 @( e7 ?$ Y& }

1 h. k% Y0 @' Z+ D8 t9 E' }20. STM32以太网硬件设计——PHY& U0 I$ p3 F8 u
) o% q+ D1 s/ A1 {  v
21. 一个判断I2C总线通信异常原因的方法! i/ T# v/ Q. S! W
3 W, h' ?) z4 H
22. USB device库使用说明4 ~% z3 G$ W/ N
4 j  F1 I0 y# B& |  W- h$ q. \
23. STM32F103上USB的端点资源- {: ?4 P) T$ H: \( K

) Y5 K+ I2 b  L( w3 @24. 使用CubeMX生成TCPEchoServer程序
/ j7 C/ r# Z3 y8 u: @( T9 w7 f% {. y0 Y: k6 z
25. SPI接收数据移位
5 J! }6 l2 H- Z# c 9 `0 d/ I+ {" d
26. STM32F0中Guard Time的设置
+ m+ b, k2 l; ?; g% t6 [/ h9 A$ X* s7 d' e
27. LwIP内存配置
$ c# L8 a; U8 w- |! u9 f7 a" u. C6 o% k* e
28. STM32 USB Device的简易验证方法- L6 P& V$ p+ ^  j+ \

/ u- _$ }/ T1 }5 I) f29. USART 中断方式接收无响应问题的一种情况及其处理方法
6 F! B3 z2 Y) }, m2 {0 E0 ?$ U, k( o8 S7 A2 S
30. STM32 基于 Nucleo板 CAN总线的建立
! h7 w( n- V; e5 p
0 T. `! o5 K2 N( K6 X3 v2 X31. STM8 CAN总线的IdMask模式的讲解
- c8 U5 ]3 w  j8 \4 W9 u( U. E( A3 \4 `" j2 A8 p" S
32. STM32F746ZG USB 驱动不正常
! W! {: _2 Q9 R$ N6 A- B" o' f; I0 @2 n2 B- v/ Z
33. MCU在STOP状态下通过UART唤醒分析 " W4 ?) w8 p: t. \% D

  t! m( \6 G1 T34. 通过STM32CubeMX生成HID双向通讯工程
% E3 u8 y6 `6 p0 E
8 j% h' Z8 g: I35. 串口工作在DMA模式下有时接收异常
/ i5 o: O3 s: s* G. U% u7 U6 f4 x, L4 d! r, Z
36. STM32 Bootloader中 DFU使用限制: x4 z, K& D! h4 U6 a7 h, X

) Y& o8 S7 B* m# m# S- Z6 u37. UART异常错误分析
( v+ O' s  x" |/ y9 b& H1 K' l. Q) _0 J: n* x/ C/ v
38. 基于Cube库无法检测CAN2的接收中断 8 {# A( T5 a7 [: t
& [6 i. c+ ?$ ~3 A* Z4 K
39. 基于STM32F7的网络时间同步客户端实现   M& y  \  j  \8 k2 l' Q% w" c

4 v. P, f- L7 Z40. HID与音频冲突问题 % g' Y0 F$ w) L6 C) L" v1 q8 E8 l

( N% {% ^9 P! r% H: ^& j8 H8 Q41. 在进行USB CDC类开发时,无法发送64整数倍的数据1 @/ I6 B: n: A. g3 W
) j. }% G5 e* N0 E7 u
42. 从零开始使用CubeMX创建以太网工程  i4 F& ?+ j: r4 }

& k1 u1 p# ]1 v& h$ T, b7 J8 ~9 |( h43. STM32F4xxx的I2C总线挂起异常处理
2 R0 b) O5 g2 U& s/ o# |4 B3 f* n' D9 Q1 o* r: X' W- V
44. LPUART唤醒STOP MODE下的MCU
- z% Z; R0 W) j/ K$ y) e0 b' A* `3 K. t: A2 u! C. x- j. R" h
45. STM32系列 MCU模拟双盘符 U盘的应用9 [* t+ A! b3 F' s$ X! G2 H; o8 f% o
, ?6 L0 x0 d7 K
46. CEC输出的数据和数据长度始终不匹配
5 X8 B3 S3 X6 I/ ~! \8 R% {7 ?" B# |! D
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析1 t* _" e4 \; e

3 Q( r7 e4 B9 d& Z48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)2 q4 B  x+ X! y) r! D

7 L* w; {1 B; _49. 增加UART接口应用时的异常分析. ]" Z: D+ q( N+ V" U

' m. m5 N8 w- ?50.UART应用异常案例分析
- {4 B; z, g7 @5 w) @. s: y
1 m$ ]6 B& J' u- e! T51. I2C配置顺序引发的异常案例
% G1 }6 a+ |/ Q
, M- i( x% a+ V5 E" x  H# }8 |: {52. STM32 USBD VBUS GPIO
+ ], T; u# A2 g6 ~, Z3 r6 x& M* g* b2 S. `: {8 Q1 O
53. USB传输数据时出现卡顿现象
. Q5 `8 g) O# s; g* j( [1 [6 n9 L1 V' v1 `6 \' h
54. STM32的高速USB信号质量测试实现
: R) Z3 e) j+ v
5 }, N6 F3 j  G, x& x) L; j2 e# w9 ?55. 基于STM32 I2S的音频应用开发介绍1 E0 j, Y% F1 _$ E! V; X3 O

- w4 X0 [0 V$ J2 {! r( `56. HID_CDC复合设备在WIN10的识别问题  
3 Q4 K4 J3 h0 B- u8 r
: q3 p- c) C. p' c1 S57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  5 N" J! h8 O. I
2 D# f( O7 S# \+ P5 `
58. 一个关于LPUART输出异常的问题分享  : h4 y) D) D& `  r" O* a8 q, W6 @

# M+ F9 {' S% `0 B59.通过 DfuSe 工具控制程序跳进 DFU 模式
0 Y8 _+ }/ a( r- n# I
3 H( z: i: A+ O3 b6 Z
60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
7 w% a: f. w; r: p" C) e4 ?# @  l
" v5 n( C4 Z, _4 M, A5 L5 u
61.一个因初始化顺序而导致异常的话题 (2019.12.24)0 t( W- n! |# }& Y2 Q
" U1 {, w4 U- J/ f2 `: h% j
62.MC SDK 5.x 中增加位置环 (2020.5.29)2 H# x( U" a/ z. c

( i% o. p& o9 g$ q; b3 |6 d7 `63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
2 G7 @3 W. L6 @: E
! ?3 m* k) p6 q( H* k: q64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)$ d- q7 V) x9 h

' M% N+ @+ {; P0 e0 ?& Q0 D二、电源与复位/ r5 d6 S# R, \/ B. b1 [

  C6 V5 d! z' O6 F8 h: L1. Vbat管脚上的怪现象
8 o: V$ d) |6 A) Z
1 M, p+ W5 o0 Q9 ?2. 上电缓慢导致复位不良, l: [1 T, p0 p6 K$ B1 m
3 {2 U# p% B) k5 t8 e
3. 关闭电源还在运行* G6 C) t" v: ~$ Y- W5 N1 \. e

* `+ F/ \1 a. |3 R( W; F4. 使用STM32 实现锂电充电器* d6 u9 U9 _) p( ]
; P: z/ {( n; |7 ~4 V/ E8 B
5. STM8L152 IDD电流测量4 K+ G& q1 a; P# W

6 u. _1 }; K3 ^: \. e1 |8 v6. STM8连续复位问题* F, f4 p5 @* U% O; ^7 J
# r' \) M7 B6 I1 A2 ?
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
" _6 ?2 X, J9 z. S: z
+ @3 p6 h  }# c5 V4 S: a8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流9 c5 |! o6 w- m( N

" }0 S; I' g4 X7 o+ V- q/ S' Q4 M9. STM32F7与STM32F4的复位序列比较2 i0 I- P. K; T, e$ S- H# E. b
+ A9 O: z; J, [0 Q2 f  D
10. STM32F107 复位标志问题
- H9 X. P; [& g9 j) W# U: L( {; T3 S+ @3 @
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  3 S9 B/ o% d0 u+ U$ L! w
9 c* S  O4 H* \! d1 B: b4 Z
12. Nucleo_L053不上电也能运行
6 V% A: ~% t) B: x7 B+ \
% w$ M, @3 J6 H/ n/ @13. STM32L4中STOP2模式下的漏电流1 S1 U; n( W0 S/ i

4 g+ }4 d$ Q' T+ d) ]2 }14. 在没有外置晶振时HSE_RDY异常置位. d& F) O% u! V4 q

/ l; ?4 @( H4 u* k  s15. FLASH被异常改写   (2018.5更新)
7 u8 l3 S0 u4 s4 ?. K# \: S% u8 ^8 V: N% Q
16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)2 m) }1 {, p7 o5 n% @0 X# b

! ]4 m/ ?* c( ?; [- t, n1 g17.一个 STM32 芯片异常复位之案例分析(2020·2.27)
$ N+ F( @% ^. a
  X! @1 K" T. x( |三、IAP和Bootloader& q9 _3 r7 M3 r6 b2 e3 P8 n8 M
; l4 E! \: a: G. c) A
1. Boot Loader与上位机通信不稳定( h, C2 B2 _, R, f& u- X
* l; A! L: C% Z- `! H
2. IAP+APP 模式下不能启动 RTOS5 e0 H3 F: u5 F5 j6 {

5 G! A/ H8 d8 }' q" m+ r- h3. 从 IAP Loader 向 App 跳转不可靠& {% N( u  u" c2 v& A3 T
. Q# D) T, H& t" Q9 V; G) E
4. STM32 MCU IAP例程跳转到APP代码简要分析7 C9 y, i7 \4 f
6 l! o% G2 f+ o# o
5. STM32F091从自举程序向应用程序跳转的问题与解决
1 G& V. z2 G1 h; G3 b7 `# M5 h. s; K! i* Z
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
2 c  W9 v$ l- T! X9 U/ e7 |) t+ f7 \1 t* ~" _
7. STM32F0启动模式相关问题探讨
! S% B9 L( y) C) b3 w  n4 _) l3 K/ h: n' z& O$ w' r) \
8.STM32F091空片使用System Bootloader下载代码
$ F$ G* R& g! n+ W7 m+ w# S, O! @4 C4 g) X5 A/ _* P- w$ y/ N
9.STM8L  IAP 应用程序中编程指导: Q3 m- S) T0 \8 b  E) h! z  [9 b

6 ?) Z/ n% f% I, W) d10. 如何通过STM32的串口实现简易脱机编程器
( L7 F# o- K. L' S' W5 ~1 v, S% a5 h0 e
11. 一种从用户代码调用系统存储器中Bootloader 的方法  . j2 e1 F! r3 ?9 n  \2 P$ k

# e  P* E2 j0 e+ {+ j1 T12. 利用 USB DFU实现 IAP功能
4 R9 d# D4 d1 r: o2 X* _
  P0 E8 E0 f% x) N2 r/ q13. STM32 Bootloader中 DFU使用限制% Y% [7 A8 \* W2 y8 V
+ R, x1 X& F! h. M$ `* }, C3 [9 O- K
14. STM32L011x和STM32L021x启动模式注意事项
2 U. B$ n: v# Q4 W! [/ f, {/ |5 M" I/ x# n3 r! q( \* a$ D9 X% t
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
) _8 O  A. k' `+ ^0 @# @
& D) Y& T" l, n16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级 1 i3 P3 L* L3 F' P+ H+ |* o

: R+ e) }1 q0 X7 f' Q0 s$ _9 E( P17. 如何使用STM32NUCLEO 板来测试串口Bootloader
3 m. ^, n6 H% D! |  L  ]. \) O2 ~. e0 T5 r4 Y5 C  [
18. 在STM32L011上通过I2C接口实现IAP' b# K/ @0 b7 @, w% ?4 P
% m" q( I, S2 K* v
19. 在IAR中实现通过将程序在SRAM中调试的方法
; s% Z- p8 u# W' T3 `8 N) W3 I. u8 ^/ J- ]! Q
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
# |  k. e6 V6 Y" M/ ]& L
! r# X* Z6 z: a7 J5 f21. USB DFU IAP 例程移植的两个话题- g# T: L! ~8 l4 F# S) ?% V

2 o$ B6 @$ _: U) y" g- n8 a4 m, Z1 B. z22. STM32F769双bank启动1 G$ }( l$ N+ \0 l. F# p
- i" q% h. O5 t8 g1 m2 J) s
23. DFU加载 工具 DfuSeCommand的使用
" z8 p7 ~) P/ u: J! a" p; }
& k7 h5 a, s9 Y24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
" @& p6 f5 S% q3 j- x) Y  N4 t
6 w- [0 i5 \0 ~% l$ _25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新): j% @: U8 ]& q7 r: K+ P2 Z, X$ q, x
3 @3 z1 A% e$ s5 M* @* }1 [
26.STM32 Bootloader异常复位案例(2019.4)
" q0 X/ H' c! `5 n0 m! ^! {
& @1 ]6 w! Q* S" C! }. y  R. p0 D
四、存储器
$ M  _" I  t/ c3 c - `2 J3 g+ N5 m  ]- y8 B
1. 对 Flash操作导致 USARTU接收丢数据
; {3 ^  D( y$ M5 K# c
# ^/ f1 G5 h  l5 I# s2. 使用外部 SRAM 导致死机
2 Z2 H: c2 {, y+ N0 p9 \! M
# D+ T3 f% L' x7 B4 C6 T7 ]3. SRAM 中的数据丢失( H. d  ]& B# R8 N1 G

5 C) V' `' [9 J4. 干扰环境下 Flash 数据丢失
% ]! I1 ?  A  G- T6 J 3 s" Y0 n( W7 Y% j0 _1 q+ ~
5. 使用 CCM 导致以太网通信失败
+ X; V( q( X, R, R : l% u- T/ M$ t! L
6. STM32F429使用外扩SDRAM运行程序的方法
8 P. a! U3 E2 z* ]- d1 F4 M 5 F" _  |  h" d8 \  [
7. 使用STVP实现对STM32L1系列EEPROM预置数据
$ s; ?  Q1 X, Y5 M' d$ W
7 J2 I  t/ K. W8 t* G8. FreeRTOS RAM使用情况及优化方法
  S5 b6 k6 S/ m8 b$ w  ^% |1 P5 L/ I% W7 E7 n
9. 在IAR 6.5下如何将数据存放至flash中
: ~5 J: y' U" w: k& g+ r. u- G5 ~9 @1 m3 u# S' x
10. IAR下如何让程序在RAM中运行
$ f& F6 Z% r1 k( U. V8 b6 H
# N6 f2 Z9 X3 b6 j* `# C11. RAM上电后初始值问题
. N1 }# x5 T2 a+ m- h  y! q4 E. S
% [+ j# t( B: M7 O6 I. a' O& `12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计& u/ c2 i. p2 ^  ^

4 x" o) S' t, {: m' ^6 R8 d13. LwIP内存配置
4 r9 d+ ]/ R9 s) `9 h
' }/ P: v7 I9 Z: }' \14. STM32F2高低温死机问题8 A" f9 S; @" s
3 Q5 a, {& Y8 O* }
15. 使用STM32F427的CCM RAM时遇到的问题
$ i1 t/ r: p& z, W3 w/ L! e4 ~. k. c0 h; r6 L8 o; C# f
16. 利用QuadSPI外扩串行NOR Flash的实现  
8 \( y1 o: y* _  j2 ?/ {% i% X- ]/ z7 `) w% Z2 N
17. STM32擦除内部FLASH时间过长导致IWDG复位     
) U3 d8 P2 i+ t; ~5 T8 E3 t2 J7 q% J

! W, `: ^0 Q& S: ^, l$ I+ U18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)6 y* ]& y/ G- |. H7 L" Z) u
# J$ ^$ i2 c! V! \; _
五、模拟外设
/ d- f2 d' @+ b& \. y4 b
$ P, u1 Q5 g1 s6 ~2 T& i1. ADC对小信号的转换结果为零
$ ?# h9 c$ c" T8 G * z2 R) e9 D9 h) G$ n9 n; P
2. ADC键盘读不准
) `+ V7 e$ ^1 w5 L; C
. l3 y6 N3 s. j3. 扫描模式下 ADC 发生通道间串扰7 L! C, \9 x+ a6 h

! X" i  J* T+ g% i/ d4. DAC无法输出0V的问题分析解决; z/ o' c3 ]2 a- `

2 V  R* s  L/ J9 v" k+ q5 V5. DAC无法输出满量程电压的分析解决* {- G: _( ]& c

. a. J' d6 o( }  ~# _; C4 s2 O2 t6. STM32F30x 的ADC 采样的傅立叶变换
; _7 f; |" ]  P+ q8 O4 z0 [- t) Y+ T' V- y8 T
7. STM32 F1系列 DAC的示例详解
" H2 _# Q) K1 U; {+ S! k" Z$ W1 J) L6 G
8. ADC 连续模式采样浮空引脚问题
5 L# D$ |: A* c5 V! m( y( J1 g) [
9. PWM硬件间隔触发ADC 8 z  V* y9 X# v0 _) F

- U# }: _: r7 N10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC0 i, i% x6 K+ h& f5 u, R
+ A0 O( \) w2 o0 P4 U$ x
11. STM32L4 系列中ADC 通道配置上的区别  X$ U' {6 y# N% e

* T: M) c2 ]0 i3 h! v* {6 ]; T12. STM32 ADC模拟看门狗及其应用$ u2 P3 y% V8 |; @. W
4 T* ~3 M9 b8 Y. w% J* e: B! m9 L
13. STM32L053 comp2 比较电压无效问题 3 q! l8 c  h  c7 D# a9 x& E( N

5 @* N! i. e* k& x8 |9 y  D14. 运算放大器OPAMP在STM32L4上的应用* l% z% y  V& `+ a9 |# e3 N% s
4 }9 W' F; m3 q2 U7 @
15. STM32 OTA例程之ESP8266使用
' U) f4 p# p; Y, H7 q3 Q3 a6 k$ \; m& A9 n* s1 X( F
16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
/ F5 N7 C8 B0 N
6 ?5 _* n% E6 e4 c9 N$ @六、计数外设
6 c0 u! e9 y! D! d& _! W* s8 n# g; }
- F# {9 i, t: P# T% }1 q, B+ K& P1. Watch Dog 失效. J+ _/ B$ p8 U  o& ?6 V9 H

" p. U  y3 p& Y& p- J; x2. RTC计秒不均匀
7 h- Y8 @: c& X/ C4 t & ]7 D9 A, g# \/ z3 g
3. 软件启动模式导致 IWatchDog 失效
( p7 T: ]& H+ r / c6 j1 L# B! @
4. STM32F030R8 定时器移植问题
/ l% u2 B+ Y' A9 g! ]
8 L! B% e- g; e0 w, q1 e$ }5. STM32F0使用RTC Tamper的几个注意事项7 N9 p% v+ \  f: r
* a- M5 q+ \* O) d  M
6. STM32L053可控PWM脉冲方法之DMA+ e8 g. I- M1 F( ^, {

" Y* d+ K( k6 z- Z/ E7 Y# ^* X7. CounterMode,OCMode与OCPolarity关系$ n) m" {; P% T

, D) C3 s) n+ {3 o2 ~9 f8. STM32L053可控PWM脉冲方法之DMA
1 ?: T' m) a3 J2 x/ I* T! b: T  c& L9 z. O  Q) e
9. STM32F1通用定时器示例详解—TimeBase7 Y) j1 c( d+ v0 f2 N; M

' j$ C% p( X2 G- V10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals
' c" b0 E$ v, A6 r6 E# v" d/ g9 H6 z% w/ V& ~4 j  [8 A3 c* {1 I  g3 n
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生/ ?- Q% `* E4 U, u
: n) L3 z8 L4 S- f- H
12. HRTIMER的多种Fault事件联动机制
3 ~5 T) r1 j% v8 j * w7 x1 G" L7 a- n7 ?; v
13. STM32通用定时器 示例详解 —One Pulse1 W; I; g; J' |, ^- t

. H  Y* H' |9 f9 R: m' R) x6 s14. 如何用LSE校准STM32F4内部RC振荡器9 Z' m% J1 U, ^6 O4 M
1 |. w' B6 @  G! @4 u8 h$ A: N
15. 一种使用Timer测试HSI实际值的方法
$ c' B* D' ~' ?/ k, J) w; }5 ^) N% [9 e4 {0 T7 j5 o
16. FreeRTOS定时器精度研究$ e% B. }! u7 F" K, W& ^5 J/ P

3 M/ Y5 \2 n6 k" ?17. HRTIMER产生多相相移信号
8 L( w+ K! A( T2 Y* V/ \
' D5 \6 o$ G; Q- a" n9 i+ M18. 窗口看门狗启动时异常复位问题/ ]: x# \3 u" N8 P1 C, L9 e' Q& s

0 C, F6 U5 {8 s# Q# y- Q19. PWM硬件间隔触发ADC6 Q  x) ^2 v  _

% R! y2 o9 P  E$ G20. STM32F030低温下RTC不工作
" b" [: p6 z5 |- Q: h& I) `7 j. v  P7 {* f) |" `- g, i* X
21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   
- X9 I  L* W$ g4 I8 t* |
' Z4 f$ }/ F( J6 k0 z7 X22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
* }, _1 ^  g) U9 s" V8 h4 h' T- \- R7 \: {2 J) m0 N- f
23. 基于STM32定时器实现定制波形的示例 (2019·7·25)
4 B# L7 l- a5 W5 k
* a: t- }! h' G, {$ b$ b0 e24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
/ _- \" [: C6 k1 S5 t' j+ E' `
1 \) }3 w$ _- L, Q5 z
25.MC SDK 5.x 中增加位置环 (2020.3.31)
# H6 ^: i' E( i, s  \

' a) s1 P6 u' L1 L6 v$ W26.STM32高精度定时器PWM输出话题 (2020.4.29)# M  r) ]/ x. C. o# G

3 X  N0 b# v6 d' i: w' ?2 y' |

& ^7 n5 d2 `7 _1 N  \' @4 y( {5 w27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)* C7 x3 B) R! X% A" g" s, u0 k5 ~# Y
$ v+ q4 e% v9 V  G8 t
七、内核
9 ]0 }: s: b9 ^ ! ~& y3 J$ D8 i
1. 使用指针函数产生Hard Faul& L( U0 H5 @* |8 ^  T2 ^7 M
/ I' v; _. p3 i7 n
2. 调试器不能通过JTAG连接器件
2 P+ @8 g7 U5 @' R& L) k* \ & ~) ?) R* N- M+ ~
3. 鬼魅一样的Hard Fault
& u- I7 m. p! l9 M' Y ' T2 D0 W; Z: T7 a+ f9 h
4. 进入了已屏蔽的中断[
2 B$ W, O8 w& r, F/ R1 t) \: R 2 E) W. ~! j$ l, ?9 \4 M4 @" I
5. 浮点 DSP 运算效率不高
  o- Z7 U* S. @6 x4 N
0 X! A' M/ ?# M. a* G6. STM32上RTOS的中断管理
4 e4 d& u) Y7 q; Z4 [5 _% [8 f+ Q0 Q7 O6 y1 `3 Z$ ]
7. STM32F7与STM32F4的复位序列比较' H& `- Q+ z, ]2 y0 d4 t

  N" ~# b0 u; K4 @% q# e$ @+ @( y8. STM32F30x 的ADC 采样的傅立叶变换2 U5 h: f1 y- ?1 K8 x0 _! e

6 r' V' }  K+ j- p& v8 S9. EXTI重复配置两次导致误触发中断的问题
0 ~" E; S) E. B( M" U! o' g" _  l- T4 c7 ^7 l4 [" x9 A
10. STM32F3xx/STM32F4xx使用浮点开方指令
6 s4 l. b  m: T0 N  R8 q0 j. G- m+ H" H$ _% H
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响
+ w, t0 }8 e- f1 [4 X2 c/ o  F' `7 ]$ l, q3 A+ I
12. STM32F7 MPU Cache浅析  
7 I' V0 O* G9 K0 d$ y' O+ m$ f3 d6 S/ W3 `6 ?
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
6 r+ @  p* P  U* P

. X, H8 K" x2 G. G14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)
, g% Y4 \  d; Q4 {5 J

% ]3 `, z' u/ F6 w$ [4 F- U3 e$ z* z- P6 H4 S' f+ T! [2 o8 ?4 j8 w% ~
八、系统外设
1 r, w: [. x) \: e: @- g
5 ?1 {1 ~3 M" ~8 ?1. PCB 漏电引起 LSE 停振
6 j0 b0 O& a6 y8 q/ w% b - x% k, c3 Q& b* M+ }" J; h
2. 时钟失效后CPU还会正常运行
! d. |2 K# `5 h% T6 j 8 l. T8 `- u9 n8 {$ J. ^9 `. _  j
3. STM32F2中DMA的FIFO模式% E- O5 V  x: o5 L  u3 Q6 i' Z

4 I7 u" H3 Y' V5 y$ \  X4. STM32L053的GPIO翻转速度的测试
; a- Q9 C9 j/ F$ n9 C% l; J# e4 S" T; ]2 n! f; u4 @5 [! l0 t
5. STM32F4xx PCROP应用9 h7 k; w/ L: t4 r; d
9 \4 a) M1 k; d3 D4 n; \
6. STM32L053的GPIO翻转速度的测试. m7 [1 f8 @  g) c7 t# |) A( E

5 `; s8 N9 a( Y" S$ `$ T( X" [# V# s* r7. 如何在IAR中配置CRC参数8 A9 `. l, ~2 [$ u2 A$ y
$ G( g' n, b! y% f6 V
8. PCROP区域函数无法被调用的问题与解决/ Y4 o/ G9 G! ?8 N( }; T( L
" b' @: u! w8 Y
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
  S8 K0 i7 t# V9 n" J0 J8 P  z1 W4 z
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
+ n0 a! q4 F3 G0 e0 f/ L  k( v9 R' t) W
11. 如何用LSE校准STM32F4内部RC振荡器  @+ w; K4 I, K- ^

4 a7 x1 H3 ]! ?6 Q4 z12. EXTI重复配置两次导致误触发中断的问题  
9 T/ h" n: G7 g, V
  f5 \5 B  A( g% w/ ?13. 时钟安全系统的应用(LES篇)  6 C0 E% [+ Y* y
4 {$ Q) h# `- q9 P) Q# B
14. 利用DFSDM开发PDM麦克风应用介绍  
: `8 }& h% e, r

. y' Z! n" |2 f8 P+ {3 T15. STM32H7的FMC外设在DCACHE使能时运行不正常 9 Y3 D! o" k- R! r, I, u; z$ D
& Z6 I% x7 \( a( S' ?# z
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)) L8 A+ V* Y7 q: g

- D+ v* }- E8 U% u6 c# }
4 H# f, |) r) G4 q九、标签和收发器6 z/ E, j# H& i' I
) v: {  H' ?# L+ ]9 p5 m
1. CR95HF的初始化步骤
, \, I' N1 E+ D
( B% _' J  ]5 ?6 T! n  G; ^! N. v' s" v* ^8 _$ Q

/ l+ [5 m" l* i- [' r, x/ F十、生态系统8 {4 w5 t- k1 B7 Q! K
, Z- g9 W, ~/ n  `: m
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题% M: u9 D  v$ @, E' O( X: k
2 n& y0 f3 W6 r3 o# S
2. MDK Logic Analyzer 功能在STM32中的实现问题7 n4 O  W: y- F/ r8 L

0 ~3 @: |' B0 _/ ]- g6 c3. 在IAR6.5下如何将数据存放至flast中
( R( v% [( X4 j* I  g  u( H 0 [) k2 c7 L6 J( D% s
4. FatSL移植笔记) _3 T0 H6 A9 A' v, I
, [3 }7 T2 }7 Z8 t# E& K
5. Keil中使用STM32F4xx硬件浮点单元
) M, ?+ e: \! [* d: I0 p
, c4 R) ?4 N! S1 H- N, L2 L% R6 ?6. 如何生成库文件(MDK和IAR)4 {. H2 m. D1 u% b

7 J% d; j4 w$ o) `9 ^7. Nand Flash文件系统解决方案' i1 @5 t& @7 {# y7 P
. x# ]' B( U' B  s! ^
8. STVD在调试时弹出“Cannot access configuration database”的解决$ l8 @' y9 |2 {/ d

: D! ?( N. y/ @( V+ g2 b1 T# A9. RTOS低功耗特性的设计原理和实现" ^- \- @5 i3 p* D( l! G' n6 w
+ h8 \3 j  w# s0 ~, f. k( j
10. IAR下使用J-Trace进行指令跟踪( s: v$ }$ C9 ^" q4 i2 x
+ o  E) ~+ A" R8 o* M' Q5 W
11. STM32上RTOS的中断管理
. c, w8 `0 A! e- {& P+ V  K
5 b/ n: a9 U) N/ Z! C12. IAR下如何让程序在RAM中运行: Q; t6 u' J+ \+ h; a+ _

# i3 ^0 x& _0 f13. 如何在IAR中配置CRC参数
) I: J: A3 R' c
! `8 h+ t3 u. F$ N4 |14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册- X1 s! r( x  F  v, v8 a4 O8 {. h- |

- j0 i- }* ~- G$ {# v5 c15. 使用mbed进行STM32开发及STM32F0的时钟问题
# E4 y/ q( H& r* m" O1 N: _, ^4 C9 Y2 J* A3 ^; g0 p& r
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能2 b4 q5 b9 \+ Z/ l5 D- _" S
  F" L, }+ I$ [8 O0 V
17. 多任务系统中的不可重函数使用注意事项( H* Z3 @# O/ c2 Z

- Z- F( F9 R, v# |3 I, z# c( T18. STM32 utility的hot plug功能) w6 F, s) U) t

2 g; X- H) u( l$ w7 e) w; A) h19. 如何将CoreMark程序移植到STM32上+ t$ X1 l! W' f6 T# q% R7 ~. N6 z4 I

" s: \6 S* E# e8 s$ ^7 v20. FreeRTOS定时器精度研究6 p+ _* k1 D/ J8 n5 r/ R$ O: R

. z/ H& }" \) j! _" ]$ w1 {  z21. 如何使用Eclipse和GCC搭建STM32环境) C: f& \7 X/ [# ~7 G( C
1 @# N- ^5 Z+ B7 O- H4 s
22. 如何建立一个基于GIT的STM32库" @  k2 A5 @4 G+ A( l2 j
- Y; }. h/ H$ n: h5 R
23. 从零开始使用CubeMX创建以太网工程
7 I0 v, O$ E8 c; d/ U7 F7 W  ~6 L6 y5 e( }' Q
24.从STM32Cube库向标准外设库移植FatFs文件系统/ ?2 _' U: p6 O: v* n: e% n8 A

# F  Y0 q" Q- T- x2 I25. 基于 STemWin的屏幕旋转
1 I: |9 m7 t- X5 u7 C/ O" j. l, F: y" i* ^- Y8 @
26. 编译软件 Hex文件烧写
/ {! }% C: r+ i# `0 J$ ?% l
/ R6 `$ V/ a! k27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 ) `7 p2 L5 `' v; ?9 e0 W  P) z

9 v8 \: K" W2 s28. USB CDC类入门培训
  u! Z3 C4 a3 o4 _
& W+ C) i/ g/ H9 m! j1 t/ l6 H29. USB DFU培训 5 E' C; m# l0 O+ E
) j" P! Y5 D8 p5 s! G; _) k
30. 用于量产烧录的拼接Bin文件操作
, {7 s/ t0 i/ |+ P" r" J+ N3 e/ S  e5 z- G/ Z8 v
31. STM32免费开发环境该用谁9 B) r" c& a( l! ?6 l
" C* @/ g4 T/ J/ l" a
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
' \/ L7 S0 ?5 N! Q$ D# h: @( Q7 G1 O- U
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
2 j/ Y3 k+ ~( j2 i, O
- D) l8 m7 k% t6 T34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
8 g3 r% L7 z3 V# s; d! r# n0 W
2 P( v' i& ?; e. h8 T  I35. STM32 FOTA 例程之 cJSON使用   . m4 N6 @; I# M( N
% H3 ^% Z3 }! K3 |. J
36. STM32F769DK 云端固件升级例程使用说明
% {) j( g$ U, ]7 ~! G/ E
  j6 R! K2 S# n$ O6 w; m
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用   F8 S9 B- R$ Q
5 {2 l% z: j9 O, d) W0 d/ l
38. 基于 STM32 的阿里云物联网平台方案
$ ]3 _" t5 `$ Q$ w9 v& d: x8 H( C9 R) u1 h+ t
39.AliOS 任务上下文切换原理分析  
2 i4 Z* z3 s2 j8 x
+ N" g2 |% N8 B. \40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  6 K9 a& d0 ^9 X; t, p
+ _' g0 R/ Z; q5 `
41. STM32F769DK 云端固件升级例程软件开发文档  1 ?; X; G2 [1 y5 z  D5 `: ~) y
  d0 ~4 h. k  ~) h. ?
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)8 n* ^9 F% o  T

8 N3 ^: _4 r6 k1 z, v43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)5 I$ R0 X3 G: j8 d9 x6 @: F: e

3 ?: S9 S9 X/ i1 H44.零基础快速入手STM32MP1 (2019.9.19)& [, E4 p7 d; D" Y$ A- p9 U

* ^- l4 O0 _7 O$ d4 d& T% i: J" q45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)' ^# I! C9 W/ z( ]
4 m; D2 M+ Z' X* c  @2 P$ l. b) a
十一、调试
* G; G3 [9 U: L 5 x! m8 O! |: ?9 j2 y
1. 关于STM8S SWIM Error[30006]的分析
) n7 T% s0 l0 d0 |; l
8 R( p/ g. E9 R3 c' Y2. STVD在调试时弹出“Cannot access configuration database”的解决! g% q# C$ q+ Q4 c  M4 t
9 p% A- X& a2 e5 s8 a0 H" A
3. IAR下使用J-Trace进行指令跟踪6 L! |) m2 s$ r: [3 z

( I& {9 A# U- z8 A+ i! @4. 菊花链 JTAG STM320 Y" d8 ~/ o  K4 w

& y: x4 m: Z6 K2 f5. STM32F411CEUx 能下载程序但不能执行9 G2 s) P' _4 {% D

5 Q1 R# ]& d8 w+ w) [% p6. STM32F103C8T6 程序上电跑飞: I4 k5 C1 x  h- Z
) Q7 C# u/ f" E) l$ r' a6 H
7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
5 K% e9 W  T4 N& b+ J0 n4 h2 G5 l. M9 Z3 t2 U% L! X
8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
5 s2 d: ?- n' _8 e4 C2 f; F- M1 R  L0 G4 j; u- Q
9. SWIM协议的GPIO口模拟, S% |; b9 g2 m4 c1 ]5 _3 f
( Y4 V! Q7 O5 t. H8 W( o# f0 |
10. STM32F091空片使用ST-LINK烧写后复位不能运行用
2 h/ }" z8 |; Y& Q, u/ @: V# v/ }/ r+ U$ y9 v" S0 I3 U
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)
0 I3 k" B$ [$ W' e$ C- H4 X/ }0 b) j' m2 c5 p# e  l
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)
9 V6 ?* c% h( u4 I
6 J6 P0 f3 s" z13. X_Cube_ClassB代码移植 (2019.12.24)9 t- F3 i* ~/ ~7 ^3 l/ S
! e/ s7 K/ Z  [$ ?$ q# `" U2 O% S
4 c2 w: Z% L0 W# Q- J' b3 t0 P- ]! f
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)
; L  J+ ?% t& m* b9 ^) q. S, S8 |
十二、人机调试5 [( t1 C# I( y1 {% x

( y" s! l6 J" X, J" ?+ r4 P2 W1. 一步步使用STemWin在STM32上开发一个简单的应用
: E- V+ ^( R7 Z6 ?7 x) q
! W8 }2 S6 f) U3 _2 y8 z2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
0 t: E! P% d' O/ H8 i3 P0 A. o' F7 V  h* P6 f6 A- e9 I
3. GUI方案中ALPHA通道处理介绍
7 r# e, p$ G6 K
9 y+ |! m5 ~2 e" g/ C4. 基于FMC8080接口8位LCD的STemWin的移植0 E- X* @- B2 z! ?

, m6 J3 |9 P" B$ e9 W: ~( v" q5. TouchGFX中Callback模板实现原理 (2019·9·12更新)! W2 Q! M+ b0 Y% e$ O' c

& I: D! l2 @. z* N8 Y7 g# [6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)
* D) V3 l$ N& ^' t* y5 _
# x: ~1 @! Z+ e  H7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)* w, |5 R3 O7 H8 i; y1 v+ o

0 a% P9 u9 z$ x% @6 X8、STM32L5中如何关闭trustzone (2020.5.12)  i/ W0 Z6 Z. `. _

) _- G( e# S) [( G9 S; j十三、马达
6 e) K# M' W3 Y2 _( _
' d3 |- c: f5 \/ Y2 q* D% Z
1. 电机控制同步电角度测试说明
2 B: w9 E. L0 ~& O; p
3 Z+ x' q6 f2 j" ^* B- s) u$ C
& x! D' R7 b; U2 O% F6 C- D
9 |1 y- _8 Y6 U/ f4 x2 f十四、安全- a4 B; L& p; Q0 X# B

6 `' o  F  {0 X% e; o1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
: J* h2 r, {2 U: `& t/ H' D$ {2 X8 X" }% A4 W1 h5 \4 [5 S
) y# Y: J5 f  t: ~
十五、其他
2 B7 o% z% E. F
- `6 v0 }" ?# y6 J5 t) g! B8 t
1. 跳不出的 while 循环
& b6 f0 E7 n0 ?8 K, w2 q
5 }% H2 M; Y  a0 \" X2. 外部IC连接NRST导致MCU内部复位信号失效的问题3 x7 o4 z2 U' O% i: l1 u; e4 F1 P1 a5 v

! j* m2 M) `: G/ w5 n( e  {2 W3. 潮湿环境下不工作
/ C. Q* f; |' ] $ j5 w. u0 C9 V# o, c& }4 G
4. PCB 漏电引起 LSE 停振+ o0 W7 V7 g6 ~
* p  _, V/ T' {/ I
5. STM8L152 IDD电流测量
/ x3 ~/ U# k+ f4 a/ H8 E , K1 \* c7 Y- j8 Y
6. 使用STM32实现锂电池充电器
9 f1 {. G7 f* ^( H8 } ! O. q, p3 G! o$ H6 S+ k  V* ?
7. STM32_STM8硬件平台基本检查" d+ i4 l' ]. n" U7 r5 j: \
9 \. D1 `3 X) s
8. 验证STM32F401在STOP模式下的电流
! {8 }0 |8 e- f& e; \& s- x( w( X  A4 P/ z# f# E( d; B
9. P-NUCLEO-IHM001 电机开发板串口调试指南. ]6 C6 P0 Q: [5 t( u2 o
9 C$ t7 A% r3 q% p/ W, @& T& L9 j
10. 一种计算CPU使用率的方法及其实现原理4 q1 z' \. G; y0 |# n, @( t

2 x  S" P; u# J1 I8 ?11. STM32 RTC不更新原因分析
% `+ o3 n2 j7 G% }% C8 B; P* q% E( t4 ~5 O1 \9 e0 u  ~
12. 关于ST库函数的代码性能对比+ N  X5 I& J( {; |* w" m+ f, F# W
& U7 c4 s0 f' X; t; F  G4 G5 D
13. 在IAR中实现通过将程序在SRAM中调试的方法
+ Q! p, c& Q1 N$ H  e: B' r+ d. t0 x( ^: w6 b6 U7 G
14. M95xxx EEPROM写保护配置
! ?3 `  P' M8 h8 `7 ]$ T9 r! O5 p: K5 c3 y( a& S+ p: l
15. 4SRxx的GPO的属性* w6 \9 Q" @& h$ a
& t$ m! Q6 G- Q8 c2 T$ r7 r
16. CR95HF的初始化步骤 " r* q$ J& |  n* O' e/ {" G  m
/ d/ ]- F1 ^- n8 ]2 a
17. 电机控制同步电角度测试说明  
* [* R1 U# q+ p6 t7 a
9 V" c+ E# O$ B% f6 `18. STM32+BLE通过 Notification与 Android应用程序通信的例程
  ~- k( B/ {; B0 R, {: Z9 N  |8 S6 `3 s2 B4 B
19. M95xxx EEPROM介绍
8 _/ M: S) W6 a4 q+ `7 w( s0 P
+ d' O4 {% {' W7 b9 ?/ U20. STM32 DFSDM测量温度应用
: I) D3 S- B% d, C5 ]: Q! u& j5 e
21.代码实现PCROP清除
+ `$ q$ M3 i( b$ _4 B
: u0 `7 r  {$ ~, Z! e$ i7 i22. 理解与应用MPU的特权与用户模式
+ U+ V+ e4 }; q. S" @: o; N, j" w' Y( Q6 y. B
23. 用于电机控制单电阻采样PWM变形信号产生
: k% n# H! Z2 v! L4 j  o7 X! I
  z0 S( X. l' t1 j/ S24. STM32L低功耗模式唤醒时间测量
' {/ r! j$ V5 ~9 H' O2 q
2 ~7 \, @; V: \& _, g/ w0 }2 h6 ?25. X_CUBE_SPN7程序电机启动抖动问题
- x8 B! D2 ~6 x' m4 t
; J! z7 L) _* [% j3 J. ]26. 发现STM32防火墙的安全配置  A3 D3 a& `+ `9 a6 Z: |

6 N" c# T. T0 ]& ]! v8 o0 F) X27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
/ t. i" F, M/ L! i/ G5 j7 Y, `8 P3 `. p/ K- B
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
' q) i6 {8 e! }* Z5 W. ~3 H) |4 S! O! z% g' h" E
温馨提示:

0 ~/ Q9 O0 h- D
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
7 d9 C3 I& i7 s- [9 X
. e  e6 Z$ S$ z

9 M6 c8 e1 O1 C1 N) G+ \; W0 K! b2 @' N* m
) L% y% u  {7 z( l
/ d1 i' W+ C2 q
; h4 N7 t0 S$ M$ F1 _6 \

4 T0 I5 ~/ N% N0 O2 B
( x" W% Z- r9 e. G2 f
* \8 B8 I0 o4 v9 J0 C$ P5 f5 l6 H. a2 S3 c. d; D" t" U2 v, [

评分

参与人数 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
好详细,多谢分享
8 k# R( E; r0 Z# _& L. z& Z
5768340 回答时间:2018-1-13 14:42:54
HI  
" X% Z: P1 Y! Y) ^8 K6 j% k   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
. ^! Y9 j4 t, _  e; \: C9 E   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    ) j0 f; q( J! ]: t& z
  2. 函数名称:Cdfinger_Bspspi_init- g$ L$ @7 Z7 S9 K$ f, l: r7 w' ]
  3. 函数作用:spi初始化函数
    / F+ F) e& }$ }2 i/ p
  4. 备注:4 M4 e. I( Y5 j; c; v
  5. ******************************************/1 b% F* d" d; U0 `5 d# U
  6. void Cdfinger_Bspspi_init(void)/ f9 w2 v' W1 e3 [! _+ T: C
  7. {  @" k5 V2 P' o
  8.         GPIO_InitTypeDef GPIO_InitStructure;, O/ @8 v- `: Q, A2 j# Y. D
  9.         SPI_InitTypeDef  SPI_InitStructure;
    / G6 w  L9 w. M! N
  10.         DMA_InitTypeDef  DMA_InitStructure;
    ) B, w: r6 t6 m) v% ]. `
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    % u1 ^% X: }9 @) C3 {4 G. m" y( y
  12.   ' R0 o) z6 M. m
  13.         int ii =0;
    $ h. D5 o1 R1 E/ S% o( e3 a% h
  14.        
    0 |' k' l& R* l9 |5 K- u8 f
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);5 z( B% Y7 k, Z: G' o2 j
  16.         /*!< Enable SPI2 clocks */
    : q, G  k5 d2 ?& `  @& V
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);5 [. i' F9 e' T' H
  18.         /*!< Enable GPIO clocks */
    8 Z& M. |8 p6 n7 M9 t6 Y7 Q7 i3 a
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    : |, E; \2 Y( o! ?
  20.         /*!< Connect SPI pins to AF5 */8 B% M8 T6 m! I: ?7 V& f# f% `2 d
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);. e; \4 q+ {" h" t9 U
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);* P+ ^7 u, L6 _3 u
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);+ e# i! C5 q& N+ t

  24. 2 Q1 e- x! b$ o/ I, V3 F
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    9 q3 A1 F) h- Q% y! w; n
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 D) }6 L8 b% N. c" k5 ^$ R
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ( w, \) a; Y5 L* G8 X8 E+ c; d2 b
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;- F5 Z/ C$ G' I
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;# y7 d% B  b+ v) |7 W( b& R5 ^
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);$ r. p- A# ^1 c, m  E
  31. 9 ?3 u3 X/ j: @( M
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    $ U6 B, L, Y$ E* p* d
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    7 I0 f' O3 u& G5 P2 q- O+ b
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    2 R3 J  G1 U5 |0 [) Y& v! p
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    0 d8 s/ U5 W4 U' l) ]- V2 x
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;. H2 j! Q! \+ ?) F7 I
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);2 J' e) I5 T+ Y& U5 }
  38.         Cdfinger_BspCs_HIGH();: h" l6 A' s$ v- n( f3 }$ S2 x% u5 d
  39.         //Cdfinger_Bspdelay_ms(1);! [# g9 L7 j. n% @  Y
  40.   //Cdfinger_BspCs_LOW();
    9 p- [* `. F4 Q6 B" a& [3 ]
  41.         SPI_Cmd(SPI2,DISABLE);& R/ l9 H( ?. O- Z
  42.         SPI_DeInit(SPI2);
    ' q; \! \- I1 B" H
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;# y+ w) s7 X) m: w) b# q: n' B$ Q
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;5 Q8 N) E8 v( a; k( Y0 [
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;/ V3 _7 n8 _9 M! e$ ?; G, n5 Z# m
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;: o. n* N  ]' q2 u' o
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    % K6 L: S) r8 \  X
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;0 t0 T9 z  I5 ~* g! b( W
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;7 l, d2 G  {' z8 p' X( a+ v( [
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;6 V4 l, a5 d2 f$ F
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;; P+ w/ o- h. T& y$ v* o( s
  52.         SPI_Init(SPI2, &SPI_InitStructure);) i, o9 s# r% S6 p# v

  53. % ^# a4 F) Q# f6 {8 p+ R# r  k9 z& |
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    & K" }( P# t1 M" Q
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/0 d7 W  Z0 N  N& Z
  56.         DMA_DeInit(DMA1_Stream4);
    6 h, S8 @+ p+ M: E+ E* r  d4 H! Y. J
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;2 G0 D( d" t5 A0 I8 O  R
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);0 [) y, ?; p( w! K: o- V% ?9 a
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];& P+ K# E  \2 \9 `7 c
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    $ r. t3 c+ L5 s8 G
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    1 j) ?; T2 K$ U" N* t
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;9 f9 y$ r4 @1 |" w
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;+ c1 {  \! I2 m# a1 _
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      O$ |$ Q1 i4 N, q
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    6 w5 x3 J& ]* r+ B: l) U6 {0 M
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    * i: y5 Y# a; v; G  m* N
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;  |2 L" |- w! b$ }- \- L' M! H1 ?' `1 J3 @
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    4 }1 A! a/ T1 n, V
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;# f) S* X! v1 O0 W
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;/ h/ \! a8 I0 e3 l  ~8 U  J0 z
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;  B! E( j0 n1 R# t
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    ) T' P9 _$ D# a& o
  73.   
    + M# q1 E8 u0 e. O1 L2 J) A. p
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/5 l! n; M! q4 V7 j# ?" O2 K5 E  u
  75.         DMA_DeInit(DMA1_Stream3);* r9 M( b3 z& U5 J2 C# _6 j7 K
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;( J( ^6 |, @, M
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);5 s+ V2 M9 w7 v. ?" J
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    ; e( M- ^" |2 M  o& P, O9 x! a# Q; ^
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    4 S6 p' k3 g3 v  G3 [0 A
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;7 x7 |7 ~3 \3 t
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;* x& w& j( s$ [1 `: N8 n5 E- T
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;# C" q2 N/ K2 N$ L
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    ) A* |7 H7 e$ Y0 e3 S
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    4 @  ?% f2 F8 Q! l
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    6 c" H; q9 n& M6 k0 i
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    / k) k3 y+ t0 c( q
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    4 Z+ Z* I2 Q4 y% i/ C1 K
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;, l8 i! x8 _  i7 C( E# t! Z: o
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    4 W* L6 K8 f; Y! `3 L
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;6 E! I/ [3 w9 g* s4 @
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);3 O/ Q. ?; e8 ^* g+ r
  92.         //Cdfinger_BspCs_HIGH();) Z; \9 h" x( _. I" ?$ u
  93.        
    . x% ?0 V% h2 @/ y* v& G5 U& p

  94. 6 ^/ K6 J" r* Z; J  U* t
  95. * @5 `" n) d, A4 k! {; A$ b- {
  96.         //发送中断7 c. |8 Z2 I/ q* A, W' }$ Q
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    . u1 I* Q3 |4 J  R
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    6 q" M* ]( l* g2 [" f0 |6 p
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    ( C7 c1 F' Q0 j4 x( c( \
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    6 S7 }, H% W. W. k7 [. [9 q( }
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      Z9 a8 S2 V0 b# G8 `( R
  102.         NVIC_Init(&NVIC_InitStructure);
    5 u! w' H/ j3 m" |8 l
  103.        
    5 k9 J; ]0 z$ c
  104.         //接收中断
    $ {, q- Q; s! y# }
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
      d- [2 y! w& c, P" U3 ]3 w
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     . V  O9 Z1 ^9 ]; k4 u
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    1 Y; a% B, D9 z# {; a
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    ! ?7 g0 N% f/ m* ~; T" }4 `
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;8 s0 Z/ g1 j4 C
  110.         NVIC_Init(&NVIC_InitStructure);
    8 x' X8 `; ~( U) q1 g% h
  111.         SPI_TIModeCmd(SPI2,ENABLE);" [4 N6 y$ W# m- F3 H5 @, x
  112.         SPI_Cmd(SPI2, ENABLE);& o9 f5 H. Y3 @# l/ _
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);- i3 y# q- [% \0 t$ s- S
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    5 b) o! ~, L" f; @8 b# Z/ W

  115. 9 ~+ o2 b* Z) d$ Z" M3 l
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    5 I3 {& R" F6 T. }! m& h* B
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);! y8 ]7 R5 V) u
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);5 Q1 ~# r: W5 c" e' T$ {2 L

  119. 4 Q5 K  F9 q- Q; o$ _
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    7 f+ |; d! E4 n7 i
  121.         {
    ; H; z7 K& s; Y$ i9 ?7 C
  122.           if(ii%8==0)# y! @5 H% W6 b2 s% i& W: i) \) B
  123.                 {6 l6 p8 j7 Z, [6 R0 }
  124.                                 printf("\r\n");  ~; C' F% R, x
  125.                 }
    " G/ y' F) k" M& F
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);+ y( \* N# N, Q' e* W
  127.         }
    # c( |, }7 a9 G2 T
  128.         printf("111\r\n");
    6 K/ i6 _2 t7 W' t& y
  129. }
    ( M5 f% {2 q1 F( a
  130. / U/ v- i, x0 n3 n; Q
  131. - Y# K# \# u8 c* k0 K' i
  132. void DMA1_Stream4_IRQHandler(void)7 `! h, ^. w  M, e, L6 }
  133. {7 L* p) S7 g7 `# Y3 u: e
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)7 s9 ], ^7 K- p
  135.   {" Y7 u$ v: |, `) _7 C7 P6 `- W$ `
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));" r" n) ~4 ?/ w, r9 ]
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);! H) Y+ N# V0 J5 y- n8 P" L; }# h
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);! t' }* I$ A+ }# p( J1 W  w1 @8 H
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    6 h, g1 y( q& ]" H; r
  140.   }
    5 {5 J! |2 c# o& Q
  141. }5 v6 Q; \% y3 [6 q5 B2 ?+ O9 N
  142. " E, R* g! ~0 o4 |
  143. void DMA1_Stream3_IRQHandler(void)
    , U$ I# C7 |% O3 p% C2 Q
  144. {
    " ~# o- U% f+ a, v
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)/ I, Y% u0 l. u8 j. E  [$ F
  146.   {5 F* M8 }9 C! f1 |/ @" E$ I5 x
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    & w  u- M! c& n/ ?
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    ! @( ^' V5 l0 o+ I( S
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    % e4 [% P& ?; M! c* E
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    0 \' a( j. g  g1 @6 \
  151.   }
    " [! h6 V: Y' @( C
  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的波特率是不是必须为相同的,才能正确通信
& a5 l( n! l' P" G; j0 ~1 v# }7 U* H以下是全部代码:5 |7 B8 W% k1 P5 d/ Z2 c! n, I
#include&quot;stm32F4xx.h&quot;- d/ h8 w1 d* x) y- a6 S2 H  L
void RCC_Configuration(void);  e0 i7 n/ U; ~+ L
void GPIO_Configuration(void);
. f% R: D+ O7 q' b3 v/ kvoid SPI_Configuration(void);+ V- _) b9 U2 N6 B
void Delay(int nCount);9 G& b$ J. Z+ _# U7 r0 f& \( o
int main(void)
3 g$ M# T' a4 h5 a6 V1 Q{  RCC_Configuration();
1 z* L& X0 y; d. x# ?  GPIO_Configuration();. X0 F( i( o/ N3 Y0 U- V+ o9 v
  SPI_Configuration();% t+ @" M2 F* `  _+ E" q
 while(1)8 f2 O. [% L* S& L% n$ F1 }
 { int data=0;
# M0 O8 F; U2 ?3 ?5 n  SPI_SendData(SPI1,0x55);
3 }: Q; ~9 Z9 r! w  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
& S8 m. L% ?8 a& F0 f# c) {. v$ V  data=SPI_ReceiveData(SPI2);6 r7 `. {. P8 T& d% u
  if(data==0x55)- y" o6 w8 v4 r& e+ G
     {  while(1)( \& V" `$ O* k! q
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);) r3 M+ `+ }1 c% b
                Delay(0xfffff);% e' o& i. b3 j2 Y: `0 T
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);1 S+ {- M, |3 D5 I/ o( ]
                Delay(0xfffff);0 h+ r2 d! F; Q6 q# P
   6 K/ v, q* S# @5 Z% f6 w
             };0 _& O$ ?; A+ P( e& R, Q& g
     }
2 ]& g6 H. T  E" ]     else while(1)
" ^7 Y2 u! H' u* r* A! B8 {+ O            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);2 v# U5 ~1 p- S% L
               //Delay(0xfffff);$ C' g4 O& `6 t! z! h# U# O
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);6 w; i: [1 }8 S# c% \8 ]8 R
               //Delay(0xfffff);/ b/ s5 }$ |) }% E% T7 `3 q0 m
   1 [% {" e) x  J, O$ v7 a6 S
            };
2 O- W1 @8 d) T3 r) { }
$ b1 s: t5 T6 p1 K  R! _}3 \7 `, D# f& R' @
void RCC_Configuration()( o7 U; q4 f) Q* N& s
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
. k. s% E: O8 o) S7 y  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
; m* y% v% G3 \# [2 O% U  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   7 O7 f' m; Z. ^
}# o' R( @0 u& l7 j5 l& Q3 V8 I
void GPIO_Configuration()- w& \1 w3 ]8 h8 O4 I
{  GPIO_InitTypeDef GPIO_InitStructure;* S/ u6 W3 T+ b
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;, R$ z0 `) d- A6 u" b2 J7 s% }
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;' M+ q9 t, X$ F" }( @& _' i  \; j- E, Q
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
9 G) l5 y" }# ~+ M1 p8 ?  `' e/ m  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;1 Z9 B9 @8 I- a" Q% V0 B
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;9 C+ ^5 M0 s' K8 a" T. h
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);/ s9 i8 h) O1 Q/ H* F6 S
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;0 s& o- n4 K0 g9 O% H9 x6 h1 L
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;- j1 {) Q9 E/ d6 D# S; E( q" i
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
+ }6 D: M  X% y! N3 h  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
, ^* S. N$ {5 q5 f( b! `. q  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
+ J5 [. h  c& j- H" m5 Z  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);0 L# x4 x5 `! v
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;( J8 n4 S& p. L. n, I' Z
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
' u2 D& R' F; G& T$ j5 X) |}$ p0 Z; f; R- S" C5 M/ w1 i
void SPI_Configuration()
# W: s$ _& q! Z. t; p3 f* S! V& K{  SPI_InitTypeDef SPI_InitStructure;) q: f' r; C* k
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
8 K, \* [  P8 x( M3 V" a6 @  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);. U2 E# U9 r2 v3 e, z: Y
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
1 V* _" `1 g: j! L, H   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
5 @, V6 @& b, H6 S% r3 U  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);. f$ {8 Z6 z+ I  {* u
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
7 u; J3 B. Y- ^+ r& D& h  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
; r! M, Q# ~7 \2 _  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;- x4 x# w, u. N8 W; p2 v* B
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;, z0 j: S/ P& ], q+ C& K* {; E6 d
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
6 l' c" K! v# @. \+ N  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;+ o/ h3 J5 _# F4 h
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;  Z% N8 m) p1 i/ o- n# x/ h
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;  T* F* J9 v4 U) ^9 @; C6 o# a9 W
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;$ T5 M& g# j$ |/ |6 F8 [" C3 K: Z
  SPI_Init(SPI1, &amp;SPI_InitStructure);
6 j/ T6 `6 h+ o/ F0 p5 I2 \" k  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;& O8 S0 D1 F* a/ ^' |0 C: \
   SPI_Init(SPI2, &amp;SPI_InitStructure);/ G& [* m5 Q3 i2 O- v& O
   SPI_Cmd(SPI1,ENABLE);+ |2 I& H. a7 O- B$ ]( z
   SPI_Cmd(SPI2,ENABLE); 5 Y. V" [- U+ ^/ N
}
$ E3 D- }4 f, O8 O9 b: p2 Uvoid Delay(int nCount)
0 d3 A8 P, W7 e% [! ~' E{ int c1=nCount;
- s/ Y6 t9 F( q7 O' P0 H int c2=nCount;
0 Q( O, d) p- q for(;c1&gt;0;c1--), M: S; I2 G/ q; Z5 u  @% b- z( E
  {
* h& P: U+ z2 W! ?/ c. |8 ?  for(;c2&gt;0;c2--);
9 u( u- V; p3 Y7 g };
7 P+ D/ O, E# l- c5 ~% e}
: e( V) a8 N. d+ e7 m- g先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:& S& E4 E4 [. l6 Y  W
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信& ^/ t5 x# I( H" Z# p$ |, k( \
以下是全部代码:
+ g, }( P7 E( r#include&quot;stm32F4xx.h&quot;  h  q# }" h) G1 _% q
void RCC_Configuration(void);
( ^; X$ w- p0 L/ O& I9 w5 vvoid GPIO_Configuration(void);
* i( j" F, O. a( p9 U+ q/ Hvoid SPI_Configuration(void);
% k& f; ^3 q7 }$ w" |8 r+ s2 xvoid Delay(int nCount);
6 z2 ]2 [4 S  o6 k9 R  q3 rint main(void)
4 H% C* e  h+ k/ A# p{  RCC_Configuration();( O* U7 w. J( ?! k! P! s# g
  GPIO_Configuration();7 |' H+ L- F$ _1 e6 p9 Y1 y: `* J
  SPI_Configuration();
# A, e0 @  L% h3 q/ A; l while(1)
0 Q* D8 H3 j/ I1 X, H) V7 i2 q { int data=0;' t+ B% h( L" p+ T) o
  SPI_SendData(SPI1,0x55);
  N; l6 K4 w* r; R& p  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
* K, a7 B& i% q. `( k+ V  data=SPI_ReceiveData(SPI2);4 h+ f' C! Q) {" S7 c2 q9 A3 z
  if(data==0x55)" L: g( D, v& d# W: L* K* P
     {  while(1)0 o' _7 |# {2 y' N
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);+ B/ J. ], i+ Q7 N, Z
                Delay(0xfffff);# k& p. d! o/ @7 Y/ `) F
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);* x5 {! X2 \; P" V2 g$ z
                Delay(0xfffff);, x% T8 d8 ]- r3 H
  
  L! a% f! I5 Y5 s: i             };
; D( H9 m1 L% W) H! |( `     }
' E! z" W: M  E& v" d1 Y+ P8 _     else while(1)4 J! |! B/ s7 Y
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);& I8 A: u5 L$ V
               //Delay(0xfffff);$ h* W2 v3 Q8 r5 Y7 x* }0 ^& l
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
: P  i$ K* X+ Z( k               //Delay(0xfffff);' R: i6 q' e( g* B/ q
  
% B( ]" V# |9 F1 H            };  L7 N) s. c' h& Y1 P/ k0 c5 q
 }
; c% [+ g8 T* o7 `}
( m9 _2 ?7 Z& b' J8 w2 k$ l$ gvoid RCC_Configuration(), I# B1 _2 U% i( }+ z
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);# M, o, ^8 a/ J  I! @# m) P* _, P
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);1 I- @" ^+ g3 }5 F7 n6 I. y5 J6 h, E
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
& h& X3 j( \+ _6 ?5 d# l: F& o}
9 z# x3 O. y, [! G4 jvoid GPIO_Configuration()4 g" R+ Y, @/ S& e
{  GPIO_InitTypeDef GPIO_InitStructure;
6 z4 j3 [9 N* [  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
- k9 o2 [. b6 a0 x  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
0 j, m  k% `- @/ Z' v: S1 v- T  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
7 J- T+ L- w% R  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
- Q6 C. D0 G8 w  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;$ b% m7 ^- {5 h1 a8 ~
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
+ ]' A! i2 q  l' ?3 h+ q  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
- G* I& K& x/ k9 M1 r  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;+ ?9 N, [9 m; B' d) K  V8 d# K+ k
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;2 R5 X7 w+ U% Y7 y( U
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;0 `2 C( }" x; m% {- S2 F) l. Z
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;  T: Y+ b2 Q- K4 \' T( @
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
' t$ |! f5 B3 `: S4 Q  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
# m$ ?# R5 L: o, Z- C6 E  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
, u" L; a  A% b+ ?6 P  Z}! v3 _( B. Z" |. Z% Z
void SPI_Configuration()
  g: u! X) V" j$ e* i{  SPI_InitTypeDef SPI_InitStructure;* H: ?2 T4 G; K3 p
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
& p4 W% s: H1 z  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
0 l& }' S2 L0 J* F7 `: K, i  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);; I/ F2 x6 x% y7 s$ L0 J2 _
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);" t. I& Y% v( x6 w& l5 q& F' w2 c
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
' {7 b' }5 _* ]* a( A0 H  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);& o% i3 |/ ^9 E, h6 n
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
* h6 W$ l) ]  ]0 {$ d  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;5 e, H# @: |3 M  d1 a
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
4 ?; k3 w- E8 U  m: _2 Y  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;' n. w3 ?* E* x/ |& q
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
. S7 r' [4 a7 X7 g8 _! ]" _# v  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;: g; Z3 c; `1 J2 W/ A
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;$ S) w+ X0 p% D( n' H( Y
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;5 S6 J5 l6 `; }! o' z3 W+ ?
  SPI_Init(SPI1, &amp;SPI_InitStructure);/ G7 }- t  Y2 n0 U% R9 p# P/ o# a
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
! ^6 D3 Q9 l5 t# B   SPI_Init(SPI2, &amp;SPI_InitStructure);3 `# y& T5 ^5 f$ v
   SPI_Cmd(SPI1,ENABLE);
$ E* i# A: [, e: |- a; y9 S# u6 z   SPI_Cmd(SPI2,ENABLE); $ ]) E0 s: L7 |' a0 W
}
! o$ x: F( ?0 y6 C5 u3 \void Delay(int nCount)/ _  P: k( m. h: [$ `% n
{ int c1=nCount;
# X: a2 b0 p6 }) V# @" n+ T int c2=nCount;  o$ Q" y0 A( g0 m' E! O: l; ^
 for(;c1&gt;0;c1--)' a2 A3 b' @& X$ v* K, [
  {  Q. v0 `3 c0 w+ A7 {
  for(;c2&gt;0;c2--);' Y6 L4 V- s. W6 y9 |, r$ T! k
 };
0 _9 r: q8 T* @* f) o2 o}
1 Y$ ~6 x, T5 T" e先谢谢了~~6 c/ M6 O8 @9 s0 Y" J8 q  R
 2 g( D2 p, K% h  c. l/ f6 U
) J, X2 S# X% {  U( Z
楼上的问题,看我帖子给出的提示哦~
lkl0305 回答时间:2014-1-24 09:53:43

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

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

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

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

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

回复第 5 楼 于2014-02-14 11:37:16发表:. V: R( E8 r/ v0 M" z; S
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。2 A/ t* q, t4 j7 P/ e) w
 ! j* s: Y+ o3 Y# e8 U# m
5 e" t2 K6 O7 t% b8 k
多谢支持!!
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 运算效率不高

  
6 _1 Y, b9 k; \4 V鬼魅一样的Hard Fault) `# [8 }  ?( n" g7 \2 C- r
 
; ]& \, g9 y: G; b该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。, u4 f- p4 Y/ t  q9 [' k# Q8 v" C
 
0 H; u9 ?* ~: Z, Y( W5 I咋解决?
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 手机版