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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表4 y$ v+ U  l+ L

6 Y, D- V) J- r, B
  Q; C$ C  i7 w+ C" b社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
$ @8 O  }& r  P8 H1 S
2 \! ^! X$ _) r4 q; D* C提示:点击各主题,进入帖子,可下载ST工程师解答详请
9 p# X7 D' R5 x" Q0 R
4 S$ o3 U" q6 x( _( I) T4 i& ?/ s2 Z0 K
一、通信接口: p5 I9 X* t9 A; x2 B% @7 Y
/ J: I$ U1 ^9 s; R: T: E
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新- u* K! M  ?8 o
" R% K4 ]7 @1 Q9 G7 ^8 H
2. SPI 接口发片选信号导致死机6 A: {2 |4 V# \  H( Z

# x: q. b2 X0 n' e3. USART1不能设定600BPS的波特率
0 b& i! v- O/ ?. x, `9 {* C
7 t/ p0 V2 \  U9 U& i( l/ ?4. I2C 接口进入 Busy 状态不能退出) ]) ]; s. t4 ?$ U. F$ R8 Q
0 n5 S' v: F+ p) {
5. 对 Flash操作导致 USARTU接收丢数据' m3 \6 y- C8 U

% i* j: S, @/ q1 l: g9 C$ Q6. USB接口易损坏
' I" t% q$ h& e1 X! o  }- ~2 [
2 ?$ v( e. D/ M* I* b: j3 ?7. UART发送数据丢失最后一个字节2 g9 x1 q  T5 h( d5 \3 A0 d
' q, z) L* F7 t$ _+ K
8. 使用 CCM 导致以太网通信失败
' i* z4 `/ @2 {" v 7 E3 R8 w7 A& L; M- V
9. SPI3 接口没有信号送出
0 A* P+ Z/ E* Q0 C
! K. W! Y6 y8 a4 V10. 时钟延展导致 I2C 通信不可靠
9 _7 n% h0 O# l8 F3 x
, D6 H( v, o( W# h11. M0的USART波特率自动识别问题" j. ?( w, V8 r7 p& C  N! @, z1 _+ F
6 a5 Y  z6 F/ G
12. WK15 OTG做U盘主机兼容性提高
+ W4 G3 [6 [' p& o 9 L/ d* h8 J, u9 i( B* b8 L* X
13. 以太网电路设计注意事项' r8 ~  W1 @5 Z5 |% ]  b  Q% X

) z2 \  R/ ?# i: r14. OUG主机库在BULK传输上对NAK的处理
1 Z* f( S5 U5 n0 w
. f* ^% H7 u) p" h/ F15. 串口断帧检测
$ p' t% R' B1 f1 U
2 T5 X, Z. |# z! M# }16. VCP例程用于数据传输时丢失数据的处理
9 Z4 [& [' @8 z
# N. z1 M$ W$ A# L, x/ ^* w! d17. STM8L051F3P6串口UART数据起始位判断的问题, T6 X) E( Q' [4 L5 V4 l* G
6 ]4 q7 t$ }( }: p
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号
- a* R7 F2 G9 L3 x+ h+ h
( ~* y6 h6 U* K( t  N$ r- t  J% d( L19. STM8中UART奇偶校验的使用方法
' i- x/ l& [$ p, r' U5 d , h! c3 E$ C! ?% ^
20. STM32以太网硬件设计——PHY
5 T) T5 s! A0 o$ T9 S
+ I( W" S- @4 s21. 一个判断I2C总线通信异常原因的方法* v2 F- j$ a2 m$ x4 J

* J' }2 `! w& \/ S* c* C1 I: a3 N. x22. USB device库使用说明8 Y7 |/ w6 A2 ~
$ {8 F! V" `) f/ i( k% h& Q1 l6 h
23. STM32F103上USB的端点资源; C2 v8 H3 X: U0 A% p
( R0 j9 L' a% y6 m  X7 y
24. 使用CubeMX生成TCPEchoServer程序
% x( f" P3 M% S0 d& g' @% A0 m# f
- X( }/ d9 ^8 K8 F7 v25. SPI接收数据移位( `, z+ Z: b' @
/ R" ]4 d. N( u8 b% N9 C
26. STM32F0中Guard Time的设置
. p- U) E9 N9 h( v6 J* B7 y1 b( ]) y# N0 l
27. LwIP内存配置
* O% E' v# u+ ^$ |7 p2 Z( [# [9 D1 z2 z
28. STM32 USB Device的简易验证方法* r! F7 J2 f% m3 ~7 Q

. J4 \! H# |: z- a29. USART 中断方式接收无响应问题的一种情况及其处理方法6 \5 l2 L  l, T( \! \

; b8 K, M% \$ j* ]30. STM32 基于 Nucleo板 CAN总线的建立1 b, _5 z7 O$ Q0 x# W; T

; |( m' ~5 O* N4 a3 a31. STM8 CAN总线的IdMask模式的讲解5 R6 o4 L: R: I5 t' n) \9 C( l
* o+ k/ r0 @, q: {1 R/ i
32. STM32F746ZG USB 驱动不正常 3 C+ z# W6 W- P$ L' K, w4 {, U# f+ ]4 D

6 B' V" {) E8 O/ Y1 Y8 d33. MCU在STOP状态下通过UART唤醒分析
% N9 U7 W" ^9 w- A& R: [
1 r. l8 z) d8 e7 q34. 通过STM32CubeMX生成HID双向通讯工程
  K& M3 e& V$ j- U2 Z+ M5 h4 P8 n' w$ W( D  Z4 T
35. 串口工作在DMA模式下有时接收异常 " P5 ?+ j" i* ?

) D' b3 W: t- b/ ^' W" f36. STM32 Bootloader中 DFU使用限制
1 ]5 a6 W- e; w% q1 ]# x
  M- ~6 r0 C$ n" g, Y5 o37. UART异常错误分析5 T0 }& f9 U9 l4 i' ^+ ?
1 M4 g& v3 `3 A4 E
38. 基于Cube库无法检测CAN2的接收中断 7 G" S3 `9 ^5 D, |$ G

: C% r) ~) Y; C5 {5 s- M) @7 c* s) e39. 基于STM32F7的网络时间同步客户端实现 1 Q4 m8 M3 u& O% L: X# S0 W8 i5 q# C
" g( o' `2 G' g! m8 P
40. HID与音频冲突问题
7 m( U7 J+ w5 R4 P3 l, }0 b) Y% ]8 D1 b. j
41. 在进行USB CDC类开发时,无法发送64整数倍的数据+ |/ E/ R) s. H7 |3 y9 i/ }9 U
3 N" i  Y/ f& B
42. 从零开始使用CubeMX创建以太网工程
8 j9 s  _5 H) l4 e7 ]4 L) w" C
% b: W% |0 H, p( @- _# y  D$ e43. STM32F4xxx的I2C总线挂起异常处理3 B& q$ O7 B" z/ l# ]3 Z+ e
: C$ a4 Z9 q' ]
44. LPUART唤醒STOP MODE下的MCU' t1 P) E" y$ I: v2 G( u; }8 S

9 t4 ~& E% t, ^2 `45. STM32系列 MCU模拟双盘符 U盘的应用. K) n# @8 C% p+ W
$ O  Y/ F9 H* [/ D4 M( N$ }/ [
46. CEC输出的数据和数据长度始终不匹配
" H5 U; W6 m: }1 |4 `2 k9 f! O- o& `# X" k7 }! u& b
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
( Q& x: D# U( q. ?2 _% f. B3 }; b" z% C- P4 I0 O9 ^- k
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
: q/ w3 W  E0 t# Q
' f& z3 c6 d8 S3 \2 I: T49. 增加UART接口应用时的异常分析
9 A; w; J& W+ A+ ^9 f! x& q
$ Y: T  p" X$ l* h. ^+ N. \50.UART应用异常案例分析4 i! h4 V# j+ P; G$ [$ I
8 E4 S9 ~8 k. U) }6 N$ U3 D  U
51. I2C配置顺序引发的异常案例8 {4 f/ |; r5 O
* u0 N5 v" y4 q& ~) ?
52. STM32 USBD VBUS GPIO& L% E3 C+ |" @) H$ t. p

6 M% X+ A/ [4 D- }, y- j" @53. USB传输数据时出现卡顿现象
- B; q) \! j) U0 Q* I3 b+ W6 l  J. s" l
54. STM32的高速USB信号质量测试实现3 \) Q9 A( @- t

4 I1 }- q5 U7 M1 \55. 基于STM32 I2S的音频应用开发介绍  A9 T3 r7 {1 T8 a* ~+ e; o% b

$ v" \/ R6 Q: j) q3 y56. HID_CDC复合设备在WIN10的识别问题  ( G7 b. G+ p0 ^

+ H7 x+ S4 T; L8 d0 C  T; D+ d57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  7 v" ^7 U, z, h4 H( ^3 _4 s' j
9 Z5 c& M1 r# |: W9 K( i
58. 一个关于LPUART输出异常的问题分享  
3 i( Q1 K9 _9 v
3 e/ C! y+ w5 A2 i
59.通过 DfuSe 工具控制程序跳进 DFU 模式
7 V$ y4 P) C# a9 t+ H; d4 }. m

' j: M+ A3 b* o* j. l' O2 q) [+ b9 I9 L60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
0 o6 d( O$ K5 l

5 ^9 d8 G# g  P61.一个因初始化顺序而导致异常的话题 (2019.12.24)3 \( N7 E9 P% R0 A6 A8 P( J( L

- T; b  G3 g% Z/ `6 Y% p62.MC SDK 5.x 中增加位置环 (2020.5.29)
6 L4 {7 c; q) C6 C; ^
0 i7 _  c' B" V0 |( H
63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
) @6 x7 g; Q+ S& i+ h" [& k% R9 u" G% o  {
64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)
/ f5 t$ f5 T5 h1 G9 w$ R8 B4 a3 n: B9 S7 t$ \" k2 M+ s
二、电源与复位
: [# k  ~& ^# R 4 l( x+ ]/ ]9 z1 z! \
1. Vbat管脚上的怪现象
, x5 W' I1 M9 F) y# Z' Q$ ^
+ O& f# J  {) t7 L1 h1 N+ Q7 v2. 上电缓慢导致复位不良2 c2 j+ d- X9 v" g0 ]+ D

6 g$ o* ~4 Q* |( s, c5 N6 n3. 关闭电源还在运行
# H/ ~, P, \+ D6 E5 T1 d ' X; J. r; T; _+ V
4. 使用STM32 实现锂电充电器' c! Y  }  b' ^) B; y4 ^$ I( {
+ v4 u, U! z9 x" W# i, `+ p
5. STM8L152 IDD电流测量& v& p( G9 U. F( {
" k- _! X. S$ X" y" D, c
6. STM8连续复位问题' Z  i" \7 g6 a4 {" F+ U; n+ }, y
% z3 \- d; O6 x3 K3 f% `: T
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
* x4 C. B* D6 I1 }) S
  C% M2 N5 X8 ]. @  M) o- |9 G8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流
7 f6 \( e9 R: l$ y- W7 H& F4 Z* U: V8 \% }
9. STM32F7与STM32F4的复位序列比较) q  p9 Y! y8 F1 q! ^) S- _
3 M& w# k! ^( P4 z3 g, B
10. STM32F107 复位标志问题
6 t3 y- ^7 h. Q: |# O9 K2 [( F+ i& s: J2 J! g. w8 U
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
. N9 B: _' e4 a. `% t3 ]' V$ T& h) y) _2 r7 w+ q8 ]
12. Nucleo_L053不上电也能运行
: _$ R$ \' p4 m/ @  a9 i. t
: {3 \, F; j+ b% ^. R13. STM32L4中STOP2模式下的漏电流7 U$ @4 e' |" @  F/ h
+ G9 e9 ~# r. ~# c/ f( v
14. 在没有外置晶振时HSE_RDY异常置位
8 ]0 ~8 r6 x1 p3 x4 c4 a& h% j
) M3 [0 S- s2 {15. FLASH被异常改写   (2018.5更新)
7 A: Y7 R: v% p6 w1 L
$ Y( \* U' A% w) X9 \6 H: }2 [3 ~16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
0 g( {! H: _; D1 B% `5 B$ Z
# d  Q9 s7 I2 M' Y+ S% y17.一个 STM32 芯片异常复位之案例分析(2020·2.27)
7 o) P; G7 k6 `, t) B/ R0 }) y7 a
三、IAP和Bootloader
9 a& Q: b) g" h' w! a' X % b8 C& [5 a/ [  }
1. Boot Loader与上位机通信不稳定
8 [8 L2 D8 d5 L" @
- z: B+ `. R* d1 q5 N2. IAP+APP 模式下不能启动 RTOS
/ p* q7 o* K% B6 N1 N* o   w6 i# \2 }7 v( n
3. 从 IAP Loader 向 App 跳转不可靠
. D) w$ S! h9 D# Z9 w: G) Q
/ h/ ^' e3 E) I4. STM32 MCU IAP例程跳转到APP代码简要分析: W5 z* a6 }# [4 [( v' \( q
$ w; Z, O# J( Q6 \
5. STM32F091从自举程序向应用程序跳转的问题与解决
' h3 L6 V* i: S; t3 ?) f. S5 B5 ?, n1 ~9 n/ u
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码# V+ {: z! Z" |4 h& {

" g2 T/ d: y# F% `; k3 z7. STM32F0启动模式相关问题探讨
, n$ p2 R. u3 U+ b3 g8 W; J" s2 N+ m) ?
8.STM32F091空片使用System Bootloader下载代码
, ~! d- Y9 r/ a& ^& \7 y5 ]1 G1 P8 E( u* b. ]
9.STM8L  IAP 应用程序中编程指导
3 f' j" g9 _9 B : F- h9 g4 {, I1 H9 r+ w
10. 如何通过STM32的串口实现简易脱机编程器9 L3 U/ ^% k" |* f  E3 j$ }! E, V

8 C8 @; {! p; S$ a# z11. 一种从用户代码调用系统存储器中Bootloader 的方法  ( F/ g2 e4 p  B- _

3 x: g) B# J9 ~. m6 d. e: {12. 利用 USB DFU实现 IAP功能
4 K/ e  I$ c. h2 p
) `6 c6 Y, l/ M2 s4 C9 [* k0 c& x13. STM32 Bootloader中 DFU使用限制1 w1 T( b  A6 e! f6 V9 Q' Q

& j9 |# ]8 y. P$ g/ v14. STM32L011x和STM32L021x启动模式注意事项
& L7 X' z2 ], Y+ Z+ r
3 L% r1 I& T# ]- h* W15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项 - c2 @4 e  N$ I8 O1 t7 i8 ?
  B# z5 U4 X3 ~8 r+ {5 j
16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
* Q& X. Q" C5 [' Z/ R  g% F  F: W3 T3 u3 M3 l2 s. o, j- \- q0 G% J% `
17. 如何使用STM32NUCLEO 板来测试串口Bootloader+ U2 s% d. [2 y- [% s

! }! i' K$ ^6 L7 h18. 在STM32L011上通过I2C接口实现IAP& d; c1 l+ s- e* e

1 p$ O# @- j9 o' [19. 在IAR中实现通过将程序在SRAM中调试的方法
, q3 G8 ?$ n5 M9 J# z( _& E' N" E( f8 `. T3 N# e$ r' u4 T
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题+ g4 j8 c/ G9 k" `! C' e8 m' E2 ^

$ I5 A5 Q  v; W21. USB DFU IAP 例程移植的两个话题  ~8 L9 I2 E7 n
) ]3 W1 [" ~/ A; c2 k. m) L
22. STM32F769双bank启动
: V! g8 e! C3 C. [' J' x
# h% c& Y  W' t8 b7 c! h2 o23. DFU加载 工具 DfuSeCommand的使用8 w6 S* l2 [" ], x; F4 c# ]

) L. \, M5 p1 @" e; p7 {* Q5 Q3 h24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码    # t' ^0 Q8 ?: `0 r( U
, f" o3 E0 ]- y! Q" F
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)1 W7 x$ h/ n  I3 @

0 L$ ?1 w, V4 ]+ f26.STM32 Bootloader异常复位案例(2019.4)8 T* O: z' n4 p# @% l" r
8 C1 K& P( t' e0 |/ r
四、存储器- n. B5 r& W7 Z$ d; m
& j( a& H: N0 Y: _. a
1. 对 Flash操作导致 USARTU接收丢数据
# j8 l6 c- l9 y2 U( x; \( M0 }
7 p$ T( W5 {: U, k3 P2. 使用外部 SRAM 导致死机
) h! u3 l" M/ c! a2 [
! J% h6 x- L0 d3. SRAM 中的数据丢失
" \% I' _# h' m
' H8 R8 O6 a( ^3 h$ C! t4. 干扰环境下 Flash 数据丢失
' `4 O; @6 d& z: J) `. o
  y9 X  m: s# a4 n. Q& Y. {' Q- Y5. 使用 CCM 导致以太网通信失败
2 R7 H' x8 y9 P+ } & E- L( L( r1 ~& |- o% q% U+ f  n
6. STM32F429使用外扩SDRAM运行程序的方法  f4 f0 L' T* n6 D
0 E9 U6 ]5 J5 U
7. 使用STVP实现对STM32L1系列EEPROM预置数据
: e& P6 U( E' \
' G9 C- S' l6 k( q: d  U8. FreeRTOS RAM使用情况及优化方法
! n$ S1 M' B. @% Z) t0 k
2 Y7 W$ V" C$ B9. 在IAR 6.5下如何将数据存放至flash中. v5 a- T7 E. w( O' d9 r
) M$ K& K- `& q# l! W' p% ?0 _
10. IAR下如何让程序在RAM中运行
+ _' z  h1 E8 Z# C6 }3 H ) Q5 \2 ]5 P9 N0 r6 v; B: D0 n
11. RAM上电后初始值问题/ s0 V! `6 C8 a& b) L8 Z- Z+ X$ d

! |6 d0 P! f: y  ^7 W9 ~4 x8 Z; r' C12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
: E, n# g  o1 p% i5 i, M: o
' I( S" {8 c* S, a. k13. LwIP内存配置' N9 b) P0 c4 Z1 @4 s
8 [' i2 D1 `1 ?6 P7 a! b7 Z% `
14. STM32F2高低温死机问题
; M8 t; u, F/ f  x. J& C6 C8 G& ~* T1 R8 T$ _
15. 使用STM32F427的CCM RAM时遇到的问题
+ Q) f( }9 }' H  _/ z# P3 n" @3 V( `* ?- H' P# p
16. 利用QuadSPI外扩串行NOR Flash的实现  
0 l) z# c( t+ _1 [
/ I) |% Q3 Q# ^% O& K* U! ?17. STM32擦除内部FLASH时间过长导致IWDG复位     
. q. }6 i# g/ ]4 q
* J5 @6 w7 g( W6 t9 U, I3 @
2 V$ C# p& f, C3 o" J  K: h' Y# J
18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)! Y* A$ O( d: y; G6 I

- E4 A+ f/ ]# Z4 Y9 J7 s& l2 ]五、模拟外设# d3 Y0 x9 W3 r, e- o2 K! w$ R/ M: |

5 n7 ~: N: e7 L- j8 B7 A1. ADC对小信号的转换结果为零
3 C5 F% f/ c- @5 {8 t  Q$ M
& a/ l" ^% v! U2. ADC键盘读不准
, j& E( J) v: a" u' m* g9 ]" I8 |: Y
: d. g- l6 d' X6 B3. 扫描模式下 ADC 发生通道间串扰/ b0 I4 w5 u' ~) i0 I) N

3 ~! K- s' V- {6 [4. DAC无法输出0V的问题分析解决3 z9 @. [; Q1 ]$ s$ C7 X

% v; l  O9 D: H6 O2 `- Q5. DAC无法输出满量程电压的分析解决
* E5 d: T. P% x; Y: [ # x, u0 b0 T& u
6. STM32F30x 的ADC 采样的傅立叶变换4 C& @/ Z& s, d8 i3 D
1 g  N6 U- N" m) f' P. c" k
7. STM32 F1系列 DAC的示例详解4 P" R; U6 h6 h& n
  n( g8 T* i1 N# |; F% |
8. ADC 连续模式采样浮空引脚问题7 u! ~- G; @& |: N) v
  `% e8 |4 i1 }  E+ \
9. PWM硬件间隔触发ADC
" N# c1 e! t# t* ?2 ]& T' N1 [3 @0 h; |" J
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC
* ?: B# e; K! N$ d6 C" x) `* L/ U. L" ?: {2 U
11. STM32L4 系列中ADC 通道配置上的区别
9 {/ c' x/ T+ _$ ?! E0 U$ q! L; _) H3 |7 i; _
12. STM32 ADC模拟看门狗及其应用
! U% V7 W2 q; p+ ]4 {0 G9 `- e0 `( K" g9 `
13. STM32L053 comp2 比较电压无效问题
4 X8 }2 U" P& _( ?6 s; L) _
2 {3 c! O! i& Z& A8 h# o( O# d14. 运算放大器OPAMP在STM32L4上的应用  b9 x- ?6 T& [1 }" d

) ^& a5 M# p' b) D- w! l$ N15. STM32 OTA例程之ESP8266使用 . e6 S0 n! a- \. a4 N5 }- u. {
2 }: G( r1 L% {! n+ Y/ F( U
16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)& a4 i0 d1 m$ T$ m/ D% K
  e! Q& Z/ ?. `6 n
六、计数外设7 c8 |' X9 V4 m, F8 B7 ^

5 Z4 V- A4 X+ T) J( J1. Watch Dog 失效# j6 o: x* i# M% M8 ~
9 ]$ I& A( e+ B; J
2. RTC计秒不均匀
% z0 i# b4 y7 U8 B' E3 s. ~; K ' W0 A3 P) ^2 ^! @5 ?# |: I* \
3. 软件启动模式导致 IWatchDog 失效9 ^# Y* ^3 X3 I& B$ {& M
3 C( K# y, }9 E0 P) i) A
4. STM32F030R8 定时器移植问题: x% n: n/ Y) N. m7 N0 O" O5 J& y7 i
# T$ i. ]4 Z2 a* z5 T/ M
5. STM32F0使用RTC Tamper的几个注意事项, o1 s  j! G& Y5 l
; `- i/ S: C$ F" }0 k# E" V
6. STM32L053可控PWM脉冲方法之DMA) H& t3 Q. ~. x8 Y2 q( o

2 y, |% e4 r+ ~8 T9 J1 S7. CounterMode,OCMode与OCPolarity关系
: h& H. K! Q% t6 o* a
; i% E8 k0 h' _/ n8. STM32L053可控PWM脉冲方法之DMA0 z- Q& l/ X+ P9 A9 n% m$ B
, R- X+ I% e2 j4 y9 B5 ]
9. STM32F1通用定时器示例详解—TimeBase
: F* k4 m+ f3 w0 t8 I1 ]+ u. t% m: W1 }2 e/ o7 q1 ], b) J
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals: i$ Q, X; d7 H) x# S: \

* ^6 |5 e, e3 P7 k11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
, ?6 I+ f- Y0 _; u, ~1 E4 ~
4 ]1 J! b% U: v5 R, v12. HRTIMER的多种Fault事件联动机制
7 Y: m" W0 S3 R8 D" B 4 C+ N; T/ C9 {$ I  P( [
13. STM32通用定时器 示例详解 —One Pulse3 z( A/ N+ r1 }9 |) ^% y6 ~) |: _
& e+ z: x$ F, I! r' D6 b, u* N
14. 如何用LSE校准STM32F4内部RC振荡器
# l! s; `% `; S6 Y
! p3 {( A5 l) N* G- v3 t3 V7 ~15. 一种使用Timer测试HSI实际值的方法1 L$ R4 Q% r! ]3 ?7 G
0 c0 O/ f7 z4 B  j5 \/ v9 v
16. FreeRTOS定时器精度研究: r' n( m8 d5 L' K; \
. L, `' S6 m9 r/ z
17. HRTIMER产生多相相移信号8 j0 T' w$ y/ t5 o
, n5 d  p) }0 l. F! E- F
18. 窗口看门狗启动时异常复位问题
$ X% ^2 z  O- U7 Z: {
2 i- J$ ?3 b1 @/ G5 Z19. PWM硬件间隔触发ADC0 W# J5 C! r/ _: R6 Z3 @" t6 _! g

5 f+ L1 p* @3 ~+ e( i20. STM32F030低温下RTC不工作. O1 d1 w3 h2 }2 b* I0 [) R1 N

9 Q; F& m5 V; K21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   
# ~# N0 Y5 Y1 t' q+ \6 p+ b/ a; d1 X. ^; D7 C/ Z
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)/ Q' q( R0 ^) Y+ i

$ M, V( _. R# j6 e* X4 Y23. 基于STM32定时器实现定制波形的示例 (2019·7·25) ; Q8 v  Y' `' N. D0 o

, e6 u7 h1 @8 U5 K24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
0 S* m9 x( `. J( G- T

. l1 t+ ]! M9 S3 P) a% ~; n25.MC SDK 5.x 中增加位置环 (2020.3.31)
8 Z; k6 B: H. Y, I7 L0 h
& b0 V1 p2 E! F2 j) x! |
26.STM32高精度定时器PWM输出话题 (2020.4.29)
* N5 R5 v, Q, Y/ Q% L2 M- A3 @/ B7 j5 ]

/ r) H$ n6 @" z. F  o* {6 t# \27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)
6 |7 P3 N) |4 O3 \6 C2 u) {
! l/ o0 q% o$ O7 K
七、内核/ I$ g: T& N; n) V# h( S
" i7 T2 e% g, ~! D; F
1. 使用指针函数产生Hard Faul, N  b) Z6 r/ Y5 j  d7 q) a  {: G
! A! |0 }: ?7 R3 ]" J
2. 调试器不能通过JTAG连接器件8 G% ^( ^/ r- m/ v- C) }: R5 N
3 z( @  M4 ^+ F/ a! C
3. 鬼魅一样的Hard Fault
% V. }/ z. v5 g. A3 N5 H+ l: O 8 Y$ u8 i$ G+ u8 m4 i
4. 进入了已屏蔽的中断[2 s  a7 d! `) H7 n
( ^) ]# S) X5 X# ?, s2 Y; R. }' [
5. 浮点 DSP 运算效率不高
2 o' n9 I$ [" D# U
/ C# j( H& J4 Q1 d6 U. r# U6. STM32上RTOS的中断管理6 ?% r% O3 `+ M. i$ c# M- l8 J

% Q0 ^; S+ D7 l) I7 J7. STM32F7与STM32F4的复位序列比较+ x) g& ]; r; A

6 q6 W  M2 v- Z/ O7 ~$ W8. STM32F30x 的ADC 采样的傅立叶变换
3 B& ^" C& }$ m, ^) y8 X! X: ~# V! g$ V+ ~" C" @, B# ^
9. EXTI重复配置两次导致误触发中断的问题
8 f# R0 V: S' ^% s# J: O) b9 A2 l! b  S! _" _. o' `0 K
10. STM32F3xx/STM32F4xx使用浮点开方指令
6 ~( X+ F! P" E" @! I# T% n- N* S# M. w, x1 J. ?% ^
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响. j; Y. b+ B: |$ y

! @/ H  ]% U, j8 a 12. STM32F7 MPU Cache浅析  7 j* c+ v, M& m6 F3 r
1 m6 b1 y9 J/ W
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
) [2 d: e# W: Y! M* h

- p1 i8 r& x/ R; {+ }! ?14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)
2 W+ A9 h7 J: a( n" u* V. k
2 P9 j. E) p, N* j% H% {

2 F$ a( c2 V% h八、系统外设
( Q0 |& C' o6 Y # X6 D( h5 J' Q$ J" l
1. PCB 漏电引起 LSE 停振  B# i; e1 C4 D9 |; k& r; T! A
* r9 I' t( R# a, P) S% K: z
2. 时钟失效后CPU还会正常运行
/ R: c! Q# ]- m4 V0 C) K0 Q
1 d5 M. M* n/ E* R3. STM32F2中DMA的FIFO模式' R6 j7 m  m  l0 k: v2 E7 C
, Q5 f" f8 E2 _. f/ y
4. STM32L053的GPIO翻转速度的测试. d+ V% g- W) b: Z1 m0 ?

$ H' Q( F  _7 s8 c' D( T4 ?5. STM32F4xx PCROP应用; m1 k2 n0 B2 h6 b

6 U$ N2 K3 x  s( c" J0 ]6. STM32L053的GPIO翻转速度的测试. L" g9 a: u' u$ N( r

( o8 y( Q5 Q2 l" c9 X& F# M7. 如何在IAR中配置CRC参数0 U4 d. f3 |  V8 I+ h
! l; x1 l- `$ |
8. PCROP区域函数无法被调用的问题与解决
6 e7 L; ]4 O4 F8 B. X' K; {. l + l8 s0 H+ Z+ M' g
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
% ]+ d. ]5 K  v* \4 s1 i4 m
+ l2 j) h0 Q  q1 a10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计  m5 d, U+ w: O& i/ ?9 e) K
  {( G! f$ @5 @% c8 ]' N
11. 如何用LSE校准STM32F4内部RC振荡器3 f: @: t( }0 Q, f+ p1 z) |7 G
. y* K0 Y! D* C. K, E% ~0 E. X. ~
12. EXTI重复配置两次导致误触发中断的问题  6 w' a7 S  B3 X) u* ]

" ~8 H6 M- }" z( _! g13. 时钟安全系统的应用(LES篇)  / w) {' A" K0 u) X# g; R
7 H! f! ]& ~, Y% J- {
14. 利用DFSDM开发PDM麦克风应用介绍  
$ i3 m- H. i7 U% a

4 H8 Z4 W1 n$ A5 G1 D: l8 A1 H15. STM32H7的FMC外设在DCACHE使能时运行不正常
% z( I; Y3 A* @# Z
* m, F: I4 ~  @+ U, ?16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新): u7 c2 R  @7 q- X6 t

9 r% S# j& q( T. K8 o0 Z1 _2 g8 O  ]( X0 K" g  r& T: o( U
九、标签和收发器
7 H- Y: s8 Y/ I2 M2 N- f1 Q 3 H$ b# y* ^3 ?+ i3 f1 F. O* {
1. CR95HF的初始化步骤
( k2 w, R7 i2 O1 x8 q* S+ F$ K
9 \. @: B4 t( }# H% ~& @# h: M
, j3 h, \( L/ \5 u; p. y9 y+ G& G( U5 N5 y4 w+ T- b  A) s
十、生态系统
1 w" M6 z8 z" v; r1 t: {% v( T, e
- e$ a% P. T$ j3 ?+ G; V% }/ Y, o& ~1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题. @/ z$ O- v: \$ O( F7 H3 D$ ^8 X
4 X. a9 M8 s4 N: |9 R( \
2. MDK Logic Analyzer 功能在STM32中的实现问题
* E8 _. H  u5 J
+ P6 o8 f2 _0 W) A1 T. D& f3. 在IAR6.5下如何将数据存放至flast中
( z5 `0 P3 x, ]9 R& P
1 E  h2 b  R$ Z- b- S6 V) i: l4. FatSL移植笔记
) `8 p* s( ~7 v* q$ Q$ U ! J* J6 T" @2 b$ d! O6 @- o4 `( N& Z( K
5. Keil中使用STM32F4xx硬件浮点单元+ B9 B* J! k3 B
; @0 X  n" z) z% A
6. 如何生成库文件(MDK和IAR)
  L. l3 v8 E4 ~& X; T" u, J , g& Y1 ~/ H( Z9 R9 n& S4 z8 L1 q
7. Nand Flash文件系统解决方案' i4 m5 H8 h" w0 f1 z6 I. U! h4 a) R

1 _: z" K. H" V6 L! N+ f8. STVD在调试时弹出“Cannot access configuration database”的解决
) U" h2 K) ^4 o) x
8 M% c  z. Y( U. O9. RTOS低功耗特性的设计原理和实现( o, B# ~! O& E& L: L7 V8 w9 I. K% z
& _  Z2 K+ D2 A/ \5 C
10. IAR下使用J-Trace进行指令跟踪5 a9 i6 t& _. d" H
0 |. b$ z  G8 Z7 T
11. STM32上RTOS的中断管理4 X$ D9 ?& w) N6 C

9 r( J7 f: R3 [& E& ^12. IAR下如何让程序在RAM中运行1 u3 w% `; q. {( s

  |1 V7 E) j+ c4 o6 o! b* j& u13. 如何在IAR中配置CRC参数0 Q9 f) w( ]' [# f, J' \- m$ D

. {* Q2 T7 Z* R6 \14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册" q' R: U; {2 k) z3 ~/ J  q' I

( b) L, S- g1 x0 O0 y( I1 I" ~15. 使用mbed进行STM32开发及STM32F0的时钟问题8 J' q" i* }! l; b

6 J0 Q$ _1 a: ]: D. Z16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能' X- |8 \. L( ~2 E& t* z: z
5 d2 k9 }! w* d6 X5 ?
17. 多任务系统中的不可重函数使用注意事项7 t4 n) [/ c' m7 z% ?2 T
" u/ [: Y: P/ ?. g6 k
18. STM32 utility的hot plug功能
; o$ `" c3 ?5 }, r+ e8 `
  X  W0 T8 S+ G7 j5 [19. 如何将CoreMark程序移植到STM32上) i& }/ V+ i! E2 F9 A  F# I8 P3 X9 U
6 K: z8 u) U% f; O
20. FreeRTOS定时器精度研究! S- G7 [& q( s4 _8 B! c
& t4 O* |! e+ K: i1 Q
21. 如何使用Eclipse和GCC搭建STM32环境
3 v7 c6 P+ y  F% t2 Q6 K3 H7 n) {
22. 如何建立一个基于GIT的STM32库% |/ |: R; z8 _
0 |$ f8 \( z4 c- ]) R
23. 从零开始使用CubeMX创建以太网工程
' H  g  i( n! x3 _0 ?3 s; `* e# d
24.从STM32Cube库向标准外设库移植FatFs文件系统% k2 Y2 q# u" }

# r# o1 B% p$ v0 w9 q  x% o25. 基于 STemWin的屏幕旋转6 p% q1 I) a) K' d! d" H3 p/ @

  W+ x2 ?. L+ R, f* W26. 编译软件 Hex文件烧写 ' K+ e1 Y* A( M; Y. }
) c/ V; e5 z5 `* q7 [& _( S2 \! A/ H3 Q
27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
4 l, {! ?* K" T+ W) [) n3 e, _  l- T  f3 a0 I4 v
28. USB CDC类入门培训
: M: Q* |5 k, `- ^8 {% Z
8 G( }: o6 N* K' \29. USB DFU培训
, Y- V( g& y- o+ y0 x  O* b
; [& B+ f& G9 T9 x8 P& u30. 用于量产烧录的拼接Bin文件操作$ W/ u- p8 O( r! x
2 i1 J$ q5 i2 b4 ^
31. STM32免费开发环境该用谁) p* j: W4 K0 a: a( [; T8 u

, D' n4 A1 x7 d, b+ f. g& f32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)" C. j' I1 Y- l5 I" n# o$ ?
" W% ?$ u, {2 h3 V8 P* J
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)2 c, H+ j+ q6 k. u& K$ o% I4 W. W

: h# b- B4 l6 P  Q' v0 B4 i34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  ( ]- N& g2 g# }  {6 m- U2 [" c

' J- W8 D+ a* Z3 Z35. STM32 FOTA 例程之 cJSON使用   
: I" ]6 S' R; v& K) [) H) B/ G& T3 e7 k
36. STM32F769DK 云端固件升级例程使用说明
+ [# f  t: }* L% }2 }

3 k" f( E' v6 C$ v3 y; R4 p% J37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 & w) s! q! U& |4 j6 V$ p2 t
+ D- f1 o- s0 b% Q8 L. ~+ n
38. 基于 STM32 的阿里云物联网平台方案 ( Z  q8 a* @1 J! ]
0 K3 X# S" T8 F" S0 H
39.AliOS 任务上下文切换原理分析  
+ O. E1 ]( c! C( Q
4 I0 n( C2 B4 ^9 V/ o40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  5 _: L  r4 t3 y" @  q* g: s$ U
. p, J  Z: z5 n& D
41. STM32F769DK 云端固件升级例程软件开发文档  $ y. D1 m# Q# n% [7 |7 D+ T9 q
/ K4 l$ d8 z3 e* J: M) y
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)' r: \( s+ J0 l6 |3 i

# {  \# m9 O3 Q' l3 |# s' m' ^43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
. L/ N4 |8 ?1 `6 v" N" b9 x" R. W. I- F- i
44.零基础快速入手STM32MP1 (2019.9.19)0 h9 o- {  h- K. N& g" a

- i+ j2 d0 X0 @" r1 X4 N45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29): B8 T0 i+ J: _. `

) }6 [0 o3 ?. M& v十一、调试
: D1 z$ w' Q% |; x) }/ w2 r1 u* g & P6 h3 `5 o" h8 n7 Y* H, N  Z0 ~  C( L
1. 关于STM8S SWIM Error[30006]的分析
1 {3 |+ @) q  v! ^* C+ L- I: c3 U0 q 8 D  x+ _! p+ l" m0 [
2. STVD在调试时弹出“Cannot access configuration database”的解决" J( h, G, Z( l, s4 N" ?) b

! g+ B0 {9 f9 n# J# Y3. IAR下使用J-Trace进行指令跟踪4 P/ ^8 f. N1 x, W- X& t  F% O
7 X/ K* W" D& P& w& x2 W
4. 菊花链 JTAG STM32( V0 [9 e. y' |7 T6 [2 c' Z
5 [# D# |/ N4 F
5. STM32F411CEUx 能下载程序但不能执行
+ I: D" s5 X2 s
; U/ y9 H/ Y% ]6. STM32F103C8T6 程序上电跑飞" e1 ]8 ^; N7 V; }: I/ A% c# v2 s
$ m: }6 j, U. W$ h
7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
: G9 i* w; S: p# R8 A
# V7 l( P5 A/ M$ j, q8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  . q0 ?% O7 {! d3 R$ t! e7 a/ e

! o1 t# ^: v& H* Y# v# g9. SWIM协议的GPIO口模拟
7 x9 z% G! j% D8 _) `, S" e" u! q" S7 C7 b* b
10. STM32F091空片使用ST-LINK烧写后复位不能运行用
' U$ ^0 J4 B, A, b: V4 m- [' s& G1 N( g
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)( f/ @/ w5 [3 c$ m7 A" I( {* c

& l, U+ v* m* R1 n$ ?12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)' }. S5 K& c- @

+ p5 M7 e' }- e  `5 i. v' Q5 Y+ X13. X_Cube_ClassB代码移植 (2019.12.24)' X: y! N/ |# z2 N
; }/ y  [+ _  j" J% f5 o6 Y

' q7 j& V+ [1 v6 b5 K9 r14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)2 w1 W1 I0 f( _  E9 ^

/ y2 U9 O3 w( F十二、人机调试8 r8 o* B3 I( F. _

% f$ G$ e0 B* R% P- f( j9 N1. 一步步使用STemWin在STM32上开发一个简单的应用1 w, [' s% N3 O3 j' t; X+ ^  a
9 @0 t. L9 c" A1 X( ^4 p# P
2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计8 ?, X* g4 S; b8 S

, ^0 }( I  p/ q4 E8 w) _. h3. GUI方案中ALPHA通道处理介绍/ V# Q) j8 r5 }1 H% P

! Y4 P: O4 N) M4. 基于FMC8080接口8位LCD的STemWin的移植
0 v3 a& Z. I4 O' P4 b+ a+ o' d  J& b5 ]
5. TouchGFX中Callback模板实现原理 (2019·9·12更新)5 m* S' C) @2 f# o0 A
* O! R0 ^* X7 z
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)
5 ~. ?7 O& o3 m
, ^& W+ O! ^4 c7 y  ]7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)# R. N$ W4 g# t. ?% s

2 x; P6 z7 M' p3 i7 b9 t0 J& w7 B8、STM32L5中如何关闭trustzone (2020.5.12)1 X- C) Q; B2 R5 r* e0 q

/ X% \9 ~; }  n( c! ~! X: Q; m十三、马达& z. y& ?6 W( v( A& z0 ~
; O5 g  N# o: X9 _& s. P( d1 G) K
1. 电机控制同步电角度测试说明
8 R4 [; g: H4 K% K# [) H3 C9 E/ K! [

4 D7 b3 B8 Q/ r9 ?8 B$ N5 E
5 q' q1 a5 H- g9 m) B( B! L: H, d十四、安全7 U0 z) F# M+ i
, ^! Q6 T: r6 ?' X# I
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
3 f6 D5 H+ x+ ], j
' s) @1 A' `' j$ N" m% m* Z  X4 f1 ]% g
十五、其他- T( t+ H0 b5 T( B/ F4 ~" L
6 H0 v3 f' \& X: P3 t* x
1. 跳不出的 while 循环" S3 a- `8 U1 a+ U2 Y7 o
) ~( P1 k) M6 X% D  l5 `
2. 外部IC连接NRST导致MCU内部复位信号失效的问题
3 R2 }/ J( @! a$ r) x. l# o
3 ]+ o* \/ K1 w) |' a5 [& S3. 潮湿环境下不工作
  n$ t! g) @, e# _1 D8 F
% ^9 B2 c; y& Q9 v; v4. PCB 漏电引起 LSE 停振$ ~: z6 B8 U. \4 _6 \

+ ?" u3 g6 v# ], D5 Q8 w5. STM8L152 IDD电流测量
$ `+ t7 w: E6 v4 ^1 U5 U
' F; s! o4 S* ?( ^1 R6. 使用STM32实现锂电池充电器
# ?! A% K: ^1 W# H5 f , Y/ N; @& z( h* p6 ]4 F
7. STM32_STM8硬件平台基本检查
) c& a0 x9 _! X( s  ^/ x2 K3 f9 |+ I4 Z9 O) H- m! H; `
8. 验证STM32F401在STOP模式下的电流6 y) A/ |8 R2 `8 s
/ w3 u( P7 J+ _$ y4 r
9. P-NUCLEO-IHM001 电机开发板串口调试指南
% \. \6 R: N! D- a! E- u" N
+ m8 F& _* r! \) Z10. 一种计算CPU使用率的方法及其实现原理
9 X7 Y8 [/ u1 B0 g* W$ a
7 W8 L0 `) ~# c3 _11. STM32 RTC不更新原因分析* G. ~* {1 b- t! b$ E
; I2 ~: E1 e& e9 D
12. 关于ST库函数的代码性能对比
2 C+ d4 g9 F. b# u2 @( c/ q2 Q+ e
1 [5 T$ D% `6 F7 k4 N13. 在IAR中实现通过将程序在SRAM中调试的方法! M- N$ S8 ?7 D& p! `
) s) M3 |9 W4 L! ?* T7 V7 I
14. M95xxx EEPROM写保护配置! I  p' F8 t: x6 F0 P+ f
# D- T) t$ u$ I9 D4 q
15. 4SRxx的GPO的属性
& |* X3 R1 _/ @5 y- {8 G5 C0 H& h* O
16. CR95HF的初始化步骤
1 [8 ]. v# o3 b4 B- C7 }8 Q1 K3 ~% y7 Z
17. 电机控制同步电角度测试说明  
* E* K4 U1 t8 z  O8 z# g# D8 p  I8 P! A/ z% o' _- J8 @
18. STM32+BLE通过 Notification与 Android应用程序通信的例程
" [  |% B6 X' D, K
9 P2 s; K9 `" A3 l, y6 B1 H4 S19. M95xxx EEPROM介绍0 Z, U$ K+ N& g8 K9 K+ |! \% B2 u

0 M' L- R' z/ ]4 F+ P20. STM32 DFSDM测量温度应用 8 o( `4 t, ^. ^5 @  h1 _0 e# i

! A) ?+ U" P! b6 W* P1 ~" q) _21.代码实现PCROP清除
; e* k8 E3 P8 j, g  T3 ^; \8 g1 l) @* }  }# N# N
22. 理解与应用MPU的特权与用户模式
- w+ C  D2 E! w9 {
. s* K5 G" H( ~( U2 }$ o- ]23. 用于电机控制单电阻采样PWM变形信号产生
, @* w+ C: M: s0 n! D' W: c5 q: v  y- y8 m
24. STM32L低功耗模式唤醒时间测量5 ?( d4 u0 S6 t: a0 u
. e% t2 ~' n; }
25. X_CUBE_SPN7程序电机启动抖动问题
) q/ N* A- w- _0 o# P
4 E4 R9 {/ G! i' q) X, O26. 发现STM32防火墙的安全配置
1 u5 Y% X- D+ p' Q- K9 p- K7 L% G4 f6 f6 f
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改8 X% Y  A  u: u3 L3 c7 X

* e5 X8 q8 A( i" I8 U1 @' j28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)0 y/ ~2 D! o* d2 B

3 G5 X+ ]6 H) q. g5 I; {
温馨提示:
. m* x- A# p" Y; i" [" q1 r. w
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。

! J- B4 ]. Q; Z9 {
+ \1 ]. Q4 J2 d/ ]/ P# p' ]" L5 `0 i- J1 \2 j5 O& @# e

' I" W4 {# c' _- K1 M2 c
8 ]8 D% E. H% W* N" B& Q
9 V! [8 r& ~- z5 n. Y7 L5 N4 M2 j) x' a) O9 i; r2 n2 T
7 G1 i) a  j3 S
3 c% C4 \0 F, X& c9 j% r
2 [$ n" C! h( ~9 ~8 P

1 \1 i( I& J  C* h

评分

参与人数 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
好详细,多谢分享; x3 \9 e# c8 ], O, a1 {
5768340 回答时间:2018-1-13 14:42:54
HI  3 K2 j  u) Y4 i+ P
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
. T6 l6 z& M% x* W   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    * V9 A( i& q3 R0 B8 t
  2. 函数名称:Cdfinger_Bspspi_init) \2 J: T- ~# F" W/ B; M$ E
  3. 函数作用:spi初始化函数- v$ U8 \' w8 C: v! _% }
  4. 备注:
    : H: v+ ^0 J5 ]( a8 P& ^
  5. ******************************************/2 i. V1 b  Q" }& v
  6. void Cdfinger_Bspspi_init(void)
    % i3 q4 e- o+ L: F& c4 O
  7. {3 h( y7 a$ s& T$ [* K- t
  8.         GPIO_InitTypeDef GPIO_InitStructure;& s; i- |# a1 Y, Q7 I4 d0 |& a4 e
  9.         SPI_InitTypeDef  SPI_InitStructure;
    , `- n/ A3 I. {- g0 y
  10.         DMA_InitTypeDef  DMA_InitStructure;& z6 V% B- ^  B9 }! Y
  11.         NVIC_InitTypeDef NVIC_InitStructure;; X- E0 S% H8 h1 t. P
  12.   8 m8 K# M# K! I2 s4 h
  13.         int ii =0;
      r% T/ Z" Q* M. C4 G* X
  14.        
    , Y, e; V3 j% M& }* g
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    ) I/ T- s0 c% D) k
  16.         /*!< Enable SPI2 clocks */: y! L- T' S# c. z' ~$ C
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    ( y8 B7 f, `8 X" G5 U; ^
  18.         /*!< Enable GPIO clocks */5 J/ z% j$ Q/ x& `7 \+ [+ O
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    7 Y; d2 h, l+ T+ F: [+ I9 N$ a
  20.         /*!< Connect SPI pins to AF5 */
    , [( H' a% H8 Q3 u- @3 q6 T
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);: P. v: `+ A$ ~& u: F; a" Q
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
    8 n: A) |- Y5 O1 m: U& ]% l
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);. p5 C7 g6 O: E8 V  m

  24. / h( W2 H) C. m/ ?' _+ H! I4 I
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;1 j' @7 Y5 v4 {6 {
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ( j- M7 O, Z2 u
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;/ r& G9 S- y. F& _4 C& a- u
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;2 L0 @4 U# h) @" v
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;, h; u! e7 X/ T* Y6 Z$ S
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    6 [) x6 ^# X7 u" k# y0 Y" I
  31. ' ]6 _* V1 K% N, F) M9 J) m* X
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    + n1 i# O2 d! S# i& M" V& c
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;, `% C9 M6 A. M5 T
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    " {# Z1 r9 b5 Z$ F2 m. H
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 ~8 b" ], _1 E& L6 }( T0 h2 [
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;: z0 K) w5 C& L6 }# G
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    " P* _: r. R! ?
  38.         Cdfinger_BspCs_HIGH();
    + j; a7 W' K  T# J8 q, R! d
  39.         //Cdfinger_Bspdelay_ms(1);1 n3 a3 o* U8 m: ?! o$ v3 I
  40.   //Cdfinger_BspCs_LOW();7 E; ^/ e$ w6 W3 `6 e
  41.         SPI_Cmd(SPI2,DISABLE);5 u' Z$ v* Z$ @' A
  42.         SPI_DeInit(SPI2);1 M$ n; J  i  F. m) p
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    $ S3 b3 u! |, t! v: G
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;- |8 R2 F# M  v0 K6 Y  c1 X: u* g
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    ; o- U* `  W! x: G. g
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;- p; A; E& u$ X  v- Z0 l; |  U
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;9 P6 t% G1 ]6 I" V
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    . p! ?" ~  i4 ]& O/ x; d
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    ; h, k  V; h0 v! a- v3 E% L
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    / _. \3 h$ a8 H6 l' h
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;7 i! _8 ?' P" o5 Z. }0 B8 a
  52.         SPI_Init(SPI2, &SPI_InitStructure);8 M( m9 M; s& L3 X
  53. $ N- t% P' `/ T7 A* L
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    / j8 }0 R0 F6 k8 k4 b
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************// i5 w4 n  T/ X! G/ R0 t0 I6 {
  56.         DMA_DeInit(DMA1_Stream4);6 m" H- P9 V0 X. p- g* k  U
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    4 V" `7 l  s& R! {
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    " {& x( T" z" R, c
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];
    - s2 Z0 w+ H- n3 y
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    - k$ d- `4 P1 q. \% Q$ @# x9 Y' D
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    % B! @4 e- P7 Z3 n
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;+ _1 E. C- s( H$ ^( y
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;* I; p" }2 d8 B2 D& ]: E
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;+ x* A9 ]9 h. u  [; L
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    . v" X3 _& \! i! y& K% O
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;3 _! N- D- G% n8 O2 F+ ^
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
    : _  N( w% g# @1 D+ P( O
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;4 ~- }6 C/ l- n0 U  T
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    0 w+ T0 F2 V% h6 y0 M
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    ; P2 i$ V6 S  }9 Z) G
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;) E, f( L7 @1 Q* F' s
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);$ U/ R+ W- o( j# h9 P+ f6 J
  73.   
    1 A1 R6 U7 y8 \& t% ]$ U9 }* }
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    # f9 @# Q/ X: x) r3 m: ^
  75.         DMA_DeInit(DMA1_Stream3);8 D0 S9 h/ p7 b9 X" m! n* `7 r
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    ' M4 u, k  c! k9 N8 v  n
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    / R* _+ o- L, r
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];! G+ ~" L4 W- g- Q: R
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    ( x$ ]. s# ?; C# U3 R8 a2 Y2 R
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;
    ! l2 e' B7 `4 ?& ~
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    - @0 z6 d" v! a9 @
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;8 q5 B( n* f" r3 w
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    3 C% Q. X. j" b2 G1 I5 @; H7 o6 c
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;+ K' H" S) S3 d6 E% `6 X
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;3 M2 p7 Q9 k  I: V8 X
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    ( }) a4 R8 c$ Y8 v
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    / [2 e4 Q3 L1 \% d
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;8 ^" s8 P/ w' Y# n5 X
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    . o* x8 p# z9 K! S" U
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    2 w. M, _3 P( A, q- _& x7 L( m
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);( G: T1 D7 \2 G! [; \
  92.         //Cdfinger_BspCs_HIGH();% |6 P9 M- m6 z* d2 {" Z; M
  93.         - m' w% @4 ?9 d2 q! G% ^

  94. # \% l3 g) Q# R  O1 b. Z- D
  95. # t/ |( _3 F( [$ E; O. p% h9 U3 B
  96.         //发送中断
    9 ^! _$ P6 {8 f! D$ X
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);, C9 u/ ?- k, q) ?8 l' g) d" g9 _
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     4 _' j4 k0 F- |5 f; f& g1 ?
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;( |1 }8 |1 |! s/ u
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;; A( R- H, \" P2 R6 }
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;0 J* o9 m' N2 m2 h
  102.         NVIC_Init(&NVIC_InitStructure);. z3 |4 E: i1 J1 B; v$ y
  103.        
    6 L2 d0 x+ u  z
  104.         //接收中断
    1 J9 Z) x3 u6 e* Q  c
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);' Z( o) f  u+ C7 d0 {$ {
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    7 Z7 g+ A. ]# u- f6 L, v
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;7 e0 e( {$ m: S# ^5 U9 F; l1 f: M
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;7 n! k! P. b$ y
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;$ t3 L0 \7 z1 W3 _' B
  110.         NVIC_Init(&NVIC_InitStructure);  h9 B$ F' A+ L' W$ _& M
  111.         SPI_TIModeCmd(SPI2,ENABLE);3 J$ S& O. _2 [
  112.         SPI_Cmd(SPI2, ENABLE);
    / K  L7 D/ C8 `  v& U3 F8 w
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    % z/ I7 E9 N6 T* s, J: a" Y2 C
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);6 q3 L4 ^$ D2 p* @9 u: o) a6 D

  115.   k! N/ D/ K5 \7 Z
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);- J; I% L: b8 u4 A
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);" ^" x0 t; w  ^: b5 W6 ~9 w) }' H
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    ' F8 I( P" w& X
  119. ; Z9 g9 p  M& {# J- w3 }/ J$ x
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    # M7 p2 B; M8 R) ^( A$ O
  121.         {
    2 y9 Q( i6 ~; G) L7 P
  122.           if(ii%8==0)
    7 ]* K5 H& v. I3 X  b, h
  123.                 {6 V/ P. [/ n3 q# ^
  124.                                 printf("\r\n");+ ?+ X6 I3 {! Z% E! J4 M8 k
  125.                 }
    1 U4 [+ e* @: m/ Z
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);7 H9 h6 n3 L6 M' ?1 r
  127.         }
    3 @7 k9 G- D8 t5 b. B( k
  128.         printf("111\r\n");! Q; T' p& E1 g) s4 @% {$ S2 f! M
  129. }0 n& L& k. s7 \) C
  130. ! Y7 M6 y/ g6 Q9 @! f; v
  131. 9 x4 V, x9 s9 R& C# `! X7 C& ~! d
  132. void DMA1_Stream4_IRQHandler(void)
    , P& R) E$ F- d. G& I& r* V6 s1 p
  133. {
    / M3 Q$ z2 [) S6 P& }
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)( d! K4 q) X5 D# e
  135.   {& w1 A; Y7 k0 k( y
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));( @! g9 l5 c- p: ]: [" p0 ^' K
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    " Q' {7 S/ [" G! U9 O" r% V7 j2 L9 I
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
    ! @- R$ u7 O- K- o2 @4 Y/ {+ m
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);' B3 `" y: ^/ Z5 L. B
  140.   }- l' V" [* Z& i/ F
  141. }
    7 q& Q: o4 d' M8 n# Z$ M, ^

  142. 9 V# n  W2 e) K+ x) v9 N; a! O
  143. void DMA1_Stream3_IRQHandler(void)
    8 Z+ n( N9 h( v6 [
  144. {. [# a8 Q) e: v7 U
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)2 b8 D' ^, p1 S4 v! U6 L2 i0 e
  146.   {+ e6 N# e3 d" Y" K
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));. |. ~, F9 ?; c% l6 b! ^
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    ( R  T' E0 X1 F- N0 ?- c0 z
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    3 a5 q' T# G6 P& G5 |
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);, _  l: z( F8 g- M) D" ]% B
  151.   }
    $ j4 ^7 Z: K3 @# t
  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的波特率是不是必须为相同的,才能正确通信
) c8 |0 H3 Y0 g以下是全部代码:4 z6 ~! f/ q. c$ `/ V" M( X. q
#include&quot;stm32F4xx.h&quot;, D* h1 Y' X' `7 z  P0 Y1 o# W
void RCC_Configuration(void);
' ]5 p/ ~, @8 y$ {) |  ]void GPIO_Configuration(void);
+ a# A' ^- W% I1 U" _% ivoid SPI_Configuration(void);
  x8 k6 I4 t# N# q2 O5 ivoid Delay(int nCount);
( O, M7 ~. S8 N1 X  h2 lint main(void)
. e* n% x' D0 \7 [' P{  RCC_Configuration();3 o5 y- p/ y) Y: b1 |9 G5 E3 w
  GPIO_Configuration();
# c& [8 U6 f) J4 x* u8 W  SPI_Configuration();
- Z  Y# m% k. b, u  [5 e. x2 d- _ while(1). G7 e4 P1 Y) ^/ e
 { int data=0;
1 ~; \" W1 M8 B2 l9 I  SPI_SendData(SPI1,0x55);3 }) h! l! ?5 p9 B! O0 h) B/ [
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); , d- A' B2 j; I# I' @5 ]
  data=SPI_ReceiveData(SPI2);
8 w+ B" z( _! ^* X0 D2 @% D4 x$ A1 f  if(data==0x55)
% u9 p1 C2 \/ t: W$ P0 I; _     {  while(1)2 z; \: q$ i  f$ M% m# I
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
0 d7 N& U! [) {/ F% H1 l4 F0 V                Delay(0xfffff);
: n! Z, V# o7 b4 F1 }                GPIO_ResetBits(GPIOA,GPIO_Pin_4);( \; R- v* P  l+ \, W( L
                Delay(0xfffff);# ~; f9 d: M% e' @- v1 A
     U6 n% ~$ f& `3 Q; @3 }
             };
# w8 S( P4 z$ [     }7 G% o" b+ K6 K# x" B0 R
     else while(1)
4 c+ F+ w- B6 f            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
- h/ l! ~3 r  w$ i% l               //Delay(0xfffff);
6 l5 k: _. ^" b% k- E8 U; f               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
" s8 ^' L! ]1 {8 X               //Delay(0xfffff);
/ _7 |% q) ?; u2 E0 j  
9 y( Y- T& t* j6 {5 W            };! p3 K: l$ w, w& Y. T& _
 }4 r8 |% L: [3 Z7 W9 s) E3 I- J
}
( o, u3 Q2 u( H: avoid RCC_Configuration()
+ ?9 Q$ k% ~" G0 c5 d" u{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);6 g: W' i8 Y; k: N$ q! u
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);' k5 ]) `& H, F4 H& O: |
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
; t2 E/ I+ K. A% ^' }$ B/ _! N}
: V( D; k4 w+ Pvoid GPIO_Configuration()) r8 M. L  j4 q# y/ {3 \$ [
{  GPIO_InitTypeDef GPIO_InitStructure;
) h) w- ^+ T- `" n) h/ f  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;$ }) [+ L  Y! l6 e* p7 J+ N5 [
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;& j/ K5 M9 M2 V
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
; R2 O0 k# m! J3 p# z( j/ X5 {  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
: G  v; ]" ^$ y8 |$ B$ k( O2 S  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;- X4 }. }; a7 r- ^$ [2 Y  H
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);: M7 a# C1 v5 \! J. ~1 M
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
6 z) j; A' v4 |5 q. V0 r7 |: H  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
& O. `( D1 G. \3 V% W( A  o  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
2 J7 r- Z# a: l& S6 k$ u. _" x  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;8 E* |9 G0 G& {/ c
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;1 q% `$ U3 f9 N# o* Y3 J
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
! F! w3 y! Y$ i; _5 i  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
- w: u/ _, F  F9 b  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
! Z. d) S( x$ Z3 z}
3 i) o8 Y1 P: S* \# r# x- a7 Tvoid SPI_Configuration()
6 k: H# Z9 R/ u9 q3 B1 \{  SPI_InitTypeDef SPI_InitStructure;
- t5 f# ]/ Q/ f. x7 P7 O/ o  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);. w+ q/ K* s/ v. w, |! C
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
$ ^' @9 z: s# m( \; q4 d9 ]0 {7 n  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);" i; ~* t8 _# H4 F; ~/ V
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);1 Y# f! S, {2 q* c0 a1 a. E& v
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
! e& \3 ]; I7 Q+ \- a, s  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
- P1 {  `, c+ d' l  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;( H. Q! [. k) L0 B' _9 {8 }
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
$ x0 d' t0 ?; j" h7 [  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;/ C; Z! T) P) H0 l
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
9 \" g/ D  B( k3 o, m  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;: g' f; N3 ^, n  M
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+ p5 B5 ]: V- I& ~/ ^( y' _2 \7 h   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;. f  Y* _$ r% c4 K+ ]. p
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
6 ~* F3 @  H/ k9 A- a6 x* O5 T  SPI_Init(SPI1, &amp;SPI_InitStructure);
& j- n( s9 @: L" C  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
3 p% J% `+ I* p/ ]2 K6 y" k7 M3 c   SPI_Init(SPI2, &amp;SPI_InitStructure);2 M& @/ O. E$ ]
   SPI_Cmd(SPI1,ENABLE);
8 |1 K) S* |2 @2 b; [4 M   SPI_Cmd(SPI2,ENABLE); 4 |. z6 J- t1 \% I& X- L
}
1 R* r8 h+ |: i* Lvoid Delay(int nCount)# H' v3 M0 O' M
{ int c1=nCount;
. m  n( W8 n* z. T! a int c2=nCount;: k: A- n; o: X: L! b$ b
 for(;c1&gt;0;c1--)
: Y1 J% W; d" i, L6 m! ?  {
5 L2 i. C% `# H6 r1 k7 I% G, x. o  for(;c2&gt;0;c2--);8 A9 m& o- P7 \' m* p8 ?: P
 };$ f3 @7 M9 P) Z$ f3 X4 B
}! x/ U$ z1 m, k( ^9 E& c% }- i
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:
6 b1 s! _7 ~' H5 T  _6 T楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信' \8 w. b$ V( G6 n1 d) ^
以下是全部代码:
9 I2 H% p- M" C# z& E#include&quot;stm32F4xx.h&quot;
% b! z0 p% C% u# j3 s* Nvoid RCC_Configuration(void);
5 O* d! P7 h, m" X- Bvoid GPIO_Configuration(void);
  e: m4 w( l3 L% M2 f2 W+ c; kvoid SPI_Configuration(void);
( O* {+ M) u+ p8 cvoid Delay(int nCount);% v, ]; L. }  _8 ^, s3 d
int main(void)
# a* m+ C! v+ k, d{  RCC_Configuration();; ?* f6 J# n6 u: Z% ]8 `
  GPIO_Configuration();
4 Y  ^, N9 O( t. |  SPI_Configuration();! t" B) ]5 I1 P
 while(1)* o7 x5 E7 \2 |5 }( P8 {: V4 H; @
 { int data=0;' w; n& k; |: y$ S' q
  SPI_SendData(SPI1,0x55);: m3 J. B; Z6 a0 Z3 p- Z
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); ' y+ i( L: p" r
  data=SPI_ReceiveData(SPI2);
5 {( h0 q' r: I$ K* e2 c  if(data==0x55)  G* ?2 z& r3 G8 K' N4 v
     {  while(1)& m/ X7 X- A$ I$ V$ q' }
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
" `! I% K. `9 i: M/ p                Delay(0xfffff);3 o/ W; U9 h: B/ q9 i8 A' t8 E
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
/ v* [5 y$ l" P% a& P! P                Delay(0xfffff);* {! u/ `3 G& B% C9 \( q) p% ]
   $ i% A" v" ~$ d3 x1 G! _
             };
$ \' D" y3 k9 S" A3 i     }
+ n) W+ E+ v0 f* Y     else while(1)
: d1 L0 M; H" z' C& ?3 z            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);. j! s, T" C0 p2 F. x$ P: |7 z! B
               //Delay(0xfffff);
$ n% ~. Y* S, X+ M% V               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);6 @) _5 f# C* V* C% K7 d
               //Delay(0xfffff);0 L& h& B% X, i7 ]
  
; M0 Z; x$ r- @            };2 S# ^# n" N' _8 a
 }
9 k- ~7 q( w7 k( U' [$ ^# u6 o, P}
  a4 J6 I  d) J8 |/ [- l7 jvoid RCC_Configuration()0 t7 ?6 q/ u0 J- C
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);; h' w5 ^9 e3 J" v5 Y
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);0 j9 R# t1 }3 y
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   4 v, J4 X; O, P' @: X" e* h, h5 j4 R
}
8 f. x( C8 {) @7 Y+ y: T, s! Xvoid GPIO_Configuration()
& f9 N0 y1 `7 x2 e: |* V4 p7 o{  GPIO_InitTypeDef GPIO_InitStructure;
* G# y$ K0 Z8 A4 ~$ J" O( g  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;7 F% k( U8 ]" H
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;/ E% _5 x, J4 t% n. d- l
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;% J( i8 \) M- }* a5 b) L0 {2 P8 t
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;( Q4 H4 ~! f8 K& ^" ]
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;: T* [+ D9 j8 P/ j4 m
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
1 r( ?: ~0 S9 z# o, x3 n2 a% i  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;& _( d( D' ?2 w$ ^
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
7 S1 Z4 y* ?0 q$ W  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;( X( |' T/ l7 ~' C$ C
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;- Q! m9 R4 b& {3 Z/ z
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
' k4 m$ r  E5 r( a  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);; ?6 g0 j- I; I2 K
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
/ o' C  K8 l' y/ D8 u1 U; \; d  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);2 d  f5 N8 E- `6 k4 [
}+ F% b8 l8 X1 P) g- J
void SPI_Configuration()
4 u; j& a, M9 I6 m2 s- X5 I{  SPI_InitTypeDef SPI_InitStructure;9 N4 n- ^9 m9 t; w2 m4 ?
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);8 `5 [2 l6 ?1 c. J  D- M& y
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
/ M% D! W9 Q( Z- U* z' a  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);3 ~5 `) z# S" Y3 }
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);' V& n3 k; a5 ~2 o3 |7 b9 |, \% C
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);  {6 {$ H# R2 m% b/ U. C3 Z
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);; l; o* H0 g: O. P2 B% S8 W
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
$ u+ n! x& t( Y* o$ C/ E% M  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
1 c$ y! m; p$ d0 `6 P& b  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;' a$ T6 K/ L, i
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;7 l4 ?* H7 e2 x& B
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
/ _: }. N6 X, Q" y4 `: i  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
+ M" `6 [! p! v$ u: D# p   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
5 J! X' f! P' g$ T; ~+ [/ b   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;3 U* @, v! A% O$ x
  SPI_Init(SPI1, &amp;SPI_InitStructure);4 [) u! f2 V+ V/ u& Y, ^- j3 h% f
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
3 j/ g. @- @" p   SPI_Init(SPI2, &amp;SPI_InitStructure);
1 L; K! f& c: Y3 d; M   SPI_Cmd(SPI1,ENABLE);# e5 x% [% ~( ]1 g5 n. k3 P7 c
   SPI_Cmd(SPI2,ENABLE); * A9 x* ~3 p  x  H
}6 d& R3 c6 b& g* Y
void Delay(int nCount)
$ I9 H+ i( x) G3 I4 x! z4 J{ int c1=nCount;
$ l* a  j% X! J% e8 c6 N7 t int c2=nCount;" r% Z8 b- b; N' n, b( S6 o
 for(;c1&gt;0;c1--)1 j. E% v0 ^( z+ ~" s% ^- y! V
  {
5 m, a( P" B6 I" S  for(;c2&gt;0;c2--);! P$ X+ x: ?# ^: E0 G& j. e
 };7 C% x/ m2 V/ S5 o" _. E
}
6 r* U. }) M) ~0 }0 M先谢谢了~~
' z: ?2 m1 E0 |1 C ! y9 [, _) J! G# q$ \' {

/ V/ {5 N5 w" y9 F楼上的问题,看我帖子给出的提示哦~
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发表:; Z0 g. e" m; j5 g1 L& `! O, a
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。: {: H4 ?- P$ Z: \' L1 \
 
8 d. ?" K, r5 p, N5 j
) u; I( ?" ]2 S1 C1 M8 ~- v( L多谢支持!!
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 运算效率不高

  4 l3 G8 y6 H7 f& V. y
鬼魅一样的Hard Fault, u: K* U# g# |1 O
 
. k" }9 B1 S2 d1 f该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
' w5 q+ s, E0 e6 q" l, w 
! T- \3 Z9 d8 K7 _. ~咋解决?
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 手机版