请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表0 ?/ G* {  X. N5 m0 L) }; F
& R6 s( F2 h. P5 s7 L2 A
& g2 o9 _5 b9 g/ ^* Q  W
社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
" M) r. U# u1 N
# ?& K9 ]4 K2 x( N( g" O提示:点击各主题,进入帖子,可下载ST工程师解答详请. ^  x# r9 d$ S+ q
6 r; k& i; s; `$ T3 d7 h) w  {8 p
0 a9 N( z+ B' ]5 e1 d
一、通信接口
- z( X$ Z8 q0 ?; F# d & S! m+ y0 f( b. D$ {4 h4 p
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新$ B$ N+ x7 K/ t$ v
% ]2 V6 c0 ^/ U" ^# d6 T! x
2. SPI 接口发片选信号导致死机
! B1 U' S1 z# a/ d4 n3 e3 o8 L $ z. N$ n; i/ ?' u
3. USART1不能设定600BPS的波特率, @/ ]8 g' D, c; p0 ]

( j: O' c9 |6 R7 r$ e+ k2 F) D4. I2C 接口进入 Busy 状态不能退出
. |( M: {4 a' Z! O% z$ B
" y3 J7 V6 J# Y8 V) x1 P" F$ J5. 对 Flash操作导致 USARTU接收丢数据
& u: p: _" ^4 F: }' }: p" z1 J ; \2 K6 z3 q) Z- ^
6. USB接口易损坏
3 [. D' q1 E# O5 ] 6 t% G4 p1 {9 u# O# h. u" x
7. UART发送数据丢失最后一个字节  Z+ P  k. }* ^  J9 h. g/ r

' A/ N7 n  u5 v' r+ ]8 l; T$ V# q8. 使用 CCM 导致以太网通信失败# m) P3 P  _  a# w3 g; R5 x$ l
2 A2 M0 l' f7 Y5 k
9. SPI3 接口没有信号送出: X6 [, P5 D5 z$ ^" k
; l) A# P1 L1 ~2 W
10. 时钟延展导致 I2C 通信不可靠8 ^% W4 w$ Y; R
) b/ c' G8 ?1 j2 D5 \. j
11. M0的USART波特率自动识别问题
7 c, _, K+ o! W7 Q 6 L# [* }; n/ B, W
12. WK15 OTG做U盘主机兼容性提高
+ J# A- T; ?& W6 L
+ A' }7 c6 `" F! M. G9 ^13. 以太网电路设计注意事项4 Q5 i8 L4 M6 o; {
. C9 Z4 h- G5 N5 H- Y9 C
14. OUG主机库在BULK传输上对NAK的处理
6 x' {# [' D, ?, M$ |
1 e; @+ ?9 f* m- M2 N15. 串口断帧检测
, n+ |2 \3 @/ a7 ~   ^: ?2 M- H' I6 g: L8 B
16. VCP例程用于数据传输时丢失数据的处理
' Z' k# v: |' b ) I& r5 x$ e( z" ?
17. STM8L051F3P6串口UART数据起始位判断的问题, ~+ N7 q- O0 u7 \9 n" \. F" F& o: @: g
5 V, m# d0 M( B& o6 l+ u5 y
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号
4 n* z& e0 _' u: j) Q . ]. A. E$ t( r( _* }/ v" Z: H! `' f
19. STM8中UART奇偶校验的使用方法
0 ~& ]; i- ^+ J9 J 6 `+ ^3 }  n9 x# Z9 e3 o
20. STM32以太网硬件设计——PHY
. p% ]1 ?6 h# y2 j/ c6 t- n0 f2 C1 F* h3 S2 F& p
21. 一个判断I2C总线通信异常原因的方法& e; X/ r+ V" `/ N8 M1 _; n6 ^

$ O1 x$ D7 e% i. l22. USB device库使用说明
* R0 x' X# x& ]$ r
  e- @3 k2 y7 ~6 e! J* d23. STM32F103上USB的端点资源; i- N( O% r1 V: S0 ~

: t4 w7 n9 o3 O( g" z( {' }9 k  {24. 使用CubeMX生成TCPEchoServer程序# k( Q( A+ e- R% X) F5 }1 `* @

6 e' ]( i9 `7 c( D25. SPI接收数据移位
3 \8 s& L" \$ X$ a7 a7 ]0 Y9 x) f ; q5 H9 o* S' Z" `0 N3 t
26. STM32F0中Guard Time的设置
- }) k" t! E4 |9 Y9 P  u. D( X& c0 n& x6 @! m+ e
27. LwIP内存配置
, H8 x9 M: ^/ ?& b0 J: S4 W3 T: M; J( ^" x# j% o$ s! F. z
28. STM32 USB Device的简易验证方法
0 M# ~! o' _& y" O3 f7 `+ z1 G& j! H0 M4 j6 _8 j
29. USART 中断方式接收无响应问题的一种情况及其处理方法3 u5 }2 ~" N+ _

5 S! T0 {+ H/ ]30. STM32 基于 Nucleo板 CAN总线的建立
3 h6 t" y# ^  Q- i6 g8 z, Z$ H+ H/ s) V; u$ [# H
31. STM8 CAN总线的IdMask模式的讲解
0 k' C" {: l  ^/ e5 C
4 h0 ]$ G4 C5 g5 j) O2 N; ?- {4 e32. STM32F746ZG USB 驱动不正常 ! ~3 S" u: N1 \% [
, x. g& M; {% V) m
33. MCU在STOP状态下通过UART唤醒分析
" o: w6 h; B" |# Z
7 d3 m( i; s6 n$ v  F+ x2 f) f34. 通过STM32CubeMX生成HID双向通讯工程 " C2 P% Q9 r- g" g  i# g% o' m7 U0 _

. g. C5 V3 V4 |35. 串口工作在DMA模式下有时接收异常
: @8 N; I- @8 Y& R! o# E
9 _1 K; U/ E* W$ N: [8 {36. STM32 Bootloader中 DFU使用限制/ S. w4 G5 Q- y+ u3 B

4 t7 k2 g5 u0 Z6 v37. UART异常错误分析0 _) }  ?" d# i/ m' s9 ?/ l$ a
# W, V7 Z$ R) H$ k7 f* T: i* P& x
38. 基于Cube库无法检测CAN2的接收中断
$ Q6 J( Y7 V/ Y0 x+ V
! ~3 g* P2 g" ~39. 基于STM32F7的网络时间同步客户端实现
- c5 x4 ]; Q* ]( K9 G
6 l0 `3 I9 p- p5 g/ z! h" o40. HID与音频冲突问题
4 X! F' w7 f( r) m: D9 f3 H+ h1 H9 u0 B6 A! i, N: m5 y
41. 在进行USB CDC类开发时,无法发送64整数倍的数据
# t/ ~2 ?+ h* n8 ~7 o6 w/ @0 g, ^. W. S$ g1 {
42. 从零开始使用CubeMX创建以太网工程8 q1 k0 K7 i* u& e% K

) G. ?1 ]$ z0 `+ O. x) t2 N43. STM32F4xxx的I2C总线挂起异常处理/ G# N' S; d2 Q. r9 C9 f

+ d! D, D1 z% [- W. _' m' G6 X7 t44. LPUART唤醒STOP MODE下的MCU
; \, G1 c; x4 M' S5 ~9 E# V& E1 \/ S; K; E9 `5 t. u1 J6 g; Q8 I* V
45. STM32系列 MCU模拟双盘符 U盘的应用
% @5 T2 t1 `, D8 c4 s3 p9 e$ r1 b( Z% K" O- n% J
46. CEC输出的数据和数据长度始终不匹配' b! j5 `6 s* t0 |

" J+ v2 `! @, a$ h" ~( m47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
! |+ T  e) D$ W% l/ j' |) g! p3 v* ]1 h( X, R; p; h  Z, J" F
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)+ X$ U$ y  b4 A7 p8 X/ X4 ^6 \

( l7 M9 t; P+ N2 C# y7 \49. 增加UART接口应用时的异常分析
, R( Y# Q% t5 l9 U% T& ~, C# p6 ?5 N6 ?  p" i" H
50.UART应用异常案例分析% G" w/ N4 a/ U+ i* ~
' f: L# u5 z& {# N6 f9 R6 {. v4 `
51. I2C配置顺序引发的异常案例
' }7 I2 h( @6 _6 m* Q( G
7 Y; I& Y4 s) I& Y2 ~, G52. STM32 USBD VBUS GPIO" F) z5 {- N2 s: D
* I$ O  n) z0 M- M( h
53. USB传输数据时出现卡顿现象
1 P1 d8 G9 A0 `4 p( @# v9 z5 T' `. b8 \  P' ~3 B, |2 [% c- B
54. STM32的高速USB信号质量测试实现, t$ {8 r1 S/ v$ w, [3 E* H

, ^6 g4 ]$ E3 r; Y# @- p  j55. 基于STM32 I2S的音频应用开发介绍9 l4 j1 i$ e* `- b2 e, s$ G

5 K5 [+ b$ N( ~* m9 R. r9 V56. HID_CDC复合设备在WIN10的识别问题  ( o/ h  [4 l1 I9 g. ?
/ V- `) c. j5 C1 g, l9 H
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  1 K. N1 A9 s( s
4 R5 I9 M' ?/ t4 G, o
58. 一个关于LPUART输出异常的问题分享  
3 i2 y: |5 X* A% U) n- Z3 s
1 Y% ?6 y1 J/ E5 A2 C# H) ]$ d
59.通过 DfuSe 工具控制程序跳进 DFU 模式! w" M1 c4 F; f) ?: r

/ \% o  d6 J0 h, G60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)0 D' A6 V' e% Q6 j+ D! E& f5 a
8 ~; g6 t; T  f8 S+ `1 J" q
61.一个因初始化顺序而导致异常的话题 (2019.12.24)
! \9 I' X) S- z8 z5 M1 v3 ~8 z7 \

0 i7 B0 `. g- B$ `' f. t" F62.MC SDK 5.x 中增加位置环 (2020.5.29)
- Q( q- ~( o" j2 D0 d0 V$ Q8 z

! O4 F2 z5 `9 q. l63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)4 t# p; S  P6 m% b4 X

- W4 Y8 ~- }1 Y7 E" k" K- Y64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)
) Q; A. _9 ?7 v6 U' u2 Z8 P( u" d5 ]2 m) b" @$ o
二、电源与复位
0 z$ h2 @- v' k + ^* @. n9 c9 G# ?0 W
1. Vbat管脚上的怪现象
2 c5 P. w  @, Q& E# S) }
) M' w$ h6 e( c, |6 Y  ~/ `2 s% T2. 上电缓慢导致复位不良) }% k, W# a2 x' A* T

$ Z5 A4 ?( G* [, A: v9 f2 b3. 关闭电源还在运行6 c) X) T+ S5 O) H; z/ Q) A

6 z: G, Y: B: r7 \2 g4. 使用STM32 实现锂电充电器: O( e8 T) ]5 P. ^' y1 s
3 e) |3 N+ d7 U
5. STM8L152 IDD电流测量7 V3 z" m1 z  z! l3 o0 c4 O0 n

& \. N* M  x  w4 g6. STM8连续复位问题9 p4 ?3 E5 [/ i' K$ J1 I; v

7 u4 m, k4 t4 l4 K& Z+ H, r' x  I7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
: o7 v" I' K4 h! U/ {+ @# |+ v9 s0 k  x! J7 O
8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流- B  \3 y$ ^2 a6 m" i' n/ ]( c

5 d# A0 b) D4 A9. STM32F7与STM32F4的复位序列比较# D+ W6 z% M, n' Z! X0 Z. q

. c" H+ I5 }$ Z; j! `/ s0 v+ Z10. STM32F107 复位标志问题 ! C8 r3 Z/ a! F: I; ]

" R. @9 @( `" B$ b& g) a11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
- O: _" S" g4 @  i$ \$ n
  m4 U$ X+ K# M9 j7 E 12. Nucleo_L053不上电也能运行
0 @1 C6 N( {& X% h5 \: \  s! J2 T7 t  N; G1 x- k. G
13. STM32L4中STOP2模式下的漏电流' p  s" T/ ]5 L/ L

$ a  q" s2 K; R. X& n14. 在没有外置晶振时HSE_RDY异常置位. a; n/ V* [. k: X6 {3 ]% [
. o( l) |; [* Y9 }
15. FLASH被异常改写   (2018.5更新)) p/ U9 @' S5 H9 s2 I+ i' j8 c

( o1 j8 w+ n; n) i4 A16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)$ x- B5 E: `+ M4 D) W/ P; y
! g9 ]0 J# v  c* M( d% a
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)
! O% `: N! `6 M. B7 {( J' |) \" _& m0 ^; r% w1 ]( S
三、IAP和Bootloader; J& {! t' \2 E1 `" t$ V% r& @
: g* A) O  u% |& E# T2 n
1. Boot Loader与上位机通信不稳定/ T+ ~2 @9 j, E' h
0 b: N- `6 Y8 b$ d
2. IAP+APP 模式下不能启动 RTOS4 v  r* ?0 n/ x5 d3 K, O' E

# Z# f/ D; G! F6 H3. 从 IAP Loader 向 App 跳转不可靠; _6 v  E) W" P9 w. I6 v

4 p  {# [% X+ v4. STM32 MCU IAP例程跳转到APP代码简要分析
+ f: Z, d3 k4 z% T
8 K6 w4 M+ ?3 h+ }9 F, t5. STM32F091从自举程序向应用程序跳转的问题与解决
: z1 F3 ]- k4 {4 o7 f
7 g& r5 V8 j; O1 T4 D6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
: x, l& I3 j6 C8 n7 h& d
; s" t! i) ^9 [6 O% y  l1 f7. STM32F0启动模式相关问题探讨
- z  P( l) C1 c& w$ J. i" O" O3 Y
: A1 _/ m( d' b% A8.STM32F091空片使用System Bootloader下载代码
4 _, ]5 A& }% U% q+ f( w
2 W$ i1 S2 m* |3 m  [7 o: i9.STM8L  IAP 应用程序中编程指导
0 [3 d- }+ F1 ^ 5 F0 h4 v2 U/ x: v
10. 如何通过STM32的串口实现简易脱机编程器0 [% _) @- s8 B2 |

) D: A! V6 p4 ^5 e! H. Q) h11. 一种从用户代码调用系统存储器中Bootloader 的方法  
. N1 w* P+ t$ m& l. }: d# L
6 V& d3 O9 [$ o  I12. 利用 USB DFU实现 IAP功能
, a+ i/ r0 a  n3 l
; i; E, l4 h5 B6 i13. STM32 Bootloader中 DFU使用限制$ I  M; s; {# @# K7 Y3 ~3 G" o' x

$ P/ B1 I. V  |/ L9 F( J% S! j14. STM32L011x和STM32L021x启动模式注意事项$ W) _/ u1 M3 F- m/ T
/ K' w4 `8 V; Q% U
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项 , P/ K  a1 p7 N' \- A

- ]2 d) e8 w. p7 G16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
0 j7 q0 `, D$ C1 N
, M6 P9 f# d* t, m" }2 z1 x+ J17. 如何使用STM32NUCLEO 板来测试串口Bootloader
' M/ n" O- @  W/ P# P' U
% d# o- I4 W4 z) V  e18. 在STM32L011上通过I2C接口实现IAP
) c. U/ G" m; G) E5 d$ b4 H8 n3 G9 d! F. O" u  J$ J( c
19. 在IAR中实现通过将程序在SRAM中调试的方法
" P$ Z1 Q( ~( v
, A1 @6 A( t( E20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题, n' W- v% S4 B9 _5 @$ [
  R2 J& }; Y2 l/ S2 E7 e
21. USB DFU IAP 例程移植的两个话题
3 E1 s) t" a4 a% P) P, A  `
3 t9 z* R) p4 a$ J9 z0 J22. STM32F769双bank启动3 h& M( c! N; O# B4 T  E

4 f* w  S: p) l: B7 M23. DFU加载 工具 DfuSeCommand的使用* m0 \! G/ F- c  h
. H4 |2 U6 I4 z: k3 u- {, C+ ~5 F4 B
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码    - s0 @! O+ I7 _" f
$ e1 M7 }$ S& w$ {
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)* T& a' |2 y- V* k; ~& \& w6 w8 S

2 Q' c" D$ n- A" G, g/ }, u26.STM32 Bootloader异常复位案例(2019.4)6 Z. D& x7 Z: ^; }* |3 K
1 K  Q+ _8 A4 L& H
四、存储器% ~; K" S: M  u$ k0 h. I3 a
. g/ o+ v% e3 N! K. {: Q! q1 c
1. 对 Flash操作导致 USARTU接收丢数据  P6 S- W$ f0 H0 I

9 m* _: t7 t3 T* K2. 使用外部 SRAM 导致死机9 b3 j& }* m7 Q! r3 r6 e6 g& y+ F

4 o, e. T: g9 W  p1 W$ q2 h$ `3. SRAM 中的数据丢失! ^( P- V  e% U* H
9 [6 J" K5 e' E& O7 |) U0 g$ x6 b0 Z
4. 干扰环境下 Flash 数据丢失
0 E4 k0 P/ O1 g' X & I3 k* h3 |! c2 x' v  [
5. 使用 CCM 导致以太网通信失败/ m+ F& b) A* P2 h

# P3 L3 X0 `8 u% o6. STM32F429使用外扩SDRAM运行程序的方法4 u" s, ?8 N8 b( |

: Z4 c; `, G; p+ ?& {2 d7. 使用STVP实现对STM32L1系列EEPROM预置数据
. ?5 U2 _4 c1 C, b
1 e% V' t+ Z) S0 J: k7 ^  s8. FreeRTOS RAM使用情况及优化方法4 S0 F  e& L7 h6 k1 U8 F

, e4 y7 K; Q, I& M9. 在IAR 6.5下如何将数据存放至flash中
$ f' N4 z: \, X
* a* ]5 E. X9 n, |10. IAR下如何让程序在RAM中运行1 W1 G" _: o# S, a$ z
) l# p: r, A  I' L
11. RAM上电后初始值问题
1 \* p; @2 z) k: G& ~: M5 M
# r3 S; M1 J/ W! t0 V- F6 Q12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
5 t6 J; |9 i1 z0 z0 Z$ z/ _
" e8 d: z3 p, A+ e5 ~" `% h13. LwIP内存配置+ l$ q) }. G5 d. @9 R4 ]

" t+ }9 R* y/ e; t; b14. STM32F2高低温死机问题
) V- Q2 d/ |$ U6 u/ b  j5 Y3 y& l
15. 使用STM32F427的CCM RAM时遇到的问题, X; l  y6 _7 h0 O5 c

5 n9 E6 T# N1 k  L6 ?- c16. 利用QuadSPI外扩串行NOR Flash的实现  9 ~' C/ k( C4 ?* E
# J$ L) ], L, |3 X
17. STM32擦除内部FLASH时间过长导致IWDG复位     
8 s! M1 Q7 Z2 }, c2 l
+ e, X% X" C9 K( B" b( s

) {6 _( Y$ i$ o& y% t" G( [( M18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
7 M0 h& n* @7 w% j8 O5 {& `: T. u& D8 s
五、模拟外设5 U. q2 I* z1 ^3 |# A

6 w0 t" I8 i4 r- U7 Q# g2 A; |8 u1. ADC对小信号的转换结果为零
" i/ @1 d+ p4 q; g; R/ j+ f8 x
! T1 t' F/ v5 t% G2. ADC键盘读不准- Y+ Y, b0 F* }8 f. b0 T

9 [0 I' P* x- B! Y" ^$ U3. 扫描模式下 ADC 发生通道间串扰5 |( B# U: H, A$ |$ \5 Z/ P# }7 A

2 e' D4 u4 c1 |4 G& [% O  E4. DAC无法输出0V的问题分析解决7 k1 J  a% F* Y: [0 C  i7 g
4 E$ K$ y& N! x; S3 v( u
5. DAC无法输出满量程电压的分析解决
# N. e8 z: a0 \. i
" k3 j! a9 J: F/ E4 I6. STM32F30x 的ADC 采样的傅立叶变换
% r8 L6 [8 s, e1 G4 H+ H8 Y6 E! M1 C. H3 X
7. STM32 F1系列 DAC的示例详解( t4 a8 o; ]3 D/ ^7 }1 c7 P
" W& E; t( t) |0 ^* a) [
8. ADC 连续模式采样浮空引脚问题
0 ~: d4 S# J0 a# L6 V1 ?, _
. |1 U" J9 Z! Z8 }9. PWM硬件间隔触发ADC
$ q) R) ]# k3 ^& k  \0 N7 t5 B4 t: a. _- p8 [5 f4 H
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC5 B5 M) B! ]( f7 A5 J" z
  t0 ~5 V; r% A9 F/ ~3 f# w
11. STM32L4 系列中ADC 通道配置上的区别
. Y+ C6 k/ z( P( H( A: `* X0 n# ^! R4 z
12. STM32 ADC模拟看门狗及其应用
6 w1 `: M+ `$ \% X2 m# b
( ~  Z7 B/ j" L4 W/ M; i13. STM32L053 comp2 比较电压无效问题 / u9 A* J; p: j" N8 z' T
' u$ B5 R8 W' c9 g: o. H+ `
14. 运算放大器OPAMP在STM32L4上的应用$ e2 I, W5 P/ ~2 W6 q& V( `
; c, H; }4 _5 d  }2 K( _* S/ }: V
15. STM32 OTA例程之ESP8266使用 / M; k" Q8 P# I7 R

) [. i' R" w0 k16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)3 A" q6 }! j  s1 _4 v
% A. x# }# O0 x- A, i& s5 h
六、计数外设
0 S2 f$ Y4 W3 P2 N) ?3 G. K. U 2 u/ R6 e  j8 d
1. Watch Dog 失效+ y% p. l  I* i4 j* z# p& r, a0 F

2 I, N  U, I, F2. RTC计秒不均匀; B( r: i; L: ~" o5 x
5 t$ p, y" D* G- {, w/ I$ _5 H
3. 软件启动模式导致 IWatchDog 失效
2 c4 _% e6 f$ `, z0 q( K
/ x- j2 \3 F- t8 V, \/ O' }: n4. STM32F030R8 定时器移植问题9 K, [+ V  ^+ E% I# c

2 M( Y% V3 m; V0 E2 }5. STM32F0使用RTC Tamper的几个注意事项+ ?" O# Y1 W; G

& f$ |) ?  O0 e  u) h0 i6. STM32L053可控PWM脉冲方法之DMA% ?! c8 g8 L7 F$ k& y. ^5 v
- I4 J/ c) {' v( _7 K
7. CounterMode,OCMode与OCPolarity关系7 A1 K2 t( I; h- r; Z0 C
1 K1 A5 m- A+ U- o3 {% n( b
8. STM32L053可控PWM脉冲方法之DMA  m- d" o7 U$ m1 y" _# L! e( D

3 q" j% \% I/ r* V3 G/ t. j$ k; x9. STM32F1通用定时器示例详解—TimeBase" \! _$ h- a& M' X
% s. {1 Z- c2 [$ O" J3 q' X
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals# v3 W; @& T( }, s- N% s# M

4 P; Z+ O. W$ F6 ]11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生8 Q7 C6 a! A( x

$ s0 W7 f( l- {' f12. HRTIMER的多种Fault事件联动机制8 D7 d( j& C; K- Q/ j1 s, c
- d, K6 e( x" T, j0 o4 i/ |
13. STM32通用定时器 示例详解 —One Pulse# i- n$ ^: r  p4 ^0 k4 t3 B

6 A+ f) b+ `! b, j% Y3 K, ~1 n" V14. 如何用LSE校准STM32F4内部RC振荡器
! O3 Y& ~  \4 `3 d: Q" a! J$ y( ~, p& x3 n
15. 一种使用Timer测试HSI实际值的方法
' l- u7 d  s8 c# T8 ^% U) d
% K# v( E. \6 D( W6 \( X16. FreeRTOS定时器精度研究
$ @- q9 G6 U1 l& E
' X: Z, S+ Q* @- R7 R17. HRTIMER产生多相相移信号
  \3 ~: j2 I2 ]- w; ?) c0 U2 M4 c& q4 i2 m2 p7 F, Q1 t
18. 窗口看门狗启动时异常复位问题, N3 X  j. G) V$ ]' v

1 [. K6 i- ^; ^. g0 ?19. PWM硬件间隔触发ADC
' k, e9 o. |- y: W, U% H7 r  r) [4 ?0 J/ H+ m4 l2 T# `! c, ^
20. STM32F030低温下RTC不工作5 j/ w  c( E. V; o4 M% {
2 h( t5 @6 n# `0 l- l  z2 \
21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   ) \0 X2 I7 Q: @. M2 N1 E
/ c0 d2 ?4 t: Q" e# r: M6 t
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
& H- Z2 B; x, I: ~' ?4 j  k3 y$ q* K- j$ N" Y. H, I: X
23. 基于STM32定时器实现定制波形的示例 (2019·7·25)
. T# ]) N" K1 Q1 \. |2 I0 t+ L& M  }7 F
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
/ ~. `+ o8 X0 ?$ n% l
6 _' X5 \5 L# V3 ^$ S* u
25.MC SDK 5.x 中增加位置环 (2020.3.31)2 s8 n% K& W% Z/ C
6 c4 X! x. A0 X  I% q
26.STM32高精度定时器PWM输出话题 (2020.4.29)+ D: p- q1 c8 u

. i. P1 V2 Y* V6 u

" D: D7 \' `  y+ ?0 r( H27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)
1 W  U* K- ~: g: l; _# W$ c

) r/ t5 i; k; X( T; z  S( |& T4 F% ]七、内核
$ N1 |% b# B/ C, ~# _- ]. J9 u; ?- d
% I0 D# G  P! J7 l2 N1. 使用指针函数产生Hard Faul) b5 [$ c" x3 s' o4 Y  T$ \
4 l( H  O) }+ s' h
2. 调试器不能通过JTAG连接器件! i+ y( c0 d, j1 F8 z
  d+ H( E( `( t7 C3 y  q
3. 鬼魅一样的Hard Fault1 T4 Y: d) x- `8 E5 b/ i& h: V
% k: k; C; M8 `# O
4. 进入了已屏蔽的中断[
, e: T% u% ?* p8 _: K ( M1 K8 A" B! V$ u' C9 p9 ?
5. 浮点 DSP 运算效率不高
9 z9 b4 K5 `/ Y" t: G& Y( Y. \1 x0 W- G
6. STM32上RTOS的中断管理
. q  ?. ?8 i* {. Q
; x/ W" r1 K9 D5 [8 p! t3 L7. STM32F7与STM32F4的复位序列比较
, I1 P8 `3 }+ C: e$ z! _
( \5 \2 N, `5 r' T6 }. [  X8. STM32F30x 的ADC 采样的傅立叶变换
! |; Y% M2 H6 q0 C3 s7 k, U
( B8 {* A0 D# V9. EXTI重复配置两次导致误触发中断的问题5 X4 o- E" b8 r1 E9 y4 x
9 m" f3 H7 X# V% v  H
10. STM32F3xx/STM32F4xx使用浮点开方指令* N1 U/ H+ x4 @' g$ U
  ~* O' N" s: I4 Q% I
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响* `8 d6 F* U: g7 _. t* }

; |+ F2 E8 f8 y. S- p 12. STM32F7 MPU Cache浅析  
9 r$ R* \) c# ^+ \+ Q# p: [5 h- ]+ {. P4 X
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
. t& C* D- Y* E8 H' z7 `! @0 {

8 Z0 V6 f' w- S- ]) u9 H9 A, y14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新). |* P# n) \0 J5 b6 v

2 _( F: Z4 D3 \# T. m# N% v/ c# v) C* H# A
八、系统外设* d" |. X8 b! C- e- W

9 E+ ~; X6 {& g- w. f) I1. PCB 漏电引起 LSE 停振
: \- U( e' }& D3 D+ B0 [ * ^1 d. O4 N7 y0 ?: Y+ Q. Y: i
2. 时钟失效后CPU还会正常运行' p7 ^5 M4 [' ~5 d% z
4 d6 \: h. [& z( T+ M* H
3. STM32F2中DMA的FIFO模式
$ D5 w, m3 `9 g( z) X
& ^4 b5 U$ i( t, F  S* m' z4. STM32L053的GPIO翻转速度的测试4 M* A& e$ _& ^. x6 K

2 {: s# D1 B. T" g5 k" E5. STM32F4xx PCROP应用
: W; h- J3 B0 U% o/ A( i3 w5 g# s* p5 G
6. STM32L053的GPIO翻转速度的测试& l" G3 v! M9 i5 ~

' l) ]" A% `9 C! G3 p' e. s7. 如何在IAR中配置CRC参数
* J* x! K: }+ q: Q6 X6 |0 S
- a# T/ y$ Y, B# D9 R1 c9 y8. PCROP区域函数无法被调用的问题与解决
  j* N- y( r1 v 6 c, [% e$ s. I: D* p
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题. k- i/ `# i2 t) Q0 L+ O. E

- j$ f/ E7 H, F7 }& v- z10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计! |% _1 B( ~& B

6 `+ m6 ]/ x5 c: n2 }) H- Q11. 如何用LSE校准STM32F4内部RC振荡器
# N+ e( I+ ^2 g; V  z' G/ ~# S! {8 k9 {
12. EXTI重复配置两次导致误触发中断的问题  , r/ c* S; A7 K: D. Q6 i2 n( |; z3 `

/ Q# I( h' h; @; r13. 时钟安全系统的应用(LES篇)  
2 E3 S& W& B' [+ N% r* b: `

" N* V% H7 [' K9 g9 |2 P* M2 q
14. 利用DFSDM开发PDM麦克风应用介绍  3 N6 a! M2 \- P! L
$ u& [) T# L4 f8 P' Y
15. STM32H7的FMC外设在DCACHE使能时运行不正常
* k; m0 Y5 X5 o3 }# `2 {; P  u
5 L* `$ F6 R" q; h16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)
4 }7 P2 N5 m- C9 m% v8 {# _- C# z+ _/ Y1 T
# u0 U4 {6 O9 M0 I" y" `3 ^( E
九、标签和收发器
3 l) m/ v% }+ b 3 q; W9 n- Q" {6 L! r8 J# g
1. CR95HF的初始化步骤2 Q; ]9 a  i3 F6 t$ J$ g+ [* G! |

0 ^5 h8 A# `2 [
& s5 p& U/ x0 L1 A4 Q3 @+ P
. F1 E2 c: L+ A9 U十、生态系统% m6 D, }' E0 U. J4 b0 D) J+ e3 c
. a& y0 A; M  w' _0 z5 {" H2 R/ K+ h7 U
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题" n, t9 ~- S; G7 z2 e1 P

5 P' ~: V. F5 e+ K( U, {5 C2. MDK Logic Analyzer 功能在STM32中的实现问题0 X  P4 M, N! I" D) l
9 d/ q2 h- p" ?; K/ [
3. 在IAR6.5下如何将数据存放至flast中
: z3 F1 i# R' P, U & j' o0 z9 G' U: p+ Q
4. FatSL移植笔记
9 n! w4 _. Y  [" e/ x2 U  s$ J
& M! B7 t8 Y7 Q0 B2 S+ R2 m5. Keil中使用STM32F4xx硬件浮点单元
4 N% G' V2 b( a, c# K2 R
) n& O0 G) j, z  L  F6 S/ M' }6. 如何生成库文件(MDK和IAR)4 J0 w+ i6 Y3 U; E. v

$ t( ~1 ^! c. E8 T- c; a/ g+ |$ [" }7. Nand Flash文件系统解决方案) K: R% l8 U$ u2 c& U

" W8 [' z1 x& ?, T3 M  T$ S8. STVD在调试时弹出“Cannot access configuration database”的解决
" b% R& T$ y) {& b
* [! B0 }$ z( z% {# L5 J9. RTOS低功耗特性的设计原理和实现1 v+ c& `$ P* X! I

2 r! B! D/ Q7 W3 R; l10. IAR下使用J-Trace进行指令跟踪9 q+ M! u7 _# [! Z* v' d
5 Q9 r5 f+ q4 i  T1 o' ~
11. STM32上RTOS的中断管理
% R% R4 G5 Q& @+ R+ ], `* y  J) e& f3 P$ N( T; s# @2 b% F  h1 [  \
12. IAR下如何让程序在RAM中运行
$ ?* b- W* _4 J  ~9 H% p: w& N5 b$ ~, m4 s- j" L' v
13. 如何在IAR中配置CRC参数
: A7 O# S2 e  s5 y8 v  c# G  t+ M- l
14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册3 X( |3 o0 z: Q* D4 P: w

# \( K7 ~# _: u" \15. 使用mbed进行STM32开发及STM32F0的时钟问题4 u; w$ U- x  `& A) d
( t. ~* c  \; l
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
& }0 B) U. |. C3 B ; r: u/ X; ?/ _' o5 f
17. 多任务系统中的不可重函数使用注意事项! f, F5 s# ]% n- W0 s2 }$ k

) l& f0 E' C& {$ U18. STM32 utility的hot plug功能3 r# c  R$ X4 C  L
9 m, v+ H. x5 a; l( R
19. 如何将CoreMark程序移植到STM32上
( f+ l/ n- Y- z) M: S2 G5 N% D( q2 h9 d! q
20. FreeRTOS定时器精度研究% Z6 N: t, y7 J: g/ W
9 \0 p. k- }3 _7 A& H
21. 如何使用Eclipse和GCC搭建STM32环境
7 s5 D* P: h3 e, N$ f) c' M6 W( O1 H0 D- B
22. 如何建立一个基于GIT的STM32库
$ L. D$ `) W' D2 }& Y7 f6 p3 I$ R% ^, f
23. 从零开始使用CubeMX创建以太网工程( _4 }3 j3 `6 E8 f; V0 }5 Q

; d( x7 o; `! @8 o% C* Q24.从STM32Cube库向标准外设库移植FatFs文件系统
! \; P( z8 X# |' {; w/ M2 ]# Q7 ]0 U3 E, _' m( D
25. 基于 STemWin的屏幕旋转
0 n( X* D& ~. I* [- x, j8 Q3 r+ t. D! b! z# I( G6 y& ]
26. 编译软件 Hex文件烧写
! W2 b7 s* b0 |; |  d7 T7 [; \, E' {5 F- t( q+ P5 Y+ J
27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
  k% d2 t  m0 Y% c7 K" O, C# n7 ?6 R0 y8 w/ t1 s
28. USB CDC类入门培训
- ~, i  ?1 c6 \" R+ E
" T9 O4 o$ ^8 R# E$ F) L29. USB DFU培训 7 s# x. {" @! f- D
& s/ e5 z* b  Q! B( T) N# j4 }: `7 D
30. 用于量产烧录的拼接Bin文件操作& |1 r7 j+ l/ M

2 u# \/ n, r" D! l1 I& r5 l' V31. STM32免费开发环境该用谁
1 a" l4 a: o% @" c
; r# s# V  K/ O. y& [32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
7 V3 f0 t$ b. E: ^" b; R4 H/ d: Y" j
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
& b8 X. G$ b( A( A! @0 i1 X& c
+ A# U6 a3 f9 S# P9 B' g34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  4 D( I( X) R) d( b/ b5 F

$ o# X0 ~5 r7 u2 N- `35. STM32 FOTA 例程之 cJSON使用   
6 T1 x' M" o( s' L% T- ]4 `) l6 [' [: [
36. STM32F769DK 云端固件升级例程使用说明
% a  K' z2 F: [- D+ Q2 I

6 t: b3 a  I( D: q, p+ D+ K. d37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
1 i# D% ~# c, y1 A
7 R6 X2 E$ j  i4 q) {" o1 V38. 基于 STM32 的阿里云物联网平台方案
! c: @6 P+ B! U( }2 V. E" ^5 H7 j& I3 e# r  v
39.AliOS 任务上下文切换原理分析  
+ Z% x7 [+ K+ V1 E# i4 o9 F* V( c; O2 w) d5 l/ H$ U
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  
4 A2 V7 \4 r; n3 X( R0 s$ T+ x* y$ j0 x6 a) h2 v
41. STM32F769DK 云端固件升级例程软件开发文档  3 {& r& \# F0 u; g3 a  r* ]- r
; E" _0 r! c$ j! N8 [) i# A" A. v
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
3 ?$ f; X3 ~  O8 h9 y( M$ B. N( W( @" J3 n2 |$ a+ @4 I
43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)5 A- x- s' @& J) G5 u1 ?
* J6 g0 v0 p3 O: D* ~( c" y
44.零基础快速入手STM32MP1 (2019.9.19)
$ }8 v# j6 A+ F" R( Z. K, m: Y  X/ Z+ X' u( A
45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
+ U  X# E. n1 e, C% y& d9 u) H' G+ N$ w
十一、调试
: D' ?5 h3 P, E0 B: h
# X7 K" H  z, u3 H% l1. 关于STM8S SWIM Error[30006]的分析
& y+ d5 c: d; ]5 J
7 z: C# \+ A% @1 F1 l, ^0 E3 e2. STVD在调试时弹出“Cannot access configuration database”的解决0 s7 x( A* z9 E/ c& }1 y
8 o: R" g- o7 ~. Y: C! {% W3 e
3. IAR下使用J-Trace进行指令跟踪
6 q0 d5 o) F; E1 b6 ]
1 }' C6 o5 `1 \3 C  ~5 J4. 菊花链 JTAG STM327 w& E' u: Y# a4 Z; a. b3 w8 `
0 K. w5 }) f8 L5 I# M' S( V& _0 h
5. STM32F411CEUx 能下载程序但不能执行
5 J  u) y6 ~  R, r# T$ ^
5 s) A3 W7 `9 y" z2 }$ U# A6. STM32F103C8T6 程序上电跑飞
$ v9 }) O8 ~( C6 `8 F( \* ^
3 B4 Z: X. h, x: h7. 使用STM32 ST-LINK Utility 设置读保护后不能运行1 z, ~4 X. Y) X1 P6 d. ^- u

8 R! L, D! C& A, m$ z8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  0 _9 M/ D: X, i( I) G
: `, b, e0 k6 Y$ s+ J+ G
9. SWIM协议的GPIO口模拟) R0 e5 F( M2 ^% v% e$ S4 X

$ a$ @0 C# Z2 g# s! V+ m! c10. STM32F091空片使用ST-LINK烧写后复位不能运行用# B; r( ?& y8 n: c# r+ {: i( W

# b6 u6 m- _1 d  }3 O& {( C, l11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)
$ k( ^7 `8 g  n
8 g, P6 k: [% J12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)2 r+ [# w. g. k* D3 @( {( z
8 Y" s4 N$ W. d$ a$ ^- I* E
13. X_Cube_ClassB代码移植 (2019.12.24)0 \- ^8 n3 U* a' i
! A. V; w8 t5 u

& S$ u. N  m7 o( ^1 X14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)
5 G  y3 {  J- o6 P! e3 g
) q& I# S2 r; H0 N; Q' g6 v十二、人机调试, k5 R/ b# B3 H/ ^, C
7 G; ?+ T: Q1 S! g5 {! `
1. 一步步使用STemWin在STM32上开发一个简单的应用
" [6 \* f2 O' o! @
$ b# H' n0 j& d+ M" ?9 a, p2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
2 L# q3 ?6 w7 V( {
: D6 h, r! u; g" k' o* Q3. GUI方案中ALPHA通道处理介绍- ]7 s# w8 N! l

$ l6 z1 D# E# n* q4. 基于FMC8080接口8位LCD的STemWin的移植
+ w- @% f$ g! [; Y& g7 |
" q# d& P2 Y- [% x/ i5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
* O  h  H4 e0 v9 N" _: p4 a) a5 S8 \5 }( o
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)
$ }5 V& R9 n; n0 F1 m# q% g9 Y' Y* s) Z# u. R& e
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27), Q2 L8 v) A. r- k

8 X2 `! P9 X! w- G8 l$ ~5 ^( T8、STM32L5中如何关闭trustzone (2020.5.12)
( @3 e. z, z+ R9 w
2 n) _" [+ f  K( ?十三、马达
; C2 y# g% C( Z1 w
7 u/ V% D/ M4 i4 t! p9 o
1. 电机控制同步电角度测试说明/ s1 d" @4 }% {

6 j8 F- U  e6 ^6 M7 q8 k3 L
# ?2 A  E. G+ I4 K+ l$ U
+ I' Q: o6 O8 K& B# W十四、安全
2 T" ^4 @9 ^, v6 K" a* j' @

: U( J9 v8 K; k: \$ U+ l4 u; f' r) B1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
& K" s3 k5 e9 q7 d% d$ M
4 f+ o; C$ a% q8 M8 I4 X# i1 t0 n2 O
十五、其他# f6 o2 G9 x- D' ?4 L/ |  t

4 ?" K* u" X: q0 M1. 跳不出的 while 循环, s4 }" ?9 y4 q' n! R& u" |! z' @
5 t2 r0 E% X: `6 y! B
2. 外部IC连接NRST导致MCU内部复位信号失效的问题+ p4 _& t; a, C: j/ o" e7 c9 y

! ?% [& _( A0 L4 u3. 潮湿环境下不工作; J9 H6 i$ W  ]; k$ G
) f% Y4 p/ Z9 v' j9 o  U( n
4. PCB 漏电引起 LSE 停振0 l" S7 ?. N" }+ n8 B/ z9 g

$ s; k; }) R. h7 c) h5. STM8L152 IDD电流测量4 J- v) p  S: N3 v2 Z% F5 `
+ S( a1 Q( {  @1 K$ D& i: Y; r
6. 使用STM32实现锂电池充电器; t' v# d6 H* ~# `9 A4 b
3 \. W- O, M7 w* c) F% `
7. STM32_STM8硬件平台基本检查
7 n- `+ V! s$ O" Y7 s8 o/ K* N+ G, Q- }  A
8. 验证STM32F401在STOP模式下的电流) @4 ]3 g5 A( U+ x' Y  S5 e7 O

5 }3 X! Y8 Z  H4 a) ~1 j0 K, r9. P-NUCLEO-IHM001 电机开发板串口调试指南
) o. W, H! A" Y; L% v ) l0 D2 n5 O( J# o  P7 M- o
10. 一种计算CPU使用率的方法及其实现原理* V& t6 |$ r$ r  I6 x

. ?2 m4 {+ u! }/ D11. STM32 RTC不更新原因分析
; y3 M; J4 ]7 j+ d! B  s3 }5 S, ]4 n4 W' J' d. i1 D! I* U! s  V
12. 关于ST库函数的代码性能对比& W9 k6 Q$ I* A% _! g
6 e. M- H5 ?2 l% G% x+ A4 M" F
13. 在IAR中实现通过将程序在SRAM中调试的方法
) o  b; w0 t5 o; }
$ p/ O& o1 Y+ _5 b14. M95xxx EEPROM写保护配置
% X2 h' k, I9 y" e- l3 }" {3 S8 Q2 |4 C; k4 U
15. 4SRxx的GPO的属性
  F. |( z8 [1 z& B2 C' e
1 m; p4 }) z2 z  Y16. CR95HF的初始化步骤
8 B. r; d# D# S: i% R3 F
  o. O, K/ {3 \9 |; _" I3 M8 K$ Y17. 电机控制同步电角度测试说明  
" U7 [1 ^6 t) t1 ^9 ?+ H# x! J, N5 d
18. STM32+BLE通过 Notification与 Android应用程序通信的例程
$ |& C/ i6 P; O* H- }. T6 R' e. O" m5 {+ r+ {
19. M95xxx EEPROM介绍4 j: s; b- x( V% j7 Z
6 t6 ]) a2 h# s% h
20. STM32 DFSDM测量温度应用 6 P2 N1 }1 m1 s  ]( V; t
* s0 O: O9 p2 \
21.代码实现PCROP清除2 O. a6 }( T  Z- w% R# `

; `$ x  D; E2 ~; m7 ?22. 理解与应用MPU的特权与用户模式
2 `1 E4 \1 z& P5 D* o; K& M- [8 Q4 e7 V; N: p4 Q% R0 n
23. 用于电机控制单电阻采样PWM变形信号产生& c* w4 F$ J! T7 S0 V3 G0 h

; Y8 g- {% w7 |. ^. h7 i24. STM32L低功耗模式唤醒时间测量
3 q9 f( g% L- z& F8 j3 u" O1 Q8 [$ L3 w0 A7 G
25. X_CUBE_SPN7程序电机启动抖动问题6 n7 T# e/ D: l  W/ D% j! A* c
3 E3 ~' X1 i% p8 C; A( F
26. 发现STM32防火墙的安全配置: u0 ^" ]- o: O( n

+ K3 W& w; h. M5 e2 m6 R, V5 Z27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改4 `0 h! V1 x! N7 w9 S4 N- k
5 ]% d: s5 I* T
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)* S/ T" v/ d9 Y& k* n( S
1 ~. y$ w- B, d7 f( l4 P
温馨提示:
0 z' ^! ~( x; l) w0 b" q$ d' l) O
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
3 U" d7 N9 n0 y( k

; J: l! C# L, d. M
! p3 b1 K" q6 o
0 S( D$ _8 Z& |+ o) K' o1 T% `/ X: _0 z- G
) G7 k! c& |4 |8 j% G
0 q) Q8 Q; n" u. x1 b0 z% U

2 ]. b- A  d' ]$ r9 ~4 C+ |- P) @1 }$ ^5 P2 v
: ^) k: S2 E* K( t. v8 [

  P9 w" w- M) i8 U

评分

参与人数 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 I" E/ g9 }9 ]- D4 h
5768340 回答时间:2018-1-13 14:42:54
HI  / W' i' i/ R& u7 ?
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:6 b' H6 ?- [  R3 ?! q  _
   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    : `6 w& P" Y3 x% _
  2. 函数名称:Cdfinger_Bspspi_init
    & c$ }& ?) C# e! B
  3. 函数作用:spi初始化函数
    4 ^7 D3 V  ?6 z  ]
  4. 备注:
    # S8 Q+ E  x3 G3 D2 a" W
  5. ******************************************/  ]& z- x/ N' R! x' E$ m
  6. void Cdfinger_Bspspi_init(void)1 v- a4 ~/ c' R$ A6 U6 l! a
  7. {2 c- C9 f$ h; q+ J7 z  N/ t' C2 l
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    " j- [- V1 u, K/ m6 G: v* A: T
  9.         SPI_InitTypeDef  SPI_InitStructure;
    1 y: Z' m: w; h7 p  x
  10.         DMA_InitTypeDef  DMA_InitStructure;
    5 Q( \) r- B% U$ U; J
  11.         NVIC_InitTypeDef NVIC_InitStructure;3 m8 J  [* V8 c! `1 l" j3 D
  12.   
    5 S1 n! L, ?0 c( S+ i. F5 Q. d
  13.         int ii =0;
    ! C2 u5 D8 m' v+ v/ P
  14.        
    # }& y+ x0 F6 k( y9 B- Q
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);! a! T& {, k# I' J2 |  u1 R
  16.         /*!< Enable SPI2 clocks */
    ( ^  ], X" h& U0 W: U, t! t6 u8 K/ _
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    1 \0 z9 g* N. }, r- i' X" n
  18.         /*!< Enable GPIO clocks */
    8 X. H1 R+ ?7 \' w* x
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    : x$ u! n2 w- v2 B: I  u
  20.         /*!< Connect SPI pins to AF5 */$ q1 P2 `# `: M2 o
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    + l5 |7 Y) ~2 A7 t' L! ^" h, d  U
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
    * ?  G6 ^. d( H# I3 y& X0 E" W
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);* H* F2 A- t# _  P% \) v

  24. ( o6 @2 C. s! J
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    + ?4 ~" W! Z: d; h  t! G: m
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    - }/ @$ n2 q3 k8 y
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;) _- M1 i( G" }% o/ F( e
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    6 N2 V8 G7 ]( ^; p  n/ r
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;, b, W0 D$ t/ a1 v* J* P
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);) Z- O+ g$ H3 N  p

  31. ) h; p0 x& |3 p4 {9 S
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;5 Z% _) ?) b: ?1 j  G- ]9 L5 W( y  M
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;" t0 I! \; r3 r
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    & n4 T& \. b2 C7 c! E4 w
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ; Y1 Y+ ^! m+ X1 [
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;, c: z' K9 d. i$ X
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    4 ^- w) u* p0 F, I& t) j
  38.         Cdfinger_BspCs_HIGH();
    ( p1 P" k. D& x1 h
  39.         //Cdfinger_Bspdelay_ms(1);& o& t# a. E$ F4 }. P2 e
  40.   //Cdfinger_BspCs_LOW();0 a1 }! \0 H5 c- P
  41.         SPI_Cmd(SPI2,DISABLE);7 w7 t$ O4 i4 d7 ^& M& C5 U
  42.         SPI_DeInit(SPI2);
    $ @1 q) E, n7 O$ J3 _
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    ! H9 S$ M# ?1 b; w/ U4 l
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;- b4 A9 c8 y5 \. g% ?
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    : J: U$ a3 r7 G: u
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;3 u* |" Z  U& h  x
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    ( b; o. J" e8 C
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    - }9 Q- }7 E; l, d0 z( c
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;, _/ U) y$ x: @6 D! Q( I; v. }+ `
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    - m5 E; o; Q" x3 ^4 T
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;
    . O5 N! O& _2 ]. N. d" _
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    2 [9 M  O8 c" _9 d  W

  53.   V% W4 h3 V9 R- E
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
      Q0 g$ x8 d9 B# V/ R* H) h( q
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
    - s* ~3 \1 j! j2 R6 l3 c4 C$ J
  56.         DMA_DeInit(DMA1_Stream4);
    , @5 e$ ]; C" }# a
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;/ o2 }/ |3 {  N7 [: ?
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    " r1 x5 T/ N+ }/ ?( r
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];% G; {+ B5 H; }) D& g! R$ ?
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;7 ~' o5 t% @8 Q5 c
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;: G6 U( n; ?0 m
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;
    " p9 N# ]* \$ X, h! c, H
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    3 ~$ R( r. j" e- S* g3 s7 k
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    & D0 D3 g, V4 \; q
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    - I, f8 A  n% v' R# g7 @
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    & K  y" z6 l: }; e- V- E* C
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;  G* f2 v4 ~( q' [( z9 v3 J
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    8 t$ ]! H  w0 R; C0 H6 @& v
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    . H0 c0 [' J9 {8 ]) g9 F( d
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;* ^9 p6 ]6 F2 e- c3 r
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    4 M% F2 w8 F8 _  i3 R# H2 B
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);, f" \) W2 F/ G! W8 i
  73.   
    % x! I; v5 }2 o6 a0 M, q, G
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    : N+ A$ T/ p" v1 d, h& _
  75.         DMA_DeInit(DMA1_Stream3);
    : N, Q7 O7 p. W) W4 `* H* S( [# R+ c
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    7 x- J% O& Y( c$ O9 U
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);# i; B3 ?  D( m, C$ j. w
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];, n5 }$ x0 F$ G! V; Y; u
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;$ Y3 O1 i2 E1 m- @# R. {( M
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;+ c3 Z, v* c! [; K4 t
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;* ~5 u" |5 {6 ]
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    9 W$ c2 Q4 B) r' V1 I9 q& x
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;7 S, R! V! y! [% Y! n
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;. [& P/ X' U& E
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    ( M; b0 M' X# P$ T
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    # K7 i$ E+ j2 h; r, @! }2 T
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    8 P0 c: x( K7 h1 \
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    6 L. S2 J1 R* K) G. W
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    8 b+ n2 @- ?$ i# ]: m% A" r
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;: T0 L- d2 q: H8 p" K' [
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    4 p/ U. y  z/ ^' d" t" v
  92.         //Cdfinger_BspCs_HIGH();
    / Z5 h* e. H4 V5 Q, y
  93.         0 g( i6 X0 W  t% x

  94. 1 e9 h" l# y3 j' f
  95. 3 ]" Z. @  A/ C# B2 z- U4 M) z
  96.         //发送中断
    ( @; |* s- O1 ^# H$ Y
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    5 }8 k; A) G$ B4 K4 {- q
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     . j, s! ?, Y- {: \
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;, h' b/ }, [1 i2 H. v9 B0 C, k" x
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    2 |; A4 m  x$ d2 k% v
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;( t: w& J1 m4 t3 @& c; D
  102.         NVIC_Init(&NVIC_InitStructure);* L: W" ^, S( j2 ~0 P
  103.         - ~2 L- f% z6 N8 r# Y3 t8 y
  104.         //接收中断
    5 a6 n0 K6 {; T
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    0 i! x* A2 r: q3 u, ~5 x3 K
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     2 x, N1 L7 v& v; o$ h
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;+ _' S( r, r8 z2 U  a
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;5 m4 N# ~5 d7 F( a* E
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    4 v) r! Q- U) F4 I" I9 G+ [9 P: v
  110.         NVIC_Init(&NVIC_InitStructure);. t( G2 E" ~4 n. D% x
  111.         SPI_TIModeCmd(SPI2,ENABLE);# e' F, G  P6 J& K
  112.         SPI_Cmd(SPI2, ENABLE);8 {2 _, v; m# n! ?3 \
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);# ?. r$ ^+ A7 c6 W+ @
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    0 n$ o( u7 Y$ [& s

  115. / b  A" k9 W$ Q- Z& x" i
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    + c( O; b( N' j; N8 c
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    / w4 r& o& q. Z$ n
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);0 I# r) U9 _# Y% Q( b
  119. ( I/ y% U! j% ?6 ?( k/ A6 L
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)2 [, U4 J3 t+ p; P8 m5 q( \
  121.         {
    9 x. j4 G/ W' w9 ?" X( u9 B
  122.           if(ii%8==0)" ]  U% I* e  w+ n7 L
  123.                 {8 x( X% t) ^: [* Y! f3 Q0 a! z: r
  124.                                 printf("\r\n");7 E# `  u3 H9 S& N
  125.                 }
    - I4 U& b2 T: F( l: p: N
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);; X% i3 ?4 E' t
  127.         }
    7 J: y3 p8 e+ _! v" a  C5 b; a  B
  128.         printf("111\r\n");
    6 A* f+ k6 T' F* g4 _6 a: c
  129. }/ f7 N: g' z. e. A5 H) K, w; X- w

  130. 5 R1 W5 W/ |3 Y& n, H
  131. / M. v1 u, p7 y0 |
  132. void DMA1_Stream4_IRQHandler(void)& Y. X' T/ d2 a1 R8 `4 a7 V1 f0 A
  133. {
    ; B2 h4 M* H3 C: x1 Q9 }# [  L
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    / r8 e7 B9 }5 {" J
  135.   {* E# v8 H& ?# |
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
    # T8 k, Q/ p0 P  s3 L0 y/ N% v/ m
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    3 r# b  K! M6 T
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);: i$ ?( K% [2 F0 X& K$ v* y6 K
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
      T# B  G2 C- y4 `  @7 l' O" K
  140.   }" p* L4 n1 [# Z2 y$ g, D
  141. }
    7 G; N1 h1 A  ~: R+ u# }% R: |

  142. 5 T% y8 m5 o+ S* \& [; }$ x
  143. void DMA1_Stream3_IRQHandler(void)
    * q- r. c4 l- u/ N) v) [
  144. {
    % l8 X9 a9 A  U. J6 O) B8 T
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET); T; o: _# ~3 ]6 C* `% ~
  146.   {1 F; z+ G) p) _* G3 D
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    ( Y, y' k$ ~' R+ O2 ?  ~* P+ \
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);" ]7 C; Q% [/ B
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    5 |! o, l9 t/ B2 t. V4 X
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);, Q/ O, o6 W! X; n$ ~
  151.   }
    & n1 Y% e) \' s' ?: ^  J9 i
  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的波特率是不是必须为相同的,才能正确通信
& v) C3 ~! i" ~以下是全部代码:- Y( Y( o. n" M' Q) Y& K3 o" j, y
#include&quot;stm32F4xx.h&quot;
$ A; Q. q# f4 z, r) q. O& l6 Bvoid RCC_Configuration(void);$ {. Q9 q" g$ j5 g
void GPIO_Configuration(void);
0 Z; k+ z( P) T' Q7 o' Pvoid SPI_Configuration(void);" z" w* ~0 T7 f3 h) M$ f9 p# V
void Delay(int nCount);
! Q5 |0 \* T2 p1 t0 |# @. v7 c7 Sint main(void)
5 {# p/ D7 P, h/ X, p. Q1 c9 ?) J. L9 B{  RCC_Configuration();
- V+ p+ u/ R6 u! x, j  GPIO_Configuration();/ ]5 f8 ~: w3 Q2 J0 E5 F4 K
  SPI_Configuration();
4 o7 a: m! ?, c$ J) h! _1 {5 p while(1)$ z- @8 a! U1 s4 u8 t
 { int data=0;$ P, V3 J9 j: ^3 `: w% q
  SPI_SendData(SPI1,0x55);
6 H7 l  J' E# _& |  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
; C' w% |: h7 j% R. B: q: Z! g, H  data=SPI_ReceiveData(SPI2);
! @8 a( X9 d9 b  if(data==0x55)
6 M1 T) |, _4 u     {  while(1)
$ l0 I; r! p+ G' X             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
( U+ `. G* I% n: C5 s                Delay(0xfffff);
; R4 o* a+ Y- E                GPIO_ResetBits(GPIOA,GPIO_Pin_4);3 p2 o/ T" s" j
                Delay(0xfffff);
( u, \8 O& w* |1 Y   9 B. z6 e5 l" \* e, ~2 }) R
             };
% h* s) \$ G( ^6 \% O8 y9 b( @     }4 {3 k2 e# g0 l2 G* m
     else while(1)
- V4 ~8 m8 d7 _' z' e            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);2 Q6 _9 G* U. v. B7 P0 q& }9 c. l
               //Delay(0xfffff);) r- c" k# C3 c4 b; L
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
5 h5 S  a& T+ R  N               //Delay(0xfffff);
8 W0 I7 ^1 j% ?5 Y5 @; V! c" ^- Z   1 m% C. C$ ]+ M, e, W
            };
" e( b% w; D- N" o# c, q2 ?/ h }) ]. i8 M$ i, b, _' G% A% z
}6 a" x2 `/ @3 J7 [+ k
void RCC_Configuration()8 `& I0 E% a$ p) d% j5 V/ p2 v; h( F
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
" p$ `& ~0 H0 v) V  s  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
# m' l9 k  c, H; H( P  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   : M" V6 T5 [4 `' O" Y5 v& ^
}9 `9 v, z8 r/ B! [
void GPIO_Configuration(); C/ m& x7 g; v; q  b
{  GPIO_InitTypeDef GPIO_InitStructure;
1 n. x( Z4 P) F; O5 H) n  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;# A, Q& ~! A' W6 i) U. e: f
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;4 G/ k- ]! k  p( `$ F+ E: k; g. h
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
' g6 o5 B( O5 d! x  I( x' {  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;! a( \- T) W( b; x/ L; z" K
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;3 m3 m& k7 R: f1 i* E
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);' {  s& \" D4 ^8 L+ G2 T2 g
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
" v1 O1 D3 J& @  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;) C; d3 P/ Q8 B/ d4 K
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;) C5 J5 Y: C  h' `9 J" _% ~
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
3 Z) S: L4 F# Q- p( l  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
- J- C+ y) \# S" H  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);" n4 }, w, _1 [9 N
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;3 w8 O, P6 ^% p8 E& k$ Y" x1 c
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);9 Q: ^0 R& I6 Z# a
}6 ^9 N& H  B8 P8 r
void SPI_Configuration()
$ v3 K& w  y. f& p4 E% ?{  SPI_InitTypeDef SPI_InitStructure;
- z4 `" W: Z$ i- g* X& v  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);$ p, E" A7 G0 I2 z5 U7 k
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
8 u! c/ G5 D6 p) {  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
3 P$ m+ P) f7 Z3 q6 j   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
! Y, y7 ?- ?" L! D  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);" K4 x  R9 |2 p
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);9 Y! x* G6 @$ [0 v
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
0 f2 s% J) R( u# V4 r7 Q' f6 T  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
/ n0 o) p) K' s' M# S  B: f  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
2 c% C5 l2 ]/ e& o1 ^! S! ~+ ^  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
; h" X7 m5 N9 L" H, J$ u( W  n; F* j  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
8 S2 o* G, w5 Q4 X! S3 l  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;+ B' R  h( r# l; P( F9 V; _
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
. t5 n+ w7 M& y9 Q6 O4 W6 v   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;4 E; I0 q. e! V$ c8 y
  SPI_Init(SPI1, &amp;SPI_InitStructure);
' K" p7 `7 E6 ]' a+ `% t  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
1 W0 R- x% y: b2 X3 |7 Y   SPI_Init(SPI2, &amp;SPI_InitStructure);* |% ?  Y* [2 ^5 D& \0 U9 N9 L6 D" v
   SPI_Cmd(SPI1,ENABLE);
, a) A1 B% c* J' E- i# L   SPI_Cmd(SPI2,ENABLE); 
1 l/ o5 v- x  Y; J}
+ U% u, d1 _( p2 i1 d. kvoid Delay(int nCount)
, F2 X6 E+ d" s6 M3 g{ int c1=nCount;" X. d5 I: w* i
 int c2=nCount;) L! m0 [$ d$ i' A9 j6 X
 for(;c1&gt;0;c1--)- x0 M$ c2 k( x: \5 I
  {
! f& }5 ^$ ^0 f  for(;c2&gt;0;c2--);
8 f! E# p6 ?: r# V; v9 P6 J! q };, k: `( A" ]- n8 p6 l; [
}2 i" @9 h6 X$ \" V+ |& D1 A0 y
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:: F4 L% `# |" W4 ~7 h7 Z- r
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信8 ^5 `- T6 k  x4 [/ X
以下是全部代码:3 ^# L5 N, h0 Y9 C8 g8 V
#include&quot;stm32F4xx.h&quot;4 h% y2 b* p. w8 K& Z# x
void RCC_Configuration(void);% B' j# a& a) S% n5 _) k
void GPIO_Configuration(void);8 _  K; j- F. w& ]# Y
void SPI_Configuration(void);% i* m; h, b6 c
void Delay(int nCount);
- f8 M4 Q5 |; S0 {$ Aint main(void), Z4 [$ t6 `8 u1 L0 k- D
{  RCC_Configuration();3 Q. l3 W' L- p0 D4 o
  GPIO_Configuration();/ ^, `: l0 w; Q1 ^* H# k$ X% j) j
  SPI_Configuration();
8 C# W9 q4 |8 L7 V while(1)/ \7 {) x( }. }4 t
 { int data=0;
( Y) F! Q! T' a+ B# x0 S" M  SPI_SendData(SPI1,0x55);. R1 j% Z9 a: I9 w3 c: r
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
( V6 ?' @6 n/ Q% E8 O6 ]  data=SPI_ReceiveData(SPI2);0 i6 Z9 d8 C* c' U4 O3 l
  if(data==0x55)3 F3 q5 Q% D7 z
     {  while(1): J$ Y0 N- b" b9 a8 I
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);; F3 `, T1 D! W) E
                Delay(0xfffff);
' P3 l/ a3 t& |3 r) u6 y                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
( c" \3 G; V% A( c; f4 P                Delay(0xfffff);# B2 a4 \' F0 ]5 ?
  
% a4 }( F. I$ G- t; ]             };, B* V/ {; E8 s' f/ ^, I
     }
. X  _# L! P6 Z     else while(1)
% G  L% w3 Q6 A! a7 }: [            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
% W/ A- W2 U1 a1 i               //Delay(0xfffff);
/ W% Q/ i3 j  D9 a8 K3 [               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
$ c. K4 P3 A4 Q4 m* w- s# J' D               //Delay(0xfffff);
/ B5 }7 ^$ ?: _+ Q- p+ z/ \% r   ! H6 Q) i* w' g
            };9 h9 s1 A* m) o( a5 _. q
 }
+ n5 v8 h) U+ M# [}
5 h) }7 C9 A- G3 t1 H( z) avoid RCC_Configuration()7 E( I) {0 A& Q" `& O
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
8 j' O% {# h* c6 `8 O  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
; b/ \- ~9 d9 z  P1 |/ o4 S  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
  P  ]6 c/ n( [( [}' S/ S% K  S8 B7 S+ G5 J; U: @
void GPIO_Configuration()8 i8 \! L4 d9 z/ R2 u) v
{  GPIO_InitTypeDef GPIO_InitStructure;
& S5 r4 l2 C# V! w: m  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;& J2 M& N7 _! ?( \' X+ c$ J( J# S
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
' F! d  E. u: ]1 N+ [  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
6 x/ r5 u" q8 l0 N$ F" n4 G9 J  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;+ P( |) T; z* Z+ _
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;- _2 ~8 D6 c: u7 e2 w' E1 m" W
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
0 Q4 r* q: e. e: H  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
* O. F$ d8 F* e( D9 E  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
; L6 R0 w# s. G4 f) Y1 A  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;. `+ E; F/ q' P8 N; M2 [& W. y% S: P5 A
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;+ j# C- ?* e5 F8 J  C% }
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
  S* H5 Y: v: }  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
2 [8 c2 g6 K. y  s. U  C. w  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
+ m1 v, W2 P# ]& Z8 t% y  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);' n1 P0 m+ V# J. R# p
}
' }1 g2 ?0 T7 |6 K( f  ]6 Svoid SPI_Configuration()& o3 m# ?+ ?. b( f7 h1 c- s6 ^( l: p
{  SPI_InitTypeDef SPI_InitStructure;2 j6 I$ T- m$ |( O
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);  Q! b9 g- |& Z" m3 j. H$ Q5 t
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
% \  @- F9 W  [$ {; p  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);8 }6 u- s7 q" C$ C
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
# i# ?% A+ i7 f& j  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
$ x) T/ y0 k: Y* T: e7 g  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);# v1 |9 Z# d8 Q! Y8 d% g# g" Z
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
6 w9 J7 E8 V9 s, B5 x6 H  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;3 X# d: Q, s- r0 ~# {
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;3 h8 G3 C! O, p2 Q
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
6 t) V) Q! m+ b" f! R+ x2 c  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;' I! W' o7 {1 c5 \# r- W" Y2 l" \
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;# s/ `8 \* d1 E/ Y0 C" n
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;) z7 D: e# c2 o$ M
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
3 f  b% K- f8 D: E2 i7 O& R9 N# s8 d  SPI_Init(SPI1, &amp;SPI_InitStructure);
3 V% P& o3 f- I& E  k  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;& o6 X- O1 g* }+ G5 }, V
   SPI_Init(SPI2, &amp;SPI_InitStructure);
; b* I! M7 t, ?; U3 M- A" G   SPI_Cmd(SPI1,ENABLE);& ~. _9 H1 x# c: a" c* ]  z& U
   SPI_Cmd(SPI2,ENABLE); 
! _0 h2 ?, n; O- `' Q}; E- h; V1 P/ b, x/ @) N9 t+ Z
void Delay(int nCount): Q# @3 G5 J% f" a/ Q
{ int c1=nCount;
. j( X) \/ J0 w9 I4 B! d int c2=nCount;
8 k: y& g0 h9 B! p  ? for(;c1&gt;0;c1--)& x/ V6 z9 _, T
  {
- }1 g( J6 |' ?9 h& L  for(;c2&gt;0;c2--);, s3 Z) y' W' ?! u$ P1 M5 Y8 Z
 };/ m: w5 `9 n8 B5 L
}0 S6 I  O! g# J2 W5 u4 Z6 f' p$ i' q
先谢谢了~~! e1 o; p& f5 P1 Q
 
5 I, J8 d! u7 Z( t3 i+ h
1 s% I" s' h. H5 Q2 G, A) Q楼上的问题,看我帖子给出的提示哦~
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发表:
- u. ?2 x. E; T8 G 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
9 q0 @& J' x* O# z4 n6 }0 t; G4 k $ ?3 q/ y' h0 O7 ^

  a1 D+ V! o) r0 b多谢支持!!
abner88 回答时间:2014-3-9 13:43:20

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

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

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

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

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

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

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

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

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

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

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

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

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

  0 h. N( s+ g! t8 I4 n4 d$ m
鬼魅一样的Hard Fault
4 s3 h6 D( D% }8 v7 g1 n8 P 
! l* V- v* _* a该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。) m, u, _; Q, L* [* L+ W! @
 
: x. ]. c" h% L& Z. c  s2 d% A咋解决?
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 手机版