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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
7 m; z. ?& p* E0 i* F
) |6 [# f2 \: {/ W1 n5 f; {$ h0 x. U5 W6 U' m$ G
社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
2 m+ j* n# K/ P8 T+ n5 \ + s1 `% ]9 H) Y( E2 I& o
提示:点击各主题,进入帖子,可下载ST工程师解答详请
% V+ E0 \' F' |: @& v' a
; l' N3 o! @0 r' p
7 N* D0 }8 O3 Y一、通信接口
3 A" v1 v6 g/ C8 P9 Y / }1 f5 g4 [7 k  G& z  v
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新
( p- Q: i1 p# k
; |3 y$ w, z, Z8 T2. SPI 接口发片选信号导致死机
! z8 _( {; `9 s; g0 Y9 T6 C
) H6 E+ U' n( {5 g3. USART1不能设定600BPS的波特率
& a) Z/ e3 M1 x- {  ^ 9 Q5 C, q  L7 Z4 E
4. I2C 接口进入 Busy 状态不能退出
2 F4 e* e; ~6 k9 { ' c9 o* ^  t4 }* {% m. S4 b
5. 对 Flash操作导致 USARTU接收丢数据
" P) I9 {" p& J: { 1 B+ s: [: w6 ^; R6 B9 |, l* v
6. USB接口易损坏
2 M9 ]; N9 l& t1 ~" l* y8 h$ e , N! J+ k& Z# X; C: L, f1 B
7. UART发送数据丢失最后一个字节
6 [3 B5 i6 w! d: z
% Z# F2 c' C2 k8. 使用 CCM 导致以太网通信失败
* O6 j& H$ x, d9 d3 W- [6 h2 \ / c& \$ D4 T& ]6 C- K3 V/ L. d! @
9. SPI3 接口没有信号送出
" G+ Q) {* w6 d( T. R. x
9 ~& Z$ |3 h; S10. 时钟延展导致 I2C 通信不可靠4 u2 H; D% h6 X7 M. o8 H8 W, q

! f$ W( |' ^1 t2 ]& Q9 L3 H11. M0的USART波特率自动识别问题$ |1 F7 v; l* V1 f" Q. o
/ A: u4 Y6 z5 N: w( ]& V2 m
12. WK15 OTG做U盘主机兼容性提高2 K$ `6 I! C7 s& n0 `" d. w

4 S! W! K1 W9 X% ~13. 以太网电路设计注意事项
- g' A) W7 B1 H3 U- V/ A
/ Q6 H4 I( y6 b8 g% G14. OUG主机库在BULK传输上对NAK的处理
' Q. h- K+ g. ]5 o* U
1 l/ ?9 M" v0 X* s( c4 p15. 串口断帧检测
- ]4 O* F8 T" d) h) p  b' W& n6 e) H
- T6 |# n* D1 ~2 z16. VCP例程用于数据传输时丢失数据的处理0 q7 }( Z+ G) Y4 }" |# R3 w

5 c9 v! ~( B1 g9 C: J4 _17. STM8L051F3P6串口UART数据起始位判断的问题
, ]( I0 E; b0 N, Y. A
! t1 H- q5 T5 h7 U+ ^2 G18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号+ b) d0 {7 L  c- s7 O1 W+ X7 b$ ^- C
1 u/ |% K. o0 t3 T, }; i' O8 c, q
19. STM8中UART奇偶校验的使用方法) ?7 Q* {/ Z9 r" W0 w7 E
& u3 o6 `; Y) R, C& U8 G- R. Y% ]
20. STM32以太网硬件设计——PHY
2 L3 B! t* ?- y# U! i2 L  N! b; K# K- c) k% Y4 l/ h
21. 一个判断I2C总线通信异常原因的方法
. Z! x) p- J, ^3 q5 ~+ U) r' ~
* \7 q/ V9 M# ?$ `% H22. USB device库使用说明* R4 X) q+ d& y) [# |

$ g4 n, ~5 W* `* R0 v  F2 `0 g23. STM32F103上USB的端点资源
( P7 U* o, ?3 @: x
% C& R1 D* `; {$ y9 x24. 使用CubeMX生成TCPEchoServer程序
& j$ N+ U. s5 g  w/ r) ]( {* J" y3 z, M
25. SPI接收数据移位
. L2 F) o, @, j8 p1 f
3 ]( j: ]% e, D- g& o; T26. STM32F0中Guard Time的设置0 T8 X; j/ Y0 e9 A3 }4 x: N+ P
" X5 B: T8 M2 y) k' i! M8 A
27. LwIP内存配置9 g+ h  v+ @/ {
1 N& i; s7 v; ~! e2 _  K: m; W
28. STM32 USB Device的简易验证方法
8 l  r+ |7 f5 J4 h! c) h7 K0 s
; x" U. s7 G/ }1 B, y( P29. USART 中断方式接收无响应问题的一种情况及其处理方法- A' H+ W2 X/ i+ I+ y0 R' D

3 _9 c/ Q" @/ s7 X) u* Z30. STM32 基于 Nucleo板 CAN总线的建立
+ Q/ |/ V+ y8 i4 E) r( K0 j) P
4 \$ Y0 R% t3 n0 Z' g: {5 q* N0 D31. STM8 CAN总线的IdMask模式的讲解
9 B* o) _4 ?! R4 z: K3 L% W- S& _2 F( ?1 d  q9 v, ]
32. STM32F746ZG USB 驱动不正常 1 R  k- W; ^1 q, ~: M  R  Q% D7 s

9 K, R' [4 R5 ]% e33. MCU在STOP状态下通过UART唤醒分析
+ m, V- a  l& O- v2 M+ @$ N4 L& ?. p2 v  }' t
34. 通过STM32CubeMX生成HID双向通讯工程 7 J* P: ^& \4 u4 q
0 X( v7 K* U) G" k+ s
35. 串口工作在DMA模式下有时接收异常 0 o9 M! Z+ M% I' i6 @# J$ e

+ j2 a- F, U5 `) h' ~36. STM32 Bootloader中 DFU使用限制
) S$ m; F7 F) h# [/ w+ o' q1 K1 b5 k! A# e& }. v0 F
37. UART异常错误分析! y0 Q( I+ {. [$ E0 R

% Z- E+ r! U; t) H; O38. 基于Cube库无法检测CAN2的接收中断
) ^- s+ @/ {+ s" z4 y
% P5 G0 B4 A6 g# ]. F+ q& i9 w% e39. 基于STM32F7的网络时间同步客户端实现 5 w; P" d3 [8 @; ?% H1 ?- V
2 W; ~5 E8 O5 {" n3 Z1 n
40. HID与音频冲突问题 & ^" ^5 B% p, a8 X- P

1 S! [" h$ m* a* t' N' H7 f41. 在进行USB CDC类开发时,无法发送64整数倍的数据
) Y$ x5 m2 `8 \9 A/ ^' y; c  ~+ c( F5 E" a! _+ v% }
42. 从零开始使用CubeMX创建以太网工程
- }) _- ]) X6 P
& @5 A; R' u( [; y8 _; k8 g43. STM32F4xxx的I2C总线挂起异常处理
7 h/ v! y! X: B+ K6 O' L  a+ L
6 C; X' Z5 @4 _% X2 ?44. LPUART唤醒STOP MODE下的MCU
+ K! r2 a" S7 f
  m8 d4 Z, ?0 D  I45. STM32系列 MCU模拟双盘符 U盘的应用
5 H/ g- K- |" n2 _
  Q: M: |/ E& d46. CEC输出的数据和数据长度始终不匹配& T! `" A8 R& P" v* g

8 L! P8 c  C7 ]; G47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
2 l9 Y0 Z" z- c' f  T2 b5 R9 e* I6 t! Q3 @; R7 f$ m0 F1 A' g) q3 k6 b
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
0 }9 \' {3 m  ^6 o. v
1 p4 M1 P% k7 J" i1 N49. 增加UART接口应用时的异常分析
$ p# J. H% c7 r6 F. f( \4 q/ e; ~& ~  z& j
50.UART应用异常案例分析
# \3 ]* e- w! M/ Y9 ~, I" C0 n, g' ?( V$ U
51. I2C配置顺序引发的异常案例
9 u& d5 B0 }& }% J
; `# U- h$ W' C6 k7 ]52. STM32 USBD VBUS GPIO6 K8 i7 H& `# G/ P. B! |" X8 w
  s" q3 L' l, Q) A$ [
53. USB传输数据时出现卡顿现象+ [# A4 m. Y6 b8 T. R) I' Q' J

9 D$ M, \4 A. C3 ]) l: E& _54. STM32的高速USB信号质量测试实现% P+ }3 s# |# X: T

, V: X+ V% @# b, K+ X+ J! _) `  k55. 基于STM32 I2S的音频应用开发介绍
/ O3 ]3 t$ |. ~2 L4 S% |: }* o! ~7 [& x/ y" R. f$ t) n
56. HID_CDC复合设备在WIN10的识别问题  
8 A$ R8 ^' M2 w; [5 n- \2 d3 x2 o  W0 G; Q
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  0 Q3 q) f' G- R+ j5 b) B5 \
/ U  _% K2 Q, I  P. }4 ?7 l
58. 一个关于LPUART输出异常的问题分享  : ~) c6 \: U6 e
: d4 `- b! y# h; {/ J
59.通过 DfuSe 工具控制程序跳进 DFU 模式( |) X* Z% C" i6 g) N

& N8 a7 p! J, a1 I9 l60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)6 Z( d9 f7 s+ x0 W- |+ A  f
5 i" {9 t1 k2 O/ F! k7 V; O
61.一个因初始化顺序而导致异常的话题 (2019.12.24)
6 I; v. T! Y6 S) d% L* T0 ^' v
. ]2 q/ N3 G7 h& O( Q
62.MC SDK 5.x 中增加位置环 (2020.5.29)3 ~" z9 Y" w8 |4 h
' T9 ?8 }" ~6 g
63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16); m" B9 M5 i( c1 X3 I, D

# M" e* L2 D* f64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)" q* P( q1 x9 L& U/ V

+ E) W( ^5 \# z/ e, s+ m; z二、电源与复位2 E0 k0 ^& w) ]9 q
+ H: x+ f/ @( N6 }7 d4 p1 o1 a
1. Vbat管脚上的怪现象- Y$ b) L- Z# L& L0 m

1 T1 T4 d& g8 ~9 V2. 上电缓慢导致复位不良
. Q( W8 {5 k& g% A8 [2 r! O
0 ?, S7 i$ N: A; N1 U3. 关闭电源还在运行
2 [2 d! J" A1 q; [5 j6 y " C5 B6 K7 T% c
4. 使用STM32 实现锂电充电器1 B  H$ A9 e, Z5 K0 k- W: A8 U

, I# j! {' o; x5. STM8L152 IDD电流测量: i0 l7 d- i4 z$ O
- B, n5 r; D" j. P2 g, ]
6. STM8连续复位问题
. X& t4 V( h' V" F3 m' O5 t( @, i 7 V* g" S& G2 ~
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用6 C" X/ m  ]/ d. _( w8 Y/ m% n

+ {1 \- e) _$ z! \/ h3 n2 U( e, O8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流
. ]1 r2 c1 z8 _' i
: a1 w  ~+ G  g1 A& |9. STM32F7与STM32F4的复位序列比较
- P5 Z. {- h3 K  [
5 g5 b7 X$ O* a0 _/ E# K* H10. STM32F107 复位标志问题 # C, Q6 w( l# P6 d
4 z3 p' h) O  A
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  5 I; Q  j& F$ o. I1 Q( a

* h3 H, a5 u6 |. f/ j/ U( k4 w" e' L 12. Nucleo_L053不上电也能运行
: q4 N! k8 T+ X7 \4 w# ^6 Y  G+ z5 n! c* c' v" M
13. STM32L4中STOP2模式下的漏电流
. [  S2 u7 `7 Y/ S: Q7 l& e) T
. L  Q6 [. R# v14. 在没有外置晶振时HSE_RDY异常置位
4 u4 R5 m. c2 h) L+ N+ U- Q) U3 N% A5 w& d1 G( Z* S
15. FLASH被异常改写   (2018.5更新)" U( V! D+ ~' N) i% ^& x  h1 ]

6 r* V6 u9 E5 W; G2 u16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
& g! ]* x1 L) S* X4 w$ k8 @! q; ^5 d2 b# P8 F* a
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)  e8 Y3 X9 g- z- A) n' I2 u4 T$ r% x" m

( H, R+ Z8 ~  o; x三、IAP和Bootloader
0 L; e- m' r3 N. N4 a/ p# c
+ q% g. {9 ?: G- L- G+ F1. Boot Loader与上位机通信不稳定6 G0 {0 g2 M7 w0 E( `; ]" J

3 h$ q1 P7 O. E2. IAP+APP 模式下不能启动 RTOS- q# U1 J6 ~# d7 p

' y) n' ^+ V8 H! b# u3. 从 IAP Loader 向 App 跳转不可靠
% Y/ |, L. a' D! f$ W) \- @ 9 R! v% c! |& t
4. STM32 MCU IAP例程跳转到APP代码简要分析
; I" D, O" w7 J
6 }) h& L6 _/ r+ Y' d5. STM32F091从自举程序向应用程序跳转的问题与解决
9 d: v5 S5 Q& i9 {& N; `' e
% @8 y  G7 p' l6 T8 r0 D6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
) T% H, ?4 }& Y# A, l9 I# s. q! L. V  t
7. STM32F0启动模式相关问题探讨: y' q$ b& m: ^" k6 i( [4 J
( {+ B- i8 A! J0 ?6 T
8.STM32F091空片使用System Bootloader下载代码
" e% y" a5 g$ l' G% j5 S. c! [9 \  M; f; x' X; q( o* {
9.STM8L  IAP 应用程序中编程指导
# K! N( e( b, a1 g* s : h( H- Z" ?/ ^  Q$ W+ A
10. 如何通过STM32的串口实现简易脱机编程器* n" P' J' Q' ?/ L) g" R

! j+ C: U: S& U& s1 P11. 一种从用户代码调用系统存储器中Bootloader 的方法  
( q8 G. B6 C. p5 ~
% O) p% G  a" I$ E8 V12. 利用 USB DFU实现 IAP功能
; g  n9 l9 f0 ~6 e, u( [( p  z( [3 f1 p7 i  `
13. STM32 Bootloader中 DFU使用限制
( d7 m( T" O% k: @  O. Z% G. D/ h1 f7 i2 {
14. STM32L011x和STM32L021x启动模式注意事项  {9 W5 b' E$ ?0 J! e1 I5 |
& m6 l, x  a! ~  b; I5 K0 p) p. B/ H
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项 5 @, Q( @6 p# w' ?* [8 B

; h& k' W& b1 O- G$ p: K$ c16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
4 V9 y9 X! r% |+ U* T5 ~5 d( B7 }/ [0 b0 J, f" t6 V* o
17. 如何使用STM32NUCLEO 板来测试串口Bootloader7 S. U9 d3 @  A  k+ l* y

% _$ C+ O2 ?" s18. 在STM32L011上通过I2C接口实现IAP
( ]: `, f! h! d2 [& G* Y4 q; K# _: V# q& z- u# }
19. 在IAR中实现通过将程序在SRAM中调试的方法5 h: R( O2 J- b- Z+ u7 ^; C/ R

/ C* E) [7 B, v5 O5 C20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
' _" ~$ R/ p3 X7 H$ C1 Y, Z9 S& Q7 ]8 ]. ?6 l. ^( C. m6 f/ R6 y% |: M2 l/ c
21. USB DFU IAP 例程移植的两个话题
8 s7 M0 j0 F' ~+ l, `7 Y0 ^5 p
/ m/ n* U8 ]# @6 y7 L22. STM32F769双bank启动- e. e# o( v  \$ z, B! b2 {. V( W

. p& s- X7 h3 h' z2 ?& F23. DFU加载 工具 DfuSeCommand的使用- m2 T5 n4 m6 q
4 \( q" u9 Z4 s& `( A2 L; `' }
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码    1 A" ^" R. P& h) L6 ?
, g8 K( J8 P  G  f
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)* I& D% D" Y0 [' D
$ ^2 z( b& d: f! D/ L
26.STM32 Bootloader异常复位案例(2019.4)
! ~% L) X8 C1 C7 U
/ }& N3 y# j5 O$ A3 l2 G1 a
四、存储器
3 G/ M% y" W! `/ ? 7 K. k( @$ B3 s# @9 P) T. `4 F
1. 对 Flash操作导致 USARTU接收丢数据5 G* s% @& ^+ d2 {. V# J- y

/ t* @3 u' i/ X6 {% V: Q* j2. 使用外部 SRAM 导致死机
5 j# d# R- T& p/ l ( E7 f$ z5 ]  N. u. K, X4 ?
3. SRAM 中的数据丢失
0 I/ R# e! E$ m( {& g" y5 a
2 k8 v8 G* i7 m3 N- j+ \% y4. 干扰环境下 Flash 数据丢失
, o. ]' q6 W7 z  x
" ?$ u; W/ A/ B- ~1 ?  B5. 使用 CCM 导致以太网通信失败  W! r& u9 Z$ R/ a+ [0 `$ Z) G6 K* n

' v% k2 ?" T1 t# B" r# |6. STM32F429使用外扩SDRAM运行程序的方法6 b% a( Y9 W% a( z0 i8 k

6 l/ Y- Z9 O0 H) _. T  v5 v) c7. 使用STVP实现对STM32L1系列EEPROM预置数据, ^, n" V' r3 s' ~

# _, P, G2 P* |5 {) ~8 e+ c# v8. FreeRTOS RAM使用情况及优化方法
- M& W7 v. }: f+ |! Z; F' ]3 \1 w5 s( {: S) z8 e/ b
9. 在IAR 6.5下如何将数据存放至flash中
- H4 L' u" h8 c! X9 }9 m! d) ~4 A. U1 Z
10. IAR下如何让程序在RAM中运行  S9 }" r% n) M! m/ s; L

) j( W* j, ]1 h7 ?11. RAM上电后初始值问题
& @+ F6 w2 F+ }6 k1 B
8 _% S0 D9 X5 Y- H12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
0 n+ h+ A! H+ m' D6 e5 v  b3 E9 A" N3 W" l& T7 Z
13. LwIP内存配置* H. H7 c  s& h+ N6 j# b* V
7 w. o2 m2 V4 D2 d" A. W
14. STM32F2高低温死机问题
4 x6 r, ~/ _7 R4 U, l, E- `. k2 ]) p; H( b& M; J$ d9 o
15. 使用STM32F427的CCM RAM时遇到的问题% _9 M+ _4 X. k& y/ e# p
) _6 c$ d! o! F5 ]
16. 利用QuadSPI外扩串行NOR Flash的实现  
  p) i0 d7 v  D% W0 Y5 w
6 v7 n/ ]( \8 Q4 x" j" w8 z17. STM32擦除内部FLASH时间过长导致IWDG复位     
% g9 M$ U' T. m& J$ K* k# @" s* a/ y2 Q  c

; U/ S5 |2 ]% {4 j5 `3 f2 v18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)/ p, P& f+ z, x5 {5 q, O) A* f

, x" u( T" \2 g, ~五、模拟外设  K9 c' v" R: c2 X7 W. C

: T+ n/ A: u. O$ s' L8 f- l1. ADC对小信号的转换结果为零, _: S: w% e3 U# p* ]

5 P* Y' }! a/ }$ p- q+ G: Q0 `% Z2. ADC键盘读不准
. m0 {( X$ P, J4 J
6 \: C* E+ I3 M& I4 |3. 扫描模式下 ADC 发生通道间串扰# ?- i! G4 M: N" b; d
" C' ^9 P- t# j. T
4. DAC无法输出0V的问题分析解决
8 a+ e6 ^; l- { 6 I. o) h4 F3 L: A+ g$ C2 D, S0 h
5. DAC无法输出满量程电压的分析解决
) h9 y, X( f7 }; L
' K; ~  O2 y( ~7 \2 e) w& _, E6. STM32F30x 的ADC 采样的傅立叶变换
( i) [& d% O% K
# R+ |% M) v6 l  `7. STM32 F1系列 DAC的示例详解: D9 {1 E2 ~2 U- d( ^$ r

8 H2 J$ A4 a$ l6 r, g4 |0 E8. ADC 连续模式采样浮空引脚问题$ G4 j( x4 z" m# y
1 q& s5 F" q/ @8 C
9. PWM硬件间隔触发ADC
8 u* j  E' F( V6 a) ?  u2 c7 R4 o2 h8 X7 k+ w3 a
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC0 W! m+ G% t7 t& J9 n3 C* I  F

. \# }+ b9 Y# B; v3 b; F11. STM32L4 系列中ADC 通道配置上的区别
. v! K* |0 U3 H: W" T+ B7 }9 m
$ H7 [" F& a# Q" c12. STM32 ADC模拟看门狗及其应用
; y9 C' X/ w5 W- C6 k7 t0 L" w7 ~* O% h( S9 k7 l
13. STM32L053 comp2 比较电压无效问题 3 b* s# Z2 ]: F3 F+ J6 n
6 \* }8 G2 w; t/ n$ J2 `
14. 运算放大器OPAMP在STM32L4上的应用
8 g$ c, r, _) h# |
0 t+ b2 |! m1 g% c/ s15. STM32 OTA例程之ESP8266使用 & C8 G. I0 k" k3 }3 [3 e, H

; M- I' r3 O& d) }; l& R7 }# ?) C16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
! O: D/ a4 V% E
2 g! v5 c1 P0 R$ Z六、计数外设, c' c% @( y, D$ O' t7 q
9 }. B3 W$ H- A7 x" t# o, l0 h
1. Watch Dog 失效
- O. R2 C7 a9 f0 q, @ 5 S& B7 c, _% P  x4 W
2. RTC计秒不均匀
, L& z' Y7 p9 s% S8 p ) `+ Z5 |& Y4 |3 T& d! F2 r* n0 ^
3. 软件启动模式导致 IWatchDog 失效
( z2 y3 X  U! y  ^9 l) t; e
* @- v8 a4 d/ H4. STM32F030R8 定时器移植问题
. K4 U9 X% v1 b. q7 F) z* |- C7 t( {' u# Z  S
5. STM32F0使用RTC Tamper的几个注意事项  d( h% ?- S5 Z* _
7 P8 b5 ~4 X$ h
6. STM32L053可控PWM脉冲方法之DMA
- s/ m2 B. D! N, ~# f" I5 Z& u) X2 [  k5 i6 `+ c9 K) e
7. CounterMode,OCMode与OCPolarity关系
! v. y, Y; ?8 a5 Z9 p! \- X$ L+ |) U% a9 R8 Z. u9 l5 Y5 P- L
8. STM32L053可控PWM脉冲方法之DMA& A7 _) U, w+ }0 n' f

- T/ l; \$ F6 A4 r6 m9 s9. STM32F1通用定时器示例详解—TimeBase0 d0 ^" F0 }5 L) \. h
: K- a0 \3 t. X! o& W
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals& E5 S) I3 F% ~

0 ]% d/ T( X* w11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
% ^( H- V$ K, x7 F! W3 L! R$ p/ _% z$ I. ]  W. w! B
12. HRTIMER的多种Fault事件联动机制
# M7 m: Z) F5 F ! I9 |! ]7 x6 [; b& b' B
13. STM32通用定时器 示例详解 —One Pulse6 {4 p% a- q3 ^) v9 i7 A
% P" t4 C4 |7 K. Z  ?
14. 如何用LSE校准STM32F4内部RC振荡器
1 A" {/ X  z2 t7 C) I3 a# b6 k: c% Y, U8 ]
15. 一种使用Timer测试HSI实际值的方法
* o% P% X; g8 w/ t! j4 V- R' u2 |$ A) m# a
16. FreeRTOS定时器精度研究' C; [1 o- ^* J
+ r' q5 P' I2 \- B
17. HRTIMER产生多相相移信号
( p" b+ `  G, m6 t, A
! f0 K3 M0 E- ~* |( h7 ?18. 窗口看门狗启动时异常复位问题( X. B4 t8 L& I  I5 ~( }
+ |& d/ _( O# y6 J) r- u) M* D
19. PWM硬件间隔触发ADC
( Z- v# l2 L$ N7 b) |4 x# J+ ]6 J, B% V, N7 Z; ?2 f. Y1 p' q2 s
20. STM32F030低温下RTC不工作
  g- ]% N' \, @; V8 w+ n7 Y, z0 V7 Y: R1 |+ P+ q* _
21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   % V9 M  q/ T6 e

- F; j/ u1 r% Y8 i/ ~# k22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29). W  v- y2 J- P; @9 B8 a4 a

) e* H6 b5 |* W  o  p% [4 |4 ~* R23. 基于STM32定时器实现定制波形的示例 (2019·7·25) 4 x2 e. e3 F5 Q/ j. D$ E
5 q2 d9 W# W6 M) b: T; T6 J
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)3 `% m' w9 q) R. v$ e+ D4 f' [

- F- v! b' l- X  \; e9 }* Q1 H, {25.MC SDK 5.x 中增加位置环 (2020.3.31)
+ Y& Y3 m5 `& [& U1 C. e) v- g

/ e: F4 j; k8 A, M9 y8 d26.STM32高精度定时器PWM输出话题 (2020.4.29)
7 e( c7 A/ z- w# ?4 F; w
5 s+ {7 P5 A. n+ z1 i
4 f' g2 Q" R4 I- k& V9 j
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)( q" M7 E* ]7 H  B2 q/ _- h
* d- _0 h5 ]" g
七、内核& w% L9 p4 [9 w7 a' J
& U$ ?! `) U( N. K( A0 n2 A
1. 使用指针函数产生Hard Faul
4 \) }- |- ]; y8 B5 {8 G2 S" C
2 p% U5 u4 q7 v( M2. 调试器不能通过JTAG连接器件+ P0 N8 |  g" O2 J0 c
3 E4 z# _+ `4 G5 b+ o8 f) c
3. 鬼魅一样的Hard Fault0 g  i/ q4 C. E

: d8 m4 o3 t$ j" S# k% j; C* F4. 进入了已屏蔽的中断[
% F) ]% y: ~" o % b  X  G2 M, ]: b7 u. A* k& W
5. 浮点 DSP 运算效率不高
4 j5 q8 C& z' }8 h9 A9 @8 _( n( ]
7 F; x; ^3 E' `& F# N6. STM32上RTOS的中断管理' n/ I3 H5 `" d8 A8 \

  x# W& @9 q. S7. STM32F7与STM32F4的复位序列比较$ H5 @. r4 n* M9 ^9 f

  n2 X# J$ T% e* G' r: U  c8. STM32F30x 的ADC 采样的傅立叶变换
% [2 K2 l5 v/ O0 R& a, `/ M/ K* r" ]+ }5 v6 q
9. EXTI重复配置两次导致误触发中断的问题
$ c/ h" y9 t' ^0 _' y' G
( k+ F1 V/ u4 ?; z10. STM32F3xx/STM32F4xx使用浮点开方指令0 t# B+ _, A2 l3 f, w$ {" x

9 V' o4 m! g4 k11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响& v! `: @3 T3 p8 y5 {- t1 p* T
. x8 F0 u3 R: x( O: H
12. STM32F7 MPU Cache浅析  7 d2 _0 k1 o' G! I6 B$ D
9 k" k' ]7 n2 S# q) i$ Z* Y5 d. k
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
5 Q4 k2 ^% L; f/ |
( y! I. _! S+ ]+ |
14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)/ V) ]6 i9 [8 `9 M* q- S' A
' v& N& ^5 z% R5 M. @, \+ f
2 |- `: O9 b" j7 d, a
八、系统外设
" ~& j2 I$ Y2 r0 V% o
- ?& e; z/ L& M: x# Q1. PCB 漏电引起 LSE 停振
% p! N6 c6 v! {! e
( `6 {6 b- o4 t) Y2. 时钟失效后CPU还会正常运行: Y  G4 l' ]1 i5 O

* y& d: F" e* k# \2 R3. STM32F2中DMA的FIFO模式
1 j8 F! A+ j8 K( [* r) k  T' O4 u$ A7 J( o4 x, A, Q" F( }: F" b: ?
4. STM32L053的GPIO翻转速度的测试
0 ~, ~; Z& e* V( D% V6 `& T8 b
; ]0 i& Y, j( M% I5. STM32F4xx PCROP应用
! K, u' B7 @% o" r( {# j0 ]
. l+ Z: _( K/ |6 _( j2 ~3 C' R6. STM32L053的GPIO翻转速度的测试/ ?* X9 z6 {7 r( _$ [) t" n

9 |# \* p+ M% A' r( S: k) B7. 如何在IAR中配置CRC参数7 J7 b8 T) s3 Z/ N3 S; r" h

. }% Q- s# H. H8. PCROP区域函数无法被调用的问题与解决" ~; E! P* m9 [% B4 C% ?& ?
7 }2 r+ |) k% \5 t; n4 m/ {
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
8 s  E5 V! J, w; q  u. p- M, y+ o1 t* L9 d, M8 ~; x/ R
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计- m1 S# g8 H" U% Y

# U8 j: b9 z( q& v11. 如何用LSE校准STM32F4内部RC振荡器
3 @! c1 Z9 l4 D) [) k$ n" i5 D6 g% `$ e9 _
12. EXTI重复配置两次导致误触发中断的问题  
# v! H) S" ^! w) p1 g. N7 @+ b* j6 W5 s5 C  K: z. |! p
13. 时钟安全系统的应用(LES篇)  
; R6 c, X3 d+ I7 H
7 I: |% g! m, N( T: U& T# r4 I3 A
14. 利用DFSDM开发PDM麦克风应用介绍  
2 d' z& g4 p9 h# X  p- ?
- U4 q9 M3 x7 Y' I" l3 ]
15. STM32H7的FMC外设在DCACHE使能时运行不正常
7 f: w; q' g; H: @% f, c+ [" X1 R0 z% F
3 s3 x* e1 v2 `( m16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)
1 K$ s) X- _4 v: W+ W( g7 e4 x  U& f% [3 ~0 x' F7 y( J" e
$ E5 [. g# H+ t+ G3 O5 V2 q* _. E
九、标签和收发器3 o8 G0 L4 r, _& u" X% a9 V

/ j% j& L* o. P% Z$ j1. CR95HF的初始化步骤
3 C' f3 D* L' [1 A2 \5 b- r" j : `6 a- N% w7 G0 a8 e  n9 R; |6 c! T

# A" x( M) m- U7 r
$ [2 `4 Q3 v. g8 V' H2 ?' b8 p十、生态系统$ i* g! W& i& M% j% w

! K) _7 l$ f& B9 \! k; r' y1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题1 u* O2 L" @' f1 o3 Z
0 a. Q5 f" R4 j3 D# x" ]4 M
2. MDK Logic Analyzer 功能在STM32中的实现问题" D  k) k% s. E* S. d
. U" L1 t4 c, w: ?7 a5 W
3. 在IAR6.5下如何将数据存放至flast中
1 S- j3 c  q. M; Q9 F7 M7 T / _& _7 Z  h+ e. D8 W$ p
4. FatSL移植笔记& ~0 H1 a& {# X
- J& o, M& c( [6 n( Y; l5 t  u8 M5 |
5. Keil中使用STM32F4xx硬件浮点单元2 I" \$ w; Y& Y

( v+ ^( ?3 x9 X$ C& g) ^6. 如何生成库文件(MDK和IAR)6 Y' L% M7 }' C9 c- X' R7 k
" |) H8 d3 ?3 [
7. Nand Flash文件系统解决方案, ]+ _/ B$ |% ?9 |+ W& }% @

; @2 k, ]) _" }9 C3 l" [* P8. STVD在调试时弹出“Cannot access configuration database”的解决
8 T0 ?# d: J9 X; j' K: _; L 1 B% ~7 c& _2 B/ n2 E. ?3 G( `% b8 v$ U8 v
9. RTOS低功耗特性的设计原理和实现
/ [* o: Q/ F& ]* X) x : Q5 |& T9 s( X
10. IAR下使用J-Trace进行指令跟踪
& K4 F4 j1 Z8 `+ R, U  a
) N" _& Y/ K9 g11. STM32上RTOS的中断管理
8 b: k9 k, A* }% @& i1 J
! v% z+ A0 l" R8 A0 W8 ~12. IAR下如何让程序在RAM中运行
8 i9 Z7 y/ r0 u! s6 T+ q
  K% n6 N3 ?5 W2 A+ r/ r$ |2 d13. 如何在IAR中配置CRC参数- G% P6 Q. X$ U/ l/ v$ X- [9 ]6 L0 M

( m' L! H+ F5 K9 v# }14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册1 t, G% B9 r; K% _9 v' U4 ?
& A5 p* @* d2 O5 W9 e
15. 使用mbed进行STM32开发及STM32F0的时钟问题
6 `8 U( ?. {/ u; F& f  c% z1 p& e- ~, U3 m* a, g  [6 _  _
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
2 _  e+ z# b" ~
. G9 j$ W. J" s8 K* I17. 多任务系统中的不可重函数使用注意事项
" T( M+ o1 p: O  f) @/ m
* e* J' R( o# [( z/ p4 S18. STM32 utility的hot plug功能; o# _$ q1 A3 h
. T# h: C: M3 r
19. 如何将CoreMark程序移植到STM32上
+ O  j, G5 T7 v9 I2 \  G! A: d  x
. A( L: w' G/ `$ v. w) Z20. FreeRTOS定时器精度研究5 s- ?1 ^! q" i( @

. W( e# w! H" J7 N21. 如何使用Eclipse和GCC搭建STM32环境! _- m* T6 U  c2 D

! G- X, B, ]6 ?. I4 |/ ~8 e$ Z/ k22. 如何建立一个基于GIT的STM32库6 ^7 i" z! F9 v3 |$ {* [
) l: {" W- }; s+ O
23. 从零开始使用CubeMX创建以太网工程
/ y7 I' X5 H  l6 {. W+ r" O* t# X: L+ m
24.从STM32Cube库向标准外设库移植FatFs文件系统
' C  k1 l6 P# |
8 i* e# l! c. q25. 基于 STemWin的屏幕旋转  P$ N' u0 m' T0 e4 G

% \. G' N) {1 _$ v- [" `26. 编译软件 Hex文件烧写 3 y* Q) c3 F2 k) D# d

  K2 s8 |) _8 M27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 5 X' c5 l. u8 ~5 ?7 R1 D( z$ s

- L4 m. E6 q4 H  ^28. USB CDC类入门培训" }! `7 |# C+ l  o9 O8 V( m  Y
+ }9 g1 u# h5 g
29. USB DFU培训
2 u5 r" l7 h7 X' h; F4 j) D2 z
30. 用于量产烧录的拼接Bin文件操作
3 n- i- w! L) M$ ?& L4 T. y; ?7 n4 b/ C
- i: O8 m6 @8 X: c1 m31. STM32免费开发环境该用谁
9 B# P# S: a7 l5 w
6 X  L8 y4 s7 t- ~5 g( T32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)8 h, `) c) F8 f; @" y6 }
! Y. J1 @; _) _; h+ i+ v
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
+ D, f, m# [  ~3 I: b1 @9 P6 [; b; D& Q6 H9 X+ L
34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  . u! t, n9 i9 X: n

+ b2 T% ~7 ?9 `$ i/ R35. STM32 FOTA 例程之 cJSON使用   
8 ]8 s) s/ v# n( V5 f0 p7 E5 c1 Z0 q" ^( F$ c0 ^$ s
36. STM32F769DK 云端固件升级例程使用说明
/ F, k  `: @5 _
$ `7 X* ]: x+ c5 T6 ^
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 ; t1 E7 E! v$ D
  e% D3 e1 |# D. `
38. 基于 STM32 的阿里云物联网平台方案 % k: g% X6 {& q, E

# r" U0 f6 ~4 T1 B39.AliOS 任务上下文切换原理分析  
& g. U  d' W( Q/ h! b
$ P4 ?+ R8 d4 o- m3 B40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  1 H6 g) F$ p3 r" O' H* F

, G7 v) T7 l+ ^0 p4 B: R0 s& z41. STM32F769DK 云端固件升级例程软件开发文档  
9 e+ o% t( t9 ?0 G# g

# b/ j5 S2 m% C: |42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
' m3 y1 \9 p. G( \$ l9 V/ H! W) k5 K" i4 }
43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
0 U8 ^8 H( Y9 B+ B3 m6 P- ^1 K7 x( `. v
44.零基础快速入手STM32MP1 (2019.9.19)
0 B) Z$ ~; R4 p7 P5 }! S. [& A/ f+ [
" N. p8 ~3 d* d# z, B45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
; g1 ^, y+ v2 }( t
% M$ d& ^  g" f) B& N9 \十一、调试
6 d* O) K" L7 H 3 I4 N1 }1 F* Q$ J, ^1 X) `
1. 关于STM8S SWIM Error[30006]的分析- Y4 h" ^% f  u2 w+ p  C& h

. \1 ^0 z; d6 z1 y2. STVD在调试时弹出“Cannot access configuration database”的解决
/ Z) R* W% y% p$ ?. z/ P: N , H2 k8 g5 [. U' r8 B
3. IAR下使用J-Trace进行指令跟踪" B7 N" f0 s2 e" X( n! l, l

; A$ w, j; ]3 q# t+ U4. 菊花链 JTAG STM325 M% ^% Q( P0 y( S9 m1 i% V) p
$ q2 t4 }) R) a2 B/ C
5. STM32F411CEUx 能下载程序但不能执行
4 M& R$ G- G4 ]7 X4 B
2 y0 a# t% d+ U: b# L) \6. STM32F103C8T6 程序上电跑飞
$ X: T4 z( U. D; c5 K& d
0 s2 }( X( t) X# |- o7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
+ f$ a+ O7 _1 E& `5 q9 V; q
  P# |+ n# x: l0 v" x* {) y8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
% {+ x# Q- \" F3 h; v6 s7 K2 Y/ L. i% B: M7 g: \0 Z" w
9. SWIM协议的GPIO口模拟
: g* o: m) e- A9 [' k1 M
6 w8 o) {. m& l! ?10. STM32F091空片使用ST-LINK烧写后复位不能运行用
' J: k! T& m( [. l( ~
* C6 _# s  V8 e% f, p, ^11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)$ `# K0 n0 Y- z/ i, P& j, b
$ X& y  M/ r) J
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)0 q- p% _) B) g# P" D
/ X/ z  o4 r1 U; C
13. X_Cube_ClassB代码移植 (2019.12.24)
' I. E7 q8 z/ M. D1 T8 P5 g" o* F! P! t0 V& K4 Y. i! P
* a  F. R' \. G/ t' }
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)% ~3 v2 V+ A6 M3 l6 k7 _3 F) a4 Z

( c$ P6 |+ r1 q3 y* E十二、人机调试
* T  c, P9 }: h; d, H1 }7 R9 c( ]: b  Y  h5 C
1. 一步步使用STemWin在STM32上开发一个简单的应用6 a: m+ Y3 L1 B* S8 D

" s1 x, a7 C8 ?* T2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计$ `" a* n9 p% D. v9 A' j# D
4 q, R- R8 e9 Y1 V4 u4 @
3. GUI方案中ALPHA通道处理介绍  X% c& ~7 w1 W( r; O/ u( `
- o" Z- b8 l, v0 s. F; c
4. 基于FMC8080接口8位LCD的STemWin的移植( W. o8 h$ p' I6 D9 d1 w8 Q; Z
% X  C* }  y3 E" v, K9 ~+ t5 d9 H
5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
  o* \! k8 o; Y$ o
# X) ^) I$ O  ^* Y6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)" h( }/ {' L/ V% y8 ^
( R% f7 R4 f& [. {
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)& V. ~5 X/ C/ M- L% q
# q3 ^3 T8 q5 [5 E3 D
8、STM32L5中如何关闭trustzone (2020.5.12)7 L# a+ Z3 g" a" M# w5 C& E
3 C3 d, E5 L' t
十三、马达
% A9 n* w+ G; m' r% z; U# J7 a5 R; K- L3 V) E8 A& }1 v6 a
1. 电机控制同步电角度测试说明. T$ s3 B5 Q: _
1 |# z) s+ x: u, O
" M. [$ }" C: B3 l

+ K- a* D7 v: F  P" F7 o十四、安全% n8 S. J7 z" R( H; L

9 `  W& n8 e: w3 E, \& o1. 一步一步使用STM32安全启动与固件更新(2018.3更新)% }" s! v: o% R8 s# d6 ?" d

7 @9 f6 f- C$ K7 S# h! U3 L
6 u  |& }- g+ a9 t9 G十五、其他
1 H( a% g0 {' I* w  W2 g
( m2 _8 h6 k& W2 V! v
1. 跳不出的 while 循环$ T/ Y+ p2 H) E9 G7 r' I
1 A- @2 j2 J8 t
2. 外部IC连接NRST导致MCU内部复位信号失效的问题
4 i$ u" f' C7 y/ G, r1 m
6 D$ y2 M+ Z% `- H3. 潮湿环境下不工作
- k+ H9 s6 Z" R. `
, \" m6 |- |8 s9 n( F* m/ ]4. PCB 漏电引起 LSE 停振& {, q" H7 K5 _$ D3 G% y
; [+ s$ V! ~6 \- s) K/ ~1 O. G
5. STM8L152 IDD电流测量" s% e. W) P1 L& {+ [1 w' \
0 y  F0 v8 \0 s# v5 {6 z
6. 使用STM32实现锂电池充电器
% {# W) A2 E* { 4 [- |5 C: w4 [0 ^% U, D6 Y9 t
7. STM32_STM8硬件平台基本检查$ W+ o8 u1 h! R# s( Z  U  z2 |9 T5 `! Y
8 N( A' A6 K4 T3 n$ d% T: x
8. 验证STM32F401在STOP模式下的电流
& u$ ~& X0 g1 {, x& f; S" U3 w  f
* p; L* r  N  Y% B' ]. A& b7 m0 z+ B9. P-NUCLEO-IHM001 电机开发板串口调试指南
* R3 _+ Q+ @  b+ B8 W; ~8 |# @ ' F2 _  F; L) R0 h& h! r6 u
10. 一种计算CPU使用率的方法及其实现原理& h! V1 m/ b7 ]* _- y

- ~5 y7 [) o! o* a0 Q7 c11. STM32 RTC不更新原因分析
8 s& g4 b* s: L% M4 k5 m* h5 z9 ?0 f1 e1 y& K7 }9 u
12. 关于ST库函数的代码性能对比% b3 \8 p0 g( P9 F8 a& Q
8 Q, y" ]6 B1 B; s; ?7 E' H8 k
13. 在IAR中实现通过将程序在SRAM中调试的方法
! E* O% l# \8 _! {& U4 A! A" S2 P! b4 n2 B& h
14. M95xxx EEPROM写保护配置' t: c  v" x) e; C1 S, j

( i, f2 }  r3 w" U9 A9 w15. 4SRxx的GPO的属性
: |' v2 W2 a) \" r; ?
# |8 L' k8 G7 ~! a16. CR95HF的初始化步骤
1 n* i) m1 U' u# k0 C6 |  f2 H/ w
2 r! q, U/ B1 F/ }: u17. 电机控制同步电角度测试说明  
: ~1 o8 S  t/ h. U& e% k  O5 P( B+ d6 U* ~) I9 r* f
18. STM32+BLE通过 Notification与 Android应用程序通信的例程0 Q8 `% y$ a, X9 p" x# y! r9 t

/ u& X2 K+ v# o6 J5 \; @19. M95xxx EEPROM介绍
; Y, Q4 C* K. [/ g/ l: t5 G
/ B1 o1 d1 J3 K( Y, V$ O20. STM32 DFSDM测量温度应用 7 N' M( o# V  e3 ]  g2 `# J: e

) C7 [! k/ G2 F+ J21.代码实现PCROP清除4 N* T8 E" E( D/ n
+ }( z, ^  E& ?3 O' ^; v
22. 理解与应用MPU的特权与用户模式
0 b2 q& x0 o/ v1 H9 I; O1 m2 G, x& {! c, j) `/ s  l
23. 用于电机控制单电阻采样PWM变形信号产生; \, l5 n. }; N- ~. R1 [  y. [: q
  s4 V" b% u4 {5 |; Q3 j* Y) T/ L+ K* ^
24. STM32L低功耗模式唤醒时间测量
+ S/ m, C0 K) b, [; e: M6 I5 r1 K- y& Y7 e0 u
25. X_CUBE_SPN7程序电机启动抖动问题( l; w2 ~0 j, [0 {4 N6 ~+ A
. F/ y) g0 c& D. x1 Z1 f
26. 发现STM32防火墙的安全配置
/ K, G/ O9 K8 z& P3 F& D7 j$ w: n8 O! n9 U: \
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
' b, V- o' D( W0 r+ b( N4 M- C8 d; p: ?
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)- F+ D  v0 @/ h: @
9 g- D8 ~6 {$ U) ]0 M
温馨提示:

# g0 G& g: B! E  ^) O* V7 d
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
5 Z- W  R& `/ A, r0 S/ ?9 _
) h: ~& ^2 M, X8 V3 _. H

1 T! W" W- l/ g; I. ~( \: `( L
4 S4 p+ l5 d/ A& F3 B' d" b9 r4 Y& r+ s2 q- n) W1 Y+ ~& A( \/ W

# F5 b* p! Q+ m8 s2 @. o, |) g' ]" |0 @5 s

" W0 I6 f( s+ O, w6 x
9 a& Q6 s5 J& a- @. G& Q
9 s' @1 S" d4 g' k8 Q4 z( q
" e, X, j) v3 I9 x

评分

参与人数 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
好详细,多谢分享
: |: {1 A, M, D2 h6 q; L
5768340 回答时间:2018-1-13 14:42:54
HI  
1 x! [5 I, \7 N4 s5 u   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
/ n' M8 T2 Q- e2 B  k: @+ i   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************; C# A) z( j8 N4 Y" E
  2. 函数名称:Cdfinger_Bspspi_init7 R9 g' Y( }$ T' P, N% U
  3. 函数作用:spi初始化函数" T, P4 l+ Y: q# l8 s$ e
  4. 备注:: \; N% @/ h2 L5 Z
  5. ******************************************/
    2 Y' H0 x; U8 i+ ~/ n( {
  6. void Cdfinger_Bspspi_init(void)
    8 e) M( c' @* \3 z; M/ h8 J, @" x
  7. {, d7 p4 N4 ?# W# @. F# d; V
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    0 u# _" V+ O  Q5 \, K% k- b' C
  9.         SPI_InitTypeDef  SPI_InitStructure;7 t% x# q3 w+ j/ Z3 A( d% `- [
  10.         DMA_InitTypeDef  DMA_InitStructure;- C6 z: \; h) d5 L2 u1 p' m$ t
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    ' k3 b) f1 B! e! x1 R
  12.   
    5 N6 ]1 `7 S3 K9 N/ C8 I
  13.         int ii =0;6 h0 w2 {4 n/ d$ ~4 k" `/ i4 N
  14.         ' [$ [) z: ?1 A8 \
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    # H; ?+ d, w1 S( U9 h% l: K- J
  16.         /*!< Enable SPI2 clocks */
    % \, {- r6 f: F! f5 H8 n, \
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);; f' x" Z$ c5 I7 j  e% V6 f. h  F* Z
  18.         /*!< Enable GPIO clocks */2 w3 j3 k; z2 U3 Q* s
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    & t. t3 P) a& f. @8 \# u
  20.         /*!< Connect SPI pins to AF5 */. V: e: i) \- @$ ]) D( X" X$ q
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    0 }' V) j8 u# N1 H
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
    " \$ @/ T- x( u  V/ p
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    1 ^; G( _+ v1 G: H2 x% ^/ A7 P# }: W
  24.   E' F- X. @3 F4 _8 |& ]- [
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;; d0 H, P3 p- t/ T
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;% [% \6 T7 o* e8 h' L4 T" X: \
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    : m* `" c8 Y8 m
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    ) n4 N; G2 n9 W0 E
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;, y5 ^; u# C. x: y  s$ ~3 v
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);1 ^7 z9 Q0 q. w7 W$ i' M0 m, }* S# ?! M% \
  31. ' Z! n5 w" M% r# p$ f
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    , X" ]- y) j7 q/ y5 H' i
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    " o- }# `" R9 P+ F9 G' ?9 ~
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  g$ q4 M9 T+ `. }% V7 g- }( Z' b$ c
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;& Z3 A9 r: X' ^1 M4 \/ ]
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
      o9 r( T3 V& E' E" A3 I
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);* Y9 P( O7 b+ b; f
  38.         Cdfinger_BspCs_HIGH();0 ~, b+ R% L! N8 |/ c1 {# J& c. n
  39.         //Cdfinger_Bspdelay_ms(1);+ X* Y( p  z+ a' ]) g% T( y; Q3 y  e
  40.   //Cdfinger_BspCs_LOW();2 {, S8 k9 F+ n9 W/ ]/ v! M" s8 X
  41.         SPI_Cmd(SPI2,DISABLE);! ?- ~3 m2 r1 G
  42.         SPI_DeInit(SPI2);
    1 q8 o2 }/ ^# G+ N( G
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;/ S2 \5 S! X/ G: N0 \; [
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    ; Y! ~+ p5 A1 j( j) w
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    . z$ f5 `, n- Q( v5 q
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    5 v6 b/ s+ R* X( Y2 s
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    ( E2 l) T& s3 q7 v. y3 D
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;& t) b0 G1 }6 D- D6 ^  f& A
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;7 |- ~3 b9 o( z7 b
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    / }6 {# k: n5 j9 D
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;  H2 y6 P! C- ^
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    2 _6 ~7 z& t1 ~. z& z

  53.   d; W: K3 i8 t( d
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    : g) O; g% B+ J: E9 l
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/8 R/ U/ i! g% j- Q7 c
  56.         DMA_DeInit(DMA1_Stream4);
    + `: |/ ^$ T, l8 Q  ~1 J% z
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;, x- t" ?  @6 U
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);% _: y3 r6 i% @  K! U
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];1 N, C1 o& u. b1 @
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    ! N5 q$ c2 v: o! D7 D/ o' D
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;2 M3 E9 I( k& r& R9 A' Q! L
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;4 {: {$ l: i3 f& j- }) h1 b
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;. C5 V; U+ y8 D6 {$ w- Y* ?0 L
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;3 v& I' }6 G8 r" E
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;6 U/ f2 `: E2 C/ U3 O
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    1 k+ X9 o4 W- Z* a) t5 }
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
    , @) h" |( i! \& ^
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    0 ~3 D) N5 R/ a% b/ |7 K2 M
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    # M  `- n) y4 W9 m4 @! S
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;, J" C# v! W$ h1 F0 v+ C6 H, X
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    . g, A: R1 T, I- J  T( u
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    2 a! T$ L3 m9 H- D& Z1 H
  73.   
    " e5 w9 A3 {. j5 u/ P4 F
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    " T8 d* ?( X3 e5 o; B; {2 Z
  75.         DMA_DeInit(DMA1_Stream3);
    * h. H5 T) n$ K2 y- U  @
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    % I9 m5 Q( R+ B0 A& u3 W5 [; N
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    / z, O; v& N" v4 }+ y
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    - S3 ?1 H8 C1 H; L
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    ( h& }, b) \2 G$ G
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;( y/ E% ~1 G  r/ y* ]' [  C1 S( H5 ]
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    $ I+ X5 |3 w+ h+ u
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    1 f: d& X- C4 y% n3 |5 A  k) M# l* o
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      l# k. ~- z7 H, J6 Y4 V$ x# _0 H& B
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;1 o1 Q4 s' c$ c' x  J" L1 X; J
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    : O6 V# h/ B! ~- k: S
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;' s. n5 t8 |; Y' S. B* Q2 M
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    ; y. [4 a& U. |% X0 A5 Y' h
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    6 Y8 K. o* `9 n6 c7 L# f
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;7 V* A* G  Y( h- G/ C3 r3 S
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;9 I$ O) U6 w! j
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);7 \8 K& o, l2 c9 Y" A: x, A* Z* Z5 G& e
  92.         //Cdfinger_BspCs_HIGH();
    4 `" Y9 A( H0 {! u8 s4 W5 Y
  93.         % l5 K9 Z2 L1 j- ]; P. z# d* A: P
  94. ; v, j( {( ^; Q  y+ I' s
  95. ( T+ i! `) Q9 f: q
  96.         //发送中断5 W  N; _( M+ _" {* I- L/ R
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    2 a! d0 C* Y: J; y1 J) t
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    8 N" l3 Y! |5 Z  W  d* B" w
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;3 O0 r9 L1 s! |. X7 x
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    0 f6 D7 t6 k, }' m4 Q% Z! Q
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    , \1 W! H/ r( ?0 L# U% i
  102.         NVIC_Init(&NVIC_InitStructure);
    , Z7 P6 h% G$ L3 ^8 S* g5 U% Q
  103.         4 p9 s+ L; u" T0 m3 O+ e
  104.         //接收中断
    + u; U" i* z" @5 t1 \3 H
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    , F/ Q+ k) ?  ?# N" d) o: Q# G5 A2 o% ]
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    + v& s5 ^- V8 |( A, K* y
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;8 T, Z; w; M2 l4 I5 A/ a
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    + A  N  q' S( S  H7 `$ o9 m
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    & C/ ~6 F5 u! @4 j0 ]) S2 q
  110.         NVIC_Init(&NVIC_InitStructure);1 x( j4 N" _/ t( R- M' \
  111.         SPI_TIModeCmd(SPI2,ENABLE);0 M, J* ~" m) W: o4 B
  112.         SPI_Cmd(SPI2, ENABLE);
    ! a$ ~! g' j  }
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    ; z( [  @# X+ a3 x% g
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);' J2 Z, M$ m, ?' U0 b4 s
  115. 2 D, ^; S& r; I7 S$ f$ M
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    1 Q; Z; g: {% I1 v/ O9 n2 E
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    ( K/ L+ a) e6 m2 x
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    3 a* x4 j$ I+ j$ i# O

  119. ! l! r. _% A1 \  I, p5 w( F
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)" g# r- \4 N0 l; C0 A4 T
  121.         {
    ( M! c" G% u$ q1 ]4 v( p
  122.           if(ii%8==0)
    ( n: r; s6 `3 K9 ^' f
  123.                 {" G! Q8 P( H& T2 x1 w, }" w
  124.                                 printf("\r\n");* W( u4 ]: x  C5 a
  125.                 }1 h# V/ l* e5 B3 V
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    ( J. c# Q( V- h
  127.         }
    0 j) ^6 p9 }" Q* ~. J2 d$ N) u
  128.         printf("111\r\n");
    8 Z# Y9 @2 W( E. W' p4 ^" e
  129. }1 M% P) S; E3 Y# p& f
  130. ' P; R$ `" A. _* n9 q: t
  131. 6 n: Y# A, z( X# X
  132. void DMA1_Stream4_IRQHandler(void)
    3 ]" _' }. `! ~% w; |! p
  133. {4 |/ u6 x6 {7 \& x
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    ! f- v! m6 i- A; A% ^4 n
  135.   {
    3 `, ?3 Q+ v# B( S2 q1 r: l* w
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
    + r* z$ e5 u) ?/ i1 W* N- g
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
      C( g" J. ~0 A; S9 P/ S
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);; w3 H9 E- n+ K% }
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    8 w4 K; q8 d/ n5 j" P% U
  140.   }
    - \  W8 ?- h) G. v9 m9 H
  141. }" ^$ ~# [+ P4 U$ W, [
  142. $ Y5 ?& M3 T, D/ I1 B
  143. void DMA1_Stream3_IRQHandler(void)
    & v1 Y* \3 g2 J; }3 g5 S, z
  144. {% Z( B( ~; o) C6 M' N+ E
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)& Q! P  }# Z3 N5 M
  146.   {
    - Q2 ]# k" W/ G: i& t$ d6 G
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    " w' [0 C. H8 j/ Y4 S
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);& g" L7 F* [: I; b/ i5 J1 Z! W4 e" h
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);( e5 i% J) u7 T0 @) b9 z5 R
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);" o" ^( L* |( W6 F, f' J1 u
  151.   }+ u5 ?7 `4 P" L$ e- a2 e
  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的波特率是不是必须为相同的,才能正确通信, W+ \% S$ r$ K) c; ~
以下是全部代码:
1 [5 h1 J4 p. D, V% {#include&quot;stm32F4xx.h&quot;7 O. K' G+ ]4 G7 R: F7 k
void RCC_Configuration(void);
( Q' |, ?- y8 _8 G* C8 ?" f8 xvoid GPIO_Configuration(void);5 y& n+ B4 I* C" c/ {. Z- t: u2 Y
void SPI_Configuration(void);9 }& I* C) ?% z/ R& M
void Delay(int nCount);1 ?% v) E1 ]! C
int main(void)+ u  U. P) e2 x  |! U
{  RCC_Configuration();6 }/ O5 P/ y0 l% E! B: j
  GPIO_Configuration();7 P6 M* G1 P- G% u! D
  SPI_Configuration();% k5 S, L2 o2 C# J# d
 while(1)
& Y" @; O% Q& z0 _# P! H$ w { int data=0;3 R; d( W9 r" [# d
  SPI_SendData(SPI1,0x55);0 v7 ^8 d3 T4 w, M. }% @8 I  [5 x- F
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
' G# o; ]) c1 Q. Z- A' ?+ A  data=SPI_ReceiveData(SPI2);
! R) G9 Z& ]% b1 y- c* ?  if(data==0x55)
. b' s) @2 v$ D6 e5 x; R9 E     {  while(1)  q# k9 U! s! ~
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
3 v' C* K: t  N" @; _% ?- d1 H2 e                Delay(0xfffff);$ \, q  {% a3 i! S6 y2 T( X0 S
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
8 r' Y* A  a# I  S# D                Delay(0xfffff);' p  h  x2 D3 b6 ]
  
" k( `( ^% _8 p( r- @             };! I/ s( E# o* J  a
     }
7 i4 u8 h5 b) A! U) m     else while(1): J# B6 h* C" C$ y# T
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
; O7 T- J) b# p! C- W4 |               //Delay(0xfffff);
  G0 _; i8 h+ [, W' b$ U               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);4 o( Z( B  @6 Z$ J
               //Delay(0xfffff);
5 Q5 Z" j6 Z) R' b8 z7 c" \   # g% y# h. g3 U: o. W! p: N
            };% w; Q' m* a$ \/ r
 }6 C% O7 M' X, J) A8 j
}
( b% c' ]0 P3 P3 t! evoid RCC_Configuration()* T- D# b* i0 S$ Y. K. ?+ a
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
8 w# n2 q( Y) |' B# M$ q  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
# ]2 p; @8 k4 L  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
/ O; z7 C+ U1 z! I0 v7 l4 {}
! e/ l  H# i# t: a7 o+ }/ avoid GPIO_Configuration(): X/ m% Z  `0 K+ `! a2 m+ J. Z
{  GPIO_InitTypeDef GPIO_InitStructure;
/ o! U' P# u* `+ I3 k8 s  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
9 t! R% I* O9 P1 L) w* F  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;* b( [/ F# J. C5 n; }6 W( N& e
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;; N+ d: x) u! p; W
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
% p5 N" T/ w, |& x- i  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
/ f% I  M$ ]4 {, d8 ~& `0 V  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);- [1 Z$ P- H* z' }) o
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;" d2 L( y3 W) d9 E
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;" O; L$ X6 f- L* r3 N
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
9 t/ \5 c3 c  \' T' n( E  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
' f0 F# E& j1 i  s" h6 M  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;- x* v! n; Q. p
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
; _$ {" B3 G3 F  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
8 ~2 N' m" |1 C7 a- n) C+ y- l  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);( F- f& K; V! n' L
}
' F: L- U3 Q' l) f) ^' M; rvoid SPI_Configuration()( X* o& q' X. |" w6 F, g) g9 L' B, l
{  SPI_InitTypeDef SPI_InitStructure;
% x6 F1 y% \7 n5 D+ L  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);& p0 b9 b1 P. v2 \! k8 B
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);+ Z6 L- b7 a0 o0 x  x
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
, h& r, Q7 E; Y3 |( m2 e9 L! y   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);* S. o! x$ }' O& {" E
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
/ X" r2 l9 I3 X% |4 K6 \  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
' U/ {1 A# D4 P2 q' F3 n" i, Y  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;; ^7 [/ `  ?1 H, G( a' w
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;3 T5 x+ J, [- K9 _  B" H  O
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;/ l. _+ T. C& W4 j3 ~
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
* x! W" W" k4 J" Y, K! ?0 P4 Z  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
. \5 y, H5 V1 q" Z  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;" V3 V) T4 M- ?
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
, b4 z  Q" i" L$ ]   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;9 J' B3 k( x6 X7 z: r
  SPI_Init(SPI1, &amp;SPI_InitStructure);, Y; ^$ C- w2 o, A2 n
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;: j5 ~; f( F! r6 G
   SPI_Init(SPI2, &amp;SPI_InitStructure);2 C' c3 u( r1 ?( B7 E2 X( Z* a
   SPI_Cmd(SPI1,ENABLE);
! e% R( v: N- X7 E) |! T2 ~, J   SPI_Cmd(SPI2,ENABLE); 
5 O- A4 n& ~8 V7 D0 x}
7 U: V( i7 d* d. ?: A' E. jvoid Delay(int nCount)' W7 m* ^+ R, a! ^9 r/ _5 J# E
{ int c1=nCount;
9 I+ G2 u! o# \3 ^+ \ int c2=nCount;' z& A, \9 M) b1 z1 m' \
 for(;c1&gt;0;c1--), k3 |: O2 o& V. i, ?$ \) v/ Z
  {
( H& D+ e- W; Q* J2 b9 J  for(;c2&gt;0;c2--);, v4 O) ?0 \2 d6 K. I3 e; [: t
 };
/ ^' i( @# y" `% w7 a+ G, f/ t}7 ?3 g; p! }1 c! S
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:% ?* B. U) ^$ B" ^
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信' \' F7 s& W9 d, l4 ]" V
以下是全部代码:
% C" L( b& ~+ _4 F  |2 P#include&quot;stm32F4xx.h&quot;. \' n2 ~+ f. s
void RCC_Configuration(void);
  b! K+ x. g7 Vvoid GPIO_Configuration(void);
- ~1 k: k0 o  t- r. B5 vvoid SPI_Configuration(void);
, e: M/ W3 r- m9 Gvoid Delay(int nCount);
% a9 {+ }! X) c* P9 xint main(void)3 O1 {/ f& q# K5 y6 s. N
{  RCC_Configuration();- K1 Z6 R8 i8 ?/ P
  GPIO_Configuration();# r' l# V2 D" Y$ |
  SPI_Configuration();
5 x- \9 K7 D5 a  I  \3 { while(1)4 J# u5 g- n% R# o- z8 `
 { int data=0;$ M3 ?+ r! w1 O# t3 j0 L
  SPI_SendData(SPI1,0x55);& b9 R8 ~" [# }) B' r5 C
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
" w5 e( O7 `' o/ r1 i4 O1 d  data=SPI_ReceiveData(SPI2);
/ H0 U. C& E! u  if(data==0x55)1 w2 S  [3 X* y2 \* a& Y7 w# b
     {  while(1)4 O2 H' @' B1 w2 w2 H4 T9 U3 s
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
0 [* c- t, Y7 s  n                Delay(0xfffff);
  c+ {2 ]/ l' C" a                GPIO_ResetBits(GPIOA,GPIO_Pin_4);8 E4 _1 n6 [  `+ @& b4 }, q# A
                Delay(0xfffff);. P0 x5 A4 m7 K% q1 S0 K
   3 E' A" E7 X+ }2 t
             };/ C& g4 q( Z) H- |* M" J
     }
8 d  |0 l3 f- i     else while(1)! f- ~) p$ U* K, K% Q0 U3 z
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
) p# g" E7 _. ^0 P+ G" m               //Delay(0xfffff);
' N5 {, J+ _$ f               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
, V; J6 `! _( W$ y' _               //Delay(0xfffff);7 ~" v7 X) |! o$ p; D/ g
  
: V: g$ H4 p/ v2 Y+ u. O            };
4 W& {1 L& B2 _3 j7 |6 p }
9 u, _1 a( n3 z/ K) y}
; E$ A$ h+ P: L6 l) Avoid RCC_Configuration()" `  r! X" V6 b( m
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);4 i: a" w. t5 C( |
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);  }" @. T+ Q- t$ s
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);     a! |2 G0 g! }1 O3 g
}
/ g6 D8 ~6 u4 _" o4 _  v* ]void GPIO_Configuration(). O* H% U  C) x% v* Z# q- i7 a( `
{  GPIO_InitTypeDef GPIO_InitStructure;( r! T" q9 z, r0 Z# r
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
) q  d0 @! A  F3 T  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
7 X+ h( \" K5 O; r) X4 \) s  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
/ f2 e( o" ~* n9 A2 E% }1 E  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
5 Y# p0 i5 X$ j% x; v  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;" u7 p9 E2 E$ p0 X" g
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);8 d* Y+ Z: F2 J! z
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
1 l- L; h  T3 u' C  [! |) J" Q  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;8 V# N$ c" q9 ?
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
6 _# z; L, _2 W% u( b2 L1 g  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
& h  ^& U6 ]9 E, p/ z/ Q  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;& i3 w/ K& h# s4 [  l- U
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);% i0 C( J7 n: ^7 H' C/ y
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
/ u% K9 W/ P( S0 P: {  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
; p: C% m5 H) Q! U" L: n  r}/ V! A4 k: O2 p  {8 L- s4 F
void SPI_Configuration()
5 J7 o  T* c, f/ g- D{  SPI_InitTypeDef SPI_InitStructure;
4 v, L" X6 }( S, P9 ~8 K0 m  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);9 L0 q# g; B9 C% K/ z
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);& E4 C6 j& F$ {
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);2 \/ K, p) g  y" q0 D# i
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
! M8 r; f9 Y# N5 k% W4 }( l# ]0 s. r  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
* ^2 N/ H( U  `; C9 Y% h- p/ ]  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);7 ?* s. z5 l4 ^' I. j( D
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
, u1 z" X0 E! s$ Z  Z% T( g  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
3 ?1 d/ M# U0 p2 M( y  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;5 m$ ?! t' \3 i  a
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;$ B, n+ x/ k, x
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;0 X) A" P7 N$ ~
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
3 o& }; A! K1 `   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;, F- R: m$ v' x- c
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
+ b1 A1 u2 x! t2 g/ y: m  SPI_Init(SPI1, &amp;SPI_InitStructure);! j8 t, z$ u* p8 U
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
+ v4 n/ I; a7 {( y1 d7 ~9 l! n   SPI_Init(SPI2, &amp;SPI_InitStructure);
/ _: {: j5 t6 r" V   SPI_Cmd(SPI1,ENABLE);
  y! Q* q* z6 E3 g  ^8 l! D   SPI_Cmd(SPI2,ENABLE); * a0 @9 [- q5 M
}- g: r- U: i9 D2 {9 w) t5 m
void Delay(int nCount)4 U, n& v+ y4 a/ ]9 l. m0 q; \
{ int c1=nCount;
# D, b. y/ W2 T+ c$ s$ Y int c2=nCount;
! P0 m/ ^" w  s+ i7 | for(;c1&gt;0;c1--): R. J  }. w9 H1 P  ]( A3 U( T* M' N
  {! S, J" f  J+ q' K* x
  for(;c2&gt;0;c2--);
$ }# J, n. ~9 f% W# |% u };
! ?" m) T) |) z; r}
% E# {: @2 a% B  M! z先谢谢了~~, ^; d1 h6 {- d0 M
 
( v5 h4 q! b8 M0 c& S5 W( a$ j( g% z0 |: ]  N: V  z( l' j/ D
楼上的问题,看我帖子给出的提示哦~
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发表:# ^8 D0 `( M$ w3 }9 e$ T, ?+ f
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。; w6 |& {/ r% e) t5 Y/ u+ O, \
 . i" _% J& x2 {8 J: Z! `, y' @

% l) k' W" U& {3 z+ V多谢支持!!
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 运算效率不高

  7 `5 v( W; o, V/ ]5 V% R: Y
鬼魅一样的Hard Fault
. ]2 m5 e% J7 C! I 6 |: X6 V7 @+ o( R- h1 |7 {6 F
该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。+ @1 y6 A2 D: P7 h$ P5 [/ b5 A
 
& M0 i; j& y# c& W7 ?' v  _, O咋解决?
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 手机版