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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表: W& E3 k1 _4 U. p2 w
" R) C+ j/ [) G7 s2 N: D
7 u7 U2 Q, F+ m: i9 j; ]
社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验后,可直接下载文档以及程序。也欢迎大家回帖交流。8 ?3 U, @2 n1 E; r( D/ d! m

" Q1 y! ^. q8 J7 ^$ s提示:点击各主题,进入帖子,可下载ST工程师解答详请% [$ k* h( F- G7 J' v, L

' |- B% f# R& x$ Y( n1 v
4 u, n5 j' T+ H8 D# ~, Q一、通信接口
" X: Y( [0 x, a0 L
( d8 k- M6 G+ M1. STM32F2x7_Ethernet(FreeRTOS)驱动更新+ A) K5 \2 `4 l! H/ V  j& H
: ^+ ^% i" t1 N* A
2. SPI 接口发片选信号导致死机5 r9 k( T4 R5 s1 D/ e2 `
, `6 J* a: w9 U. V5 o- r* V
3. USART1不能设定600BPS的波特率4 ~6 ]/ S2 F7 c
) s3 R$ p/ N: q8 h
4. I2C 接口进入 Busy 状态不能退出2 t* u$ j4 t+ q& v  m; L7 y" B* P0 e
" K1 ^" l5 i( W" {
5. 对 Flash操作导致 USARTU接收丢数据( F. w! H+ ^; Q5 D8 Y
1 C( f! e! p) y% M' }
6. USB接口易损坏
' V6 |- x. n5 p
7 H' k3 ?7 Z6 h# v# L7. UART发送数据丢失最后一个字节
" s, F3 `$ v1 J3 G/ |% \6 P
$ y$ m% M; K  A! s1 {. m& u8. 使用 CCM 导致以太网通信失败' ^' }1 D5 I3 ~2 a- {# [

( g2 Z5 ?/ m/ ]( L8 J) h* I9. SPI3 接口没有信号送出
/ R6 O0 R$ W+ e3 y# \% h$ K) y
" a( t( o# \+ K& Z+ f10. 时钟延展导致 I2C 通信不可靠
% }: j% d2 U0 M9 T' {2 n   k5 s" j! [5 i9 z+ l# u; J) d
11. M0的USART波特率自动识别问题* W0 }. Y- s* ~, s0 r* C6 F  s
) _( Q' k: K, l% l3 D9 `
12. WK15 OTG做U盘主机兼容性提高7 t) W: Y( o8 r% U$ ]; P5 t
, w* w/ K7 G9 t3 s
13. 以太网电路设计注意事项
3 \' x0 D0 ~1 u1 \. X* R$ K
$ _  g3 P  ^( @  O+ ~  R14. OUG主机库在BULK传输上对NAK的处理1 U: l. s7 `* t6 i' N# ~

. x) u5 _' z  M! k3 g: [15. 串口断帧检测) s" j$ O2 V; M# D3 j( Z" @# W" B$ D
+ ^/ V1 A( Y2 o1 u
16. VCP例程用于数据传输时丢失数据的处理1 Y, R) N0 z: e. e: u8 n1 x
2 B' ?7 y3 k* N1 w6 p: T6 g
17. STM8L051F3P6串口UART数据起始位判断的问题
) y3 h* V6 ~- v- q$ d$ j- e
7 p3 T4 |2 o8 ?18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号
, h5 M1 b% _1 W0 p! K. O 1 `* C4 S1 H  m+ X
19. STM8中UART奇偶校验的使用方法% G( w& t* ?, {& ^+ f  `2 h
" J; k. J; ?6 ]; Z4 \
20. STM32以太网硬件设计——PHY
( H* U/ M& L$ `4 M" w+ R. E
! ?% q2 G% B4 a8 l4 ^21. 一个判断I2C总线通信异常原因的方法
& s& r  F5 L3 B% N
+ S# c' C+ l" q3 y0 U/ U, ^22. USB device库使用说明' L4 q2 c& }5 z$ H# c  ]9 S$ u4 ]
" O2 F9 [7 L0 X4 w7 R' X+ A" b
23. STM32F103上USB的端点资源8 r3 V& u4 n2 v& |& K) v
' `* U/ `+ ^$ A
24. 使用CubeMX生成TCPEchoServer程序
7 A; a. k$ a5 A9 Z" E2 G) `/ g! e$ G8 @
25. SPI接收数据移位
2 W" \0 v7 [" O  i
3 a$ q8 T8 U" U' n% d  o26. STM32F0中Guard Time的设置
; j2 F( e( f" c
# b  B/ g' R0 T: |& _/ J5 B27. LwIP内存配置
1 Y, P! v2 ~0 `  E/ y1 P* e' E: u5 O$ w" L
28. STM32 USB Device的简易验证方法* g9 ~' u0 r6 x

% C9 O, V" B) x1 J29. USART 中断方式接收无响应问题的一种情况及其处理方法9 R3 u8 q$ l1 r' R" m8 X

, T$ U; B3 U- J3 k' `3 ], i30. STM32 基于 Nucleo板 CAN总线的建立
) H9 r1 K3 T& g) }  O9 i- c- X2 l- \% `+ O
31. STM8 CAN总线的IdMask模式的讲解% x0 X( S, y; i6 [: O  V2 ]8 L
8 a/ ^" W. f) q7 ~: |
32. STM32F746ZG USB 驱动不正常 ) D6 p$ K" u) Y/ \( n4 O

3 i& L$ L6 f& S33. MCU在STOP状态下通过UART唤醒分析 $ R4 N" i$ v# b8 I+ n, X# W
, T) s* E9 \8 Q6 C! s
34. 通过STM32CubeMX生成HID双向通讯工程 ' G$ @0 h; Q; y6 [9 ^* i1 Q
& U$ F2 r, I( b& a
35. 串口工作在DMA模式下有时接收异常
( t& U0 |( i3 E  ~# ~# v, V8 n, ]6 H# T
36. STM32 Bootloader中 DFU使用限制
# h6 `# H3 F% F7 C0 a$ ?) @8 D% J" J+ Q
37. UART异常错误分析
. y  ~3 l& x7 Y- k, ]5 {# S" v( l9 C6 q5 Q
38. 基于Cube库无法检测CAN2的接收中断 ( s+ ^& ^9 V' `) I" L6 c9 U% n
) ]3 A: d1 e- O  F+ W
39. 基于STM32F7的网络时间同步客户端实现
0 G/ v4 \% _' t4 `$ p  `% v0 r- T1 E; `5 V$ L! G
40. HID与音频冲突问题 7 f5 ~# Q8 N, B1 g+ v
" o' L  D. [9 u* ^1 G
41. 在进行USB CDC类开发时,无法发送64整数倍的数据
" h) V7 p# X5 M) Q1 `" z% Z: u, x6 [- z" q3 W' M
42. 从零开始使用CubeMX创建以太网工程
" Z% b" f( K9 y0 K& C0 r5 ^& u  C! @, N0 w' d
43. STM32F4xxx的I2C总线挂起异常处理) Y9 \9 z) J. g5 N4 Q1 t1 x; I

2 ^2 d% {# O+ U' t44. LPUART唤醒STOP MODE下的MCU
, }' V* F* a- \, U& V4 S# i( b: C1 T# r7 H1 F; h
45. STM32系列 MCU模拟双盘符 U盘的应用
( s/ ?0 ^. I: ]" B( o' Q/ n
5 N* f/ [8 W. y0 F  i46. CEC输出的数据和数据长度始终不匹配
; f7 F7 ?8 k! N/ N" g5 `& l. e
& r/ P+ C0 c3 ^$ v47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
/ @7 m3 X& L! \; c- @5 w2 p
( g/ Q# m+ `+ }48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
" i% o7 d0 m1 G* Z+ I" h8 A% e. p$ L8 E/ L7 w
49. 增加UART接口应用时的异常分析
1 T: j1 B1 X# P+ H* M+ Z. O
- l6 T; L: I" R. d: W+ m50.UART应用异常案例分析, Y, s2 l+ s- e8 w- G) [
3 N5 J9 h  n2 P9 |+ t! `
51. I2C配置顺序引发的异常案例5 x/ x$ w& n, l  D% e; t, i. S
- G/ S( P' e7 {- t' w- {; U: u
52. STM32 USBD VBUS GPIO
6 t, \* e9 T& x, A" f
8 h, e+ {& x1 C; B53. USB传输数据时出现卡顿现象. X7 S! @4 ?$ V& g5 V4 p! d
, S# I2 ~) A5 Y0 [0 ?
54. STM32的高速USB信号质量测试实现
4 W( R& F+ O0 o5 x1 k9 ~) f* s' s, ?' x$ ~( t
55. 基于STM32 I2S的音频应用开发介绍6 [" _' U) q* a0 b: }$ o! f, u
6 k, S2 ?) C0 Y7 q* r+ B
56. HID_CDC复合设备在WIN10的识别问题  % e8 c3 X5 x2 A. \: ~' j' e
3 |6 n; P" `7 X. b
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  
5 M# B% p( v$ d5 A% r5 f. ]9 b* n1 F  _' N' i2 G- S: O
58. 一个关于LPUART输出异常的问题分享  " t6 e, p: w; D$ A

9 k. y7 H- M+ S9 E8 b59.通过 DfuSe 工具控制程序跳进 DFU 模式
* Z  L" e6 |7 w; t( v

& S4 ?, w7 y9 G1 v# B60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
5 N9 M5 r. R4 ^2 y: I3 z7 N

6 b( a5 |# {: s& a% {61.一个因初始化顺序而导致异常的话题 (2019.12.24)
+ r9 Y0 Q. d* x( @: n

, [' d1 S9 j" p9 {+ f2 A62.MC SDK 5.x 中增加位置环 (2020.5.29)
: R- F& P" T) N7 ^8 u
4 i* X  a+ z' ?* z8 n
63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
+ ]% ?7 {; h: k. H6 K, }" ?0 P6 N7 o8 g6 j2 }
64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)
. h' x  V. c' c2 z$ n; B8 ?! L- l" D! q. s3 }% L% a: r# F5 X4 x
二、电源与复位4 C6 f- e! }$ j4 H8 l

) \5 f, C/ }- _( H1. Vbat管脚上的怪现象
& O& n2 J5 \4 w6 A& @
8 H" x: x7 X; s6 x8 W" j2. 上电缓慢导致复位不良7 Z# E+ h8 S0 d

' X# F3 e. {8 e+ Y+ P. A/ D3. 关闭电源还在运行
7 p0 O% e( o& e4 S1 [* V. }; D: H4 d / s8 `4 v; B1 k) L, X
4. 使用STM32 实现锂电充电器
7 A! r+ g; \1 [8 [5 r
5 O4 E0 L9 F, I; S' A5. STM8L152 IDD电流测量: c- u, w' B0 J* g8 n7 t

* E9 B$ p4 O1 r  ]# M6. STM8连续复位问题
' y% g2 ^& ^5 k# e% A" U 7 c! F, E- ^- ]. x$ y( y
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用
3 k: n% w" W2 E9 K  \% X& }- M/ X/ \" K7 [; d, A5 |- I( }7 x* V
8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流& Z4 m/ k4 Z+ Q" L4 e/ Z* Z

7 c# i% ~- a' K9 A0 ^! t9. STM32F7与STM32F4的复位序列比较5 p# e/ W7 ?( v. U& d( i

' j. t7 X7 L" i/ V! P10. STM32F107 复位标志问题 * [$ J7 h: B- U, I3 a/ X

. y( d. G1 ?& Q/ ?11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
. j$ |3 K7 L9 h; w6 n9 r% p. E0 d) r) v. p! W
12. Nucleo_L053不上电也能运行: f7 ]4 u& M( g) i

) f* z, [) f% ^" S13. STM32L4中STOP2模式下的漏电流
$ H* b' l, s/ p: t5 l& M( ]* N- J& ~7 l9 J6 P2 X( T' V
14. 在没有外置晶振时HSE_RDY异常置位$ r2 v) k; ]# J' j; O
3 Z6 \& b, P$ ~
15. FLASH被异常改写   (2018.5更新)! r  p$ A# t7 t# R% m3 J$ q" O

- Y4 r6 e8 P4 i/ S" u, }16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)6 @: v$ E% e* G8 R- F
- E6 O6 j6 Z- ]2 g% H
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)& D4 L% O/ p$ M$ W

2 x8 K% D* Y  q7 m2 m6 r三、IAP和Bootloader
1 h( p4 o3 {; K# c4 h* q % e# f5 Q9 e% X1 g
1. Boot Loader与上位机通信不稳定
5 c, j$ A1 e8 c' x5 A ) U- e6 ]8 R& v$ i/ u9 s
2. IAP+APP 模式下不能启动 RTOS
# t# k8 ?0 ]5 Q/ m6 q ! H# P& @% a: K
3. 从 IAP Loader 向 App 跳转不可靠8 ~# Y- ^/ m+ Q8 d; f& {
) H/ x4 \& }- ?
4. STM32 MCU IAP例程跳转到APP代码简要分析! C8 ]3 l# g% l
; I, l5 F' K. f
5. STM32F091从自举程序向应用程序跳转的问题与解决$ G: w% `( F: Q3 e( L" u& b

0 Y4 ?1 z8 U, P/ O# B3 {& V. |6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
( A3 Y  F5 F& P+ Z0 R
- ~  r6 X3 B- @8 l7. STM32F0启动模式相关问题探讨
/ B3 |8 w5 i, M
% q) S) g, Z" H8.STM32F091空片使用System Bootloader下载代码
% E6 `. z* m7 V, h  b5 S9 v5 @7 f$ W/ y5 M* H# I
9.STM8L  IAP 应用程序中编程指导2 A: s! V" g4 i0 x+ Y: J% {
2 @8 G: W  l4 J
10. 如何通过STM32的串口实现简易脱机编程器
  T1 p. \& Q, _( I6 N2 p
+ k5 q% ]( z, W5 }, N' F% P$ @1 ~11. 一种从用户代码调用系统存储器中Bootloader 的方法  
  I) P; j# [! f4 ]
$ C5 g( [# a: L" d12. 利用 USB DFU实现 IAP功能5 x! R' s5 [' D5 k) Q
: f# T# t3 R- H2 V, j/ E
13. STM32 Bootloader中 DFU使用限制2 ^2 X9 |* l- d) n' h9 W

2 i6 n4 e! ~, U& p3 t1 y$ ?- F14. STM32L011x和STM32L021x启动模式注意事项: Q* a* W( z4 m6 Q

4 t+ y, e. [) L15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
3 ~0 N0 ~! [* _, Q; {
* ^4 h% P' Q/ ^  \# _5 {16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级 * W' J0 i: W$ D% U/ W. _" C
3 ]0 U4 L6 F& g  X# F$ P
17. 如何使用STM32NUCLEO 板来测试串口Bootloader
2 {/ d9 k& p  `4 G/ c
  Q; y% ~0 r# g( M# {8 h18. 在STM32L011上通过I2C接口实现IAP8 k/ @8 n1 f+ y- m

/ K" G8 k0 v5 U( w' q19. 在IAR中实现通过将程序在SRAM中调试的方法( E' s7 x/ a  \! `* b. x" e, @
. Q' O+ L& u8 i* Y. m
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
- M% ]4 V( l- b: e( ~& u+ j3 ~, p6 y
21. USB DFU IAP 例程移植的两个话题- A# I/ Z5 T2 D& i7 q

; e1 \, z# `) g* I4 _1 E% x* p22. STM32F769双bank启动
* p* J  L  A" @* z( b2 Z& W# @6 L2 X- L
23. DFU加载 工具 DfuSeCommand的使用3 {5 @0 v' r4 k4 l

0 N/ D7 C+ U2 y6 [# B  O24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码    ; N+ }; u% a0 e  U7 [

9 t% V$ y: _3 ?0 m25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)2 I( `. ^" Q' K$ s! ]' L
; V. {+ V/ Q9 X5 U0 h
26.STM32 Bootloader异常复位案例(2019.4)
6 ^4 I# [5 l) p& y) T5 D# r/ }  ]. m# A/ T! g- C
四、存储器
$ _4 x+ Q1 r6 S2 }0 Y2 i8 A3 I  i
7 L- q- y: c! a$ ?% l1. 对 Flash操作导致 USARTU接收丢数据7 G; w# d* f! L4 M, ~0 E) @

% B9 R* S1 T. K6 L2. 使用外部 SRAM 导致死机3 y/ ^3 n1 o. l: P: _+ H* K

- n; Z) M3 z7 ]7 N6 F2 I3. SRAM 中的数据丢失
' I  ~& o! M" @. }5 d3 m' Q" X 1 m) s( A7 d& g1 g, H6 o( E
4. 干扰环境下 Flash 数据丢失  ^7 ~# f# \2 n2 A! ?9 X
- T$ S  `  B' A! W3 u  j" D# s) z& o
5. 使用 CCM 导致以太网通信失败
# |# t& i0 K$ {0 [8 d) _) ~ & q& k( B7 G9 R1 d# K9 t' o- t
6. STM32F429使用外扩SDRAM运行程序的方法3 s& x/ T% W3 x9 `' W7 d) t( |
( B# }* C. f  Z0 c/ w
7. 使用STVP实现对STM32L1系列EEPROM预置数据5 o: P4 x/ W. ]; Y; \4 v1 t
6 q" K5 I3 @( S7 Y9 u
8. FreeRTOS RAM使用情况及优化方法* `! w( L: r- A! l" ?' B
3 D+ d' ?5 l) s; K: I6 x
9. 在IAR 6.5下如何将数据存放至flash中3 Z4 M6 X! y$ q8 \! \+ z2 i2 A$ _
& m9 K$ ]# S' J& }0 A! \
10. IAR下如何让程序在RAM中运行9 h) X" |* m/ n) l
7 z. s0 @; s/ j. J4 f$ V1 s) T
11. RAM上电后初始值问题
' i6 Z7 `0 N3 G1 x2 y: l/ l" C4 t. J. P$ r, D
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计: |. ]2 Q: L! @$ H* ^. O  ]
% K1 v+ U7 V! F2 l
13. LwIP内存配置
; y  ?6 K0 t. @# i0 V6 l% I+ i$ D" I  Z- n5 Q  j
14. STM32F2高低温死机问题# ^6 j( }, n: k6 U5 i

: ?% t' |4 b, I% _15. 使用STM32F427的CCM RAM时遇到的问题$ t7 f& W+ F" X4 |' A' }

. P( s: k% p6 v) v% M  R- A16. 利用QuadSPI外扩串行NOR Flash的实现  + R0 d9 B) m. g
9 {7 a, |$ z; a" j8 ~3 ^! {
17. STM32擦除内部FLASH时间过长导致IWDG复位     0 N1 T( v  F$ o+ v1 u* z
: \: Q8 e+ Y4 A5 D  {3 u

+ V* a" Q  g5 a  K18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)* g' {* s% t* |* \

+ [% U1 E, q, a8 V1 D* _; [! _五、模拟外设. @9 Y+ I. Q2 \  Y
: X  U4 e; f+ a* c( V0 D
1. ADC对小信号的转换结果为零
' B. K4 ^1 L9 g9 O3 |  q4 F6 A! w
$ P2 x* }7 U& \* m2. ADC键盘读不准
/ q! B. u. [; O/ J( p % v  ]0 _$ e2 L. ~2 C( N
3. 扫描模式下 ADC 发生通道间串扰# \6 H( E3 d: {! N! }
; W; V, [9 {& g$ m0 V. p5 k
4. DAC无法输出0V的问题分析解决: N6 G5 B& Q) f2 S8 t( s
2 c+ ?0 D& E" j: r5 G5 v
5. DAC无法输出满量程电压的分析解决
9 q  ~' N/ P: |! h7 E- n5 N
% P: H9 R4 h8 B& ?6. STM32F30x 的ADC 采样的傅立叶变换
/ E* G2 x7 ?! s% \
1 l8 |1 T& {$ ~( v9 x6 p7. STM32 F1系列 DAC的示例详解
8 `; B6 z2 U3 ^* r' T5 v
8 K+ {8 W( X  M/ H0 Z8. ADC 连续模式采样浮空引脚问题
0 ~% \4 g) z9 g: j+ s" `8 Q) G0 R( F& {, S6 {, \( n
9. PWM硬件间隔触发ADC & x" a2 x2 B) J2 ?  l
8 S  R+ k" y5 K; P; X# {0 E
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC
  L9 O1 g4 v& p& v+ F. Z' k+ }# E% r* }2 X
11. STM32L4 系列中ADC 通道配置上的区别; B; @7 ]3 ^6 F# ~3 G
" U' `" l2 Q6 B  X' V2 _: C
12. STM32 ADC模拟看门狗及其应用! ?1 Z9 x0 {! m2 k0 V. E, n

! K/ n; K0 h# ~' D6 x13. STM32L053 comp2 比较电压无效问题
" c0 D% w* P) v! ]8 A) H
" |, u! p# B3 _1 D, ?14. 运算放大器OPAMP在STM32L4上的应用  }# E1 F4 p- f8 {$ |

4 P) K1 I2 a& k4 j# Q0 Q15. STM32 OTA例程之ESP8266使用 7 ^0 i! k- C+ i* U* i) C0 I/ [( t

# h" ~8 Z% P0 ?. c16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)# r/ i$ t: W1 t& J1 E6 m

( }; P* y8 x  Z3 d. h六、计数外设
1 \+ d: h; g  t5 I- P: j
0 i: ~; g& z$ G6 m, P, h& B4 W6 \1. Watch Dog 失效
7 v6 ?) a- J+ m/ |, l9 ]
$ V& ~/ H- y" c9 F5 |0 l+ f9 k) `2. RTC计秒不均匀
; x3 P9 a* w; [3 f7 P( M7 F1 R ; k( [# i* r2 p  z( v; s
3. 软件启动模式导致 IWatchDog 失效- M; k& ^8 p: |2 H

" h' }6 [  J1 t4 u7 t' p9 g4. STM32F030R8 定时器移植问题7 m* ~) H% h2 Y- t( \+ D2 v

# e) n* m) S. ?8 C1 F* Z' Q5. STM32F0使用RTC Tamper的几个注意事项
4 j7 h* D9 V- F3 Z5 j# P% N. R) A+ Z, j
6. STM32L053可控PWM脉冲方法之DMA% ~5 d, o9 O$ M$ l; Q$ J

& k+ U7 U% g7 R  }. {9 r# W- D  O7. CounterMode,OCMode与OCPolarity关系
; }7 }( E& P0 j" @* ^6 z0 J# e2 n6 E8 C+ V" X6 i
8. STM32L053可控PWM脉冲方法之DMA' j" O, v! `# C2 b: b3 g; R, W$ j- j! ~
% b! u: }$ Y7 l5 V
9. STM32F1通用定时器示例详解—TimeBase% Q: ]) h  H' w: X7 n; K' Q! x

' {, V6 u  u! O: L- ?- y) O# z10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals
6 y3 @6 |6 k6 a5 v) X# ?, q% S) h5 k8 a
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
. U2 H3 D4 }  F) e5 |, H% W1 `, _1 q5 o' ^; P, ~# Y5 ^" L% x5 Q
12. HRTIMER的多种Fault事件联动机制
1 U# A2 _  K9 K! M# W3 p & A7 W% C& v( F6 Q, C
13. STM32通用定时器 示例详解 —One Pulse# ?" e7 O% B  ]9 n5 v& B' |

- t9 }7 U% h, o1 S14. 如何用LSE校准STM32F4内部RC振荡器
5 p! o5 Z' i, P6 d9 Q
/ c4 k+ [$ a& A, h- e( E3 m15. 一种使用Timer测试HSI实际值的方法4 a' p2 [7 p; I" E5 y+ j( M
6 Q9 @  @1 Z3 m' b5 {+ b0 D7 j
16. FreeRTOS定时器精度研究% F2 R( l. W. V  `# g
& Y( p" ]9 Y: f& f5 ]
17. HRTIMER产生多相相移信号
& I3 d7 y$ `9 D! w0 ?- r! Y( e  D% x8 w5 J
18. 窗口看门狗启动时异常复位问题
  r% g4 g) u, D* x  ?. d1 u6 o9 H
19. PWM硬件间隔触发ADC$ ?; c0 D5 u6 A% q7 ~( \7 n" \

& N- }+ M2 t$ m( P- o: D3 N20. STM32F030低温下RTC不工作" d8 y4 N( }: u' K% ~1 z

( N; A& J1 |: N* j21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   # i% q- m) h; b  G, V& k

# J. R" o: w5 N7 [5 _2 {# G3 s: T22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)5 r+ F$ ~  t/ V
9 s1 ]3 N+ q! p. J. g
23. 基于STM32定时器实现定制波形的示例 (2019·7·25) * r$ e& I' W$ E# B' p5 y! |
- B- |$ A- a& \9 e
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
$ n( `5 }7 L$ F
( N, c' o$ G2 L2 M- c3 y
25.MC SDK 5.x 中增加位置环 (2020.3.31)* {; i  v% ]7 I

& ]9 {( o/ ^" Q26.STM32高精度定时器PWM输出话题 (2020.4.29)
- _' q- O0 B) b1 F% r
4 c3 X; p% }5 V/ B" @
: a& E  p  o& u/ }
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)
( B: X4 ]9 F; \* M

% |$ r- {, W2 O2 L7 a+ }七、内核( G* m/ Y  X3 {& `5 }0 u1 ]3 G' C
1 ^8 p" R, ]# y
1. 使用指针函数产生Hard Faul7 R9 j& O3 F" F( X

' |% C! U! F+ I( c$ e9 x! d2. 调试器不能通过JTAG连接器件
; L9 C1 P' }4 ]) v / E/ }* Z; e8 }( W, Z4 |
3. 鬼魅一样的Hard Fault
. q+ K/ M: R3 ^2 f
! [% @% i1 Z4 b- a( ]% N0 L4. 进入了已屏蔽的中断[) c# C5 L0 y  {' p/ {

5 V; o0 d) A5 @: k& }5. 浮点 DSP 运算效率不高8 o: @9 X2 G2 s0 s( z4 g9 |2 \' J
2 z# T: j/ R  ~* y9 d3 a
6. STM32上RTOS的中断管理
3 Q% v; H' ~! J5 y/ f$ q! C. Y
7. STM32F7与STM32F4的复位序列比较4 P% A/ K1 H* @5 q8 K

1 `, X0 c2 x4 F# @% s$ b8 K8 @$ }8. STM32F30x 的ADC 采样的傅立叶变换$ \/ Q( _/ s9 d% O; C" m

  N, ?4 K( L5 A: D) X9. EXTI重复配置两次导致误触发中断的问题
1 l( j1 s. A$ W4 i1 E& Z4 U: }- U6 K
10. STM32F3xx/STM32F4xx使用浮点开方指令7 o  x3 U9 s; Q/ P
: A; H; f* k# b$ Y2 H( J2 v5 l' F2 \
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响; Y" a+ O/ o+ z: T2 `8 @
! `1 d: ?) @4 y8 ?7 ?7 V* N
12. STM32F7 MPU Cache浅析  , i2 Y& d) u, n' c+ I
6 g- t" J; I; |. U
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
4 }3 ]& r/ p4 c" T

+ p) \5 Z0 g6 U14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)0 e$ g  r0 y% d0 e  M* h8 e6 l

, i* j0 E$ T# i$ ?) x4 {0 t* X5 W. A; D+ Z1 w$ o9 ~* [
八、系统外设
; E; ]& \4 I* F
3 b7 t+ H& V4 K1. PCB 漏电引起 LSE 停振
. j4 j% g# i6 Q+ w
9 E& w5 E4 E! }2 z& o* {+ W2. 时钟失效后CPU还会正常运行
0 ~6 P9 b9 M& ~8 w 4 w" p3 b) {2 S
3. STM32F2中DMA的FIFO模式- x( \1 _9 X  O8 v+ p

; D' m+ d) u: `0 Z8 R) L6 ]4. STM32L053的GPIO翻转速度的测试
+ d1 [+ o8 a& g, S( x; j$ t) i. k$ ?; i
5. STM32F4xx PCROP应用" D" a  X2 f# a2 I9 F. G

* _, Y2 v/ q6 `& l6. STM32L053的GPIO翻转速度的测试8 h! r$ _% s3 n9 _/ A* F( _
9 N& ?! y/ h0 s3 Z8 _
7. 如何在IAR中配置CRC参数
% d/ j- z8 \% u# s" P; ^- Q0 x
, }6 T/ n* c. [) g8. PCROP区域函数无法被调用的问题与解决
" Q+ ]- y1 i8 N* w8 I/ V; j
0 m8 Y" o, x  V7 g6 ~3 r9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
" w& N: f; ~/ J9 z$ D4 o2 ]. i( s/ C: D2 u- V0 l
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计/ @" \. T/ ]6 c5 ^. X- Z
: `9 t6 w: j- m
11. 如何用LSE校准STM32F4内部RC振荡器: c. k7 v. w; y' t- v
# h; I' J, ]/ k
12. EXTI重复配置两次导致误触发中断的问题  
* e$ G  F  z/ Q, F- t" y: K- n
' X& i" X  b% B/ K  @8 p13. 时钟安全系统的应用(LES篇)  
3 J, k5 Q5 j& H0 M: P! @
# v& L4 j. @% u. Q+ A- ]3 _
14. 利用DFSDM开发PDM麦克风应用介绍  - _5 n1 t4 c4 H+ t

6 C; a9 X; ]5 H' l) Y$ d5 J15. STM32H7的FMC外设在DCACHE使能时运行不正常 6 P7 e6 S- n: O# A" |3 M2 `7 W
! N0 {) \, i; M, n
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)1 K" K9 n* r4 `) m. h2 ^( P

  w. t6 w3 L6 y! o& d3 i% a( W
9 ]! V! `+ q9 g9 V  n6 Z4 y九、标签和收发器
) f/ H4 m2 ?4 ~7 A
+ D: k% L- w7 C) G* E: R5 Y1. CR95HF的初始化步骤. r, E, s" A; O3 U1 q

# d" E, \: G0 i. Y  ]! G" j; D& X7 k3 c& @8 R6 O" ]  \8 [1 P* @

# [' C( t, a8 _  Z  I十、生态系统
" c& m; P* r  y7 e: n+ D9 V " r7 T" E/ Z4 O
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题
  B3 ?6 F' v: J7 z, d( b, r/ o
+ H  U7 z" o, W3 N, N2. MDK Logic Analyzer 功能在STM32中的实现问题
( Q: `% k1 ~% H8 i9 B# Q2 F# b + S. @$ V; _2 a% r( Z$ X# @0 i
3. 在IAR6.5下如何将数据存放至flast中- w2 r$ |8 d+ H0 c5 `( J

# o+ M9 F& x4 Z( u; Z) r0 p1 D4. FatSL移植笔记
" g. Y* q! T+ y+ v! v* f8 z ; {2 E# D  z. h1 U2 ?
5. Keil中使用STM32F4xx硬件浮点单元
* G; R; R" W" i( x* G3 i- ^. B ; |" J4 `1 l& X+ v
6. 如何生成库文件(MDK和IAR)
+ I9 O+ c" P0 Z% |6 |6 Y ) R1 H) U/ h3 [& N& W% Z6 e1 f/ n3 Y
7. Nand Flash文件系统解决方案
/ G( r2 M- t% w/ S9 T
0 U, I" w# g5 b$ V* M/ ]8. STVD在调试时弹出“Cannot access configuration database”的解决- E# a: u: x/ ^2 |/ K6 ~0 j3 E- C

. C/ b6 E, y/ S* z- y; w+ F9. RTOS低功耗特性的设计原理和实现
6 q% j- v  Q: J/ c0 F
8 m6 ~$ J$ U$ n+ m6 K! |, e; G10. IAR下使用J-Trace进行指令跟踪$ H4 b2 {9 Q. d. h6 n
) W! l3 \  u8 X, f9 z/ M0 b+ _
11. STM32上RTOS的中断管理
4 C  `4 v( }- o! o. l8 C' R: s
12. IAR下如何让程序在RAM中运行2 k( Y$ Y- r5 I& v- y5 F

( V+ a9 m/ D4 H13. 如何在IAR中配置CRC参数
; Q9 }# g  |% N* s3 k/ J4 T9 m0 W$ I) z
/ q3 d* a8 u' T+ L14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册. t5 e1 K+ @# ~  l
) l& V* D& D. e8 k; e' d
15. 使用mbed进行STM32开发及STM32F0的时钟问题: P& g* t" B+ D* m- H
7 w- n+ b+ \# M# @( f2 W/ n3 q
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能# V, [4 P/ J# q/ @& ?$ W9 G5 ?& ~! }

( P3 |/ y' Y9 @. ^% f7 Z, a7 o17. 多任务系统中的不可重函数使用注意事项
4 v4 z1 m+ l/ m- F3 ^& q
5 @( k# T  u8 z! o) Z/ i  u18. STM32 utility的hot plug功能9 e* n; W' d4 H  N
$ W4 w5 ^+ V" u+ o. a! a: f
19. 如何将CoreMark程序移植到STM32上
* g" ^* K' E3 q4 R
+ W! t3 N* U8 g! [- V20. FreeRTOS定时器精度研究3 d" w4 Y3 ~  z$ u% i3 W, y. h
. V3 ~! ]0 {" T5 r! r
21. 如何使用Eclipse和GCC搭建STM32环境" `) z2 Q  S! R4 j7 q+ ^

2 h: d% m) h% g0 |7 o8 e1 \* O22. 如何建立一个基于GIT的STM32库
' w* R+ j7 C4 ~" P+ B+ m& f
# f, S8 O3 J, h23. 从零开始使用CubeMX创建以太网工程
& s% m9 z& ~9 ^2 k
2 [2 x! H  F6 U7 S. b, C24.从STM32Cube库向标准外设库移植FatFs文件系统
5 C$ }! k. \- |5 w& {
/ _" z! x' z# o( Y$ D$ W6 E25. 基于 STemWin的屏幕旋转/ Q. [' D% t! \! w' T) k* }

  E' J# M' }3 o26. 编译软件 Hex文件烧写
$ ?+ o/ V. E/ s5 y1 |1 [+ m7 G3 K
4 n% a  T) Q0 o/ X27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
* k2 _; _) t2 P& a9 A/ s1 A& `$ T& j5 @
28. USB CDC类入门培训  k4 P7 m; f6 c- e0 {5 B
) o" }4 m+ Q9 V3 l& o
29. USB DFU培训
8 r2 z5 p) [/ {) o  |; I+ p4 C: R
30. 用于量产烧录的拼接Bin文件操作: _$ {  Y& W) C! A& e
! m9 T( _8 h3 s
31. STM32免费开发环境该用谁
! P! J0 M" m. l% a) F* C. {$ Z+ A$ {
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
; g6 m3 c1 ^) M8 P
" G- Y! t  k8 `* S33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新). S1 q% ^; i% W

  ?% }( h1 R2 ?9 L6 N: |" P34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
8 B) b; b* P& y. }
9 U- i3 }: H5 i. F: U35. STM32 FOTA 例程之 cJSON使用   
9 j  u7 c) K3 m; D9 r3 [  m1 w5 b; w+ y% t
36. STM32F769DK 云端固件升级例程使用说明
1 ?- V' C8 H/ C- H$ R
& N6 t% m4 q! W/ z
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
* E# V' m9 Y) X. ~: j
$ F0 \7 P, V4 \& F9 r38. 基于 STM32 的阿里云物联网平台方案
9 B, V; v7 G8 G) _$ ^5 `  a0 {: U' U0 @. ~6 w, f
39.AliOS 任务上下文切换原理分析  # W5 \2 q6 j4 E9 Y5 ~% `, `

8 T. i' F. D9 p& X+ Z40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  
# g5 V% Z- {! l+ C2 W0 N+ [+ G% k9 r& D# \, L
41. STM32F769DK 云端固件升级例程软件开发文档  
0 X) v7 h  \* F4 S
+ p% |4 E9 w: x: z  E* v# r
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
0 }7 K# e/ R- V1 a/ B7 \. a* X  X8 r, k! \+ B
43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
. q0 O, `, X. w' v( P0 i& B0 Q8 N3 x+ P& x+ w& S
44.零基础快速入手STM32MP1 (2019.9.19)2 j9 d  z' K' ]) A

- `% H. g- \8 }1 R) r45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
1 E  V& o; V- \
" A( }# q5 A# o7 g& M十一、调试; e0 f9 v' |' _  z+ y- d

% n0 @& o( v6 M7 {5 M9 F# X2 K1. 关于STM8S SWIM Error[30006]的分析" D; @3 K0 B" X, ^  S& }
2 k* b5 k' c0 Z" d, |) I+ t7 r9 j
2. STVD在调试时弹出“Cannot access configuration database”的解决) S% ~6 c0 i* D0 H& @
. n2 e; M, o& D' b
3. IAR下使用J-Trace进行指令跟踪, E2 a$ Z& Y! F5 h; k" f
+ d0 T. P+ E1 |4 h" M* b
4. 菊花链 JTAG STM320 E, p$ x+ q* G* J+ ~

+ d' z1 }) r. c  S9 Y; a9 U6 e5. STM32F411CEUx 能下载程序但不能执行
* {* G% ~) I) t7 \9 p* ^. |- w% V5 F' @! Y3 a/ E. r
6. STM32F103C8T6 程序上电跑飞$ A& h* o2 V6 a
) W8 r  k; \) r/ f2 e% X
7. 使用STM32 ST-LINK Utility 设置读保护后不能运行' }- L% l+ a0 h2 b& k
/ C. J; |- s3 ^3 f. x; H2 R
8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
4 w4 X# p3 E4 p* A& {7 I& @7 p! x7 {, S+ |
9. SWIM协议的GPIO口模拟7 Y* N4 |, l, c( M

, G6 n* d$ _+ r7 }, W10. STM32F091空片使用ST-LINK烧写后复位不能运行用
# h7 W! k7 u& E, G8 O& `" C8 h. z3 _- d
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)' P3 J' n, a7 T: M% Z

% I$ f) A. @& l12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)
' p, [/ X0 w; X! D
5 r6 c+ S5 G4 x' i13. X_Cube_ClassB代码移植 (2019.12.24)
! M2 Z0 I7 y7 h! z& V3 Q% P; T2 t" ]' J9 i3 [8 U5 w; |

# o0 T' `2 ~. Q5 e14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)3 Q7 A) [2 k- f! E
  f, S- u' Y$ m$ d; H. Y6 |4 r5 s5 d
十二、人机调试& g& U6 h0 I5 q! L# Y) Y! K7 J

, g7 a& K/ [+ w# r0 Y9 ^" j* ^1. 一步步使用STemWin在STM32上开发一个简单的应用5 r5 S  q4 {. D: J1 w* `( j+ v

1 d/ ~; E6 J' l  y2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计/ Z7 O* x' H$ M. R
( I& D. x2 H( i
3. GUI方案中ALPHA通道处理介绍
8 W# }) n5 |2 C- \& F+ ?( Z
  |$ u( Q4 G2 g5 J. r0 Q+ ]4. 基于FMC8080接口8位LCD的STemWin的移植& E8 H7 }# i4 o

) g( L, @6 y% R. r7 e/ x. |. ~5. TouchGFX中Callback模板实现原理 (2019·9·12更新), F" x; V+ {. c  n; L

& W3 h2 R+ L/ U, g3 V8 q3 H' k  L6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)& t6 O0 D1 X. ]" l+ Q  g( v; ?

4 v( `9 C+ @& j% H7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)$ O) R: |  R: ^9 @! y  x* a
9 k: t- S: \1 c" V
8、STM32L5中如何关闭trustzone (2020.5.12)2 \1 i% [' L  M# x
9 \1 ]# m9 |* O; I- C' u1 i
十三、马达9 ]9 G0 ^+ r0 O& [$ n+ u8 p( e
4 T$ h& q. x7 Q% u: y
1. 电机控制同步电角度测试说明1 B( b% o4 [; E4 x0 q
# z# R; Q% W4 c/ H
2 X0 N1 x) u! `7 V  Q
& D  H1 d- Y! ]6 @0 R8 m) Z
十四、安全
, Q/ i: I6 H2 O2 b; \0 x6 E
9 q- ~1 o& E; s! _6 z
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
3 h: R* v7 }& n8 s4 l: A4 Z' D& \# I( R# A7 _! l

5 _5 n$ c3 H  y8 q9 Y十五、其他6 c) A  n/ F% L# I. G

2 c! I: P: _8 p: ^+ q1. 跳不出的 while 循环
4 b, m+ i, n! I9 M& p/ W, y6 I * W! y6 \8 S8 O
2. 外部IC连接NRST导致MCU内部复位信号失效的问题
! z. I* T* y1 I! ? 2 O% G5 k8 d' D  f& M7 r
3. 潮湿环境下不工作
) }9 I" U# H3 O( w% M: F
5 z- I) [+ W* T/ B( u" u4 Q4. PCB 漏电引起 LSE 停振
7 v0 d, x2 S! c7 j' m7 u1 ~& L 2 c0 S6 j$ t# A  _1 A; F: M4 A& |
5. STM8L152 IDD电流测量* A: z* b' `  C) j# Z' j
+ H; o/ f5 v( O7 B9 w1 O
6. 使用STM32实现锂电池充电器+ y- [2 f( p% s# f- Z
3 t4 [  V3 R5 d) V) ]. D, F5 ~! x
7. STM32_STM8硬件平台基本检查; t2 [! W* t1 h: \, j
7 Z& A) \" x9 W2 Y1 ?) s
8. 验证STM32F401在STOP模式下的电流
$ T7 x! k9 k( K$ R9 M1 K
/ V, P3 b1 n# P. h  Y0 |* c  n9. P-NUCLEO-IHM001 电机开发板串口调试指南; P2 j" X, [9 p1 s

  \+ `) u& G  M- Y) k# H; R10. 一种计算CPU使用率的方法及其实现原理) {3 {% \* Q7 R( m) @' `& t9 a
$ B% c- D4 A) h  K; ?+ e4 ^5 [
11. STM32 RTC不更新原因分析
% \- p5 r! a  E2 J
! ^+ ?7 l# k$ [7 j5 I12. 关于ST库函数的代码性能对比
# r) i- B! z: B, Z9 [5 ], B* p6 k3 h: Q0 I" G1 m  Y$ y8 T  f
13. 在IAR中实现通过将程序在SRAM中调试的方法
1 \: H! O& `/ H$ D
5 \- q" g# X8 W8 ?9 Z0 q. @3 j* n14. M95xxx EEPROM写保护配置$ i2 ]2 }$ C  m" b" W* ~! C
) u: J' g3 c; g& M9 J
15. 4SRxx的GPO的属性4 _! P2 S* [4 c7 o

/ S" b1 d/ r( d$ B& W16. CR95HF的初始化步骤
/ X. K, v  _! f  W
; U: l$ c% b; H  b+ G& [2 R17. 电机控制同步电角度测试说明  
3 J- k  X/ w  D. k
0 B' V9 q6 A3 K) U  G9 D18. STM32+BLE通过 Notification与 Android应用程序通信的例程$ g+ c9 s, _6 S" x. f
! Z# P5 T* Q7 V0 Z4 u' N
19. M95xxx EEPROM介绍: k) d, ~( D2 I- k4 B; `
+ x1 Q' H: h/ Y, o
20. STM32 DFSDM测量温度应用
1 A, x5 j. [& j* r4 Z0 i! C0 G* k* }: X. C+ }
21.代码实现PCROP清除3 k! N+ Z! ?- k9 P1 O
' o( u& \7 @8 x) s; W6 V
22. 理解与应用MPU的特权与用户模式: c0 N3 F; u2 [# t

+ K; M2 _" |/ M2 i; P; W0 M. o$ ~23. 用于电机控制单电阻采样PWM变形信号产生
( k8 V& n& s9 \3 ~7 L9 n" T9 K+ l1 `# z" F" O* g
24. STM32L低功耗模式唤醒时间测量$ j" f2 Z: m& _$ e8 @8 Q
' ~! v$ R! M* i5 L8 a3 a
25. X_CUBE_SPN7程序电机启动抖动问题
8 ]" Z- X4 }) C/ T7 H1 h" w  T8 L5 b8 q9 f* x: F' o3 z
26. 发现STM32防火墙的安全配置! X+ e" E5 l6 s) A  q$ H$ T6 u+ T1 `2 j/ }

& r' ^) q3 S% v4 R  X5 I: R0 k4 U9 H# c27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改8 W  n1 P  w6 }8 |4 T4 ?8 X  L) P0 `
$ l( i* S: K/ P+ T$ m
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
, E' c9 Z+ P' |2 @  x3 C7 O. ~  R' s6 I4 S* e
温馨提示:
! _* K7 g; u* N/ f% P% f* Y
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
/ ?! |; d! V: {# a! `, Z, _

+ |& ~9 X' \% D! [5 ?. x4 Y* z2 K8 `" b) {0 d, V8 w
' f: `7 D5 E" p5 S* e0 I, R" ^
( k8 u# A: S' F1 K. K# r2 W

7 X+ t; V3 H# j7 g" ^. D" w3 h, I  }4 ^3 q

! W# ^0 J% b+ o
1 a7 U1 _4 t$ D3 P+ r0 q% B8 a; C1 d' }1 X! S

4 o1 J& n5 v& D6 e/ V2 A

评分

参与人数 6 ST金币 +6 收起 理由
t525 + 1 很给力!
dsctsam + 1 很给力! 赞一个!
北极熊 + 1 赞一个!
wangziwei111 + 1
tian0yan + 1 很给力!
电子星辰 + 1 很给力!

查看全部评分

赞 11 收藏 157 评论278 发布时间:2014-1-23 14:58

举报

278个回答
michaeldeng 回答时间:2016-7-26 19:35:55
非常好的帖子,THANKS!
Paderboy 回答时间:2015-5-18 07:01:19
好详细,多谢分享
4 D+ L4 H( R7 b9 k. Y; Z
5768340 回答时间:2018-1-13 14:42:54
HI  
3 n2 V0 p/ B" Y" B1 t   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
; f8 j8 P/ I* {  y  S5 l. c9 U. L; a   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    # z: r4 N' T9 \, b
  2. 函数名称:Cdfinger_Bspspi_init( M" k/ O; S& u( f# k3 d3 f4 l& o8 Z
  3. 函数作用:spi初始化函数
    & \. |) F) d" d4 W5 N: o" \* k; _: T
  4. 备注:
    ! {8 {7 J$ l& o4 r: C! j
  5. ******************************************/
    " {, |; v4 [* M8 z- L- U7 g
  6. void Cdfinger_Bspspi_init(void)
      z+ K2 n7 p$ q* a
  7. {
    " S3 ^2 ^5 r' d. Q; J' F5 [
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    ) Y& i+ F8 i* T0 q
  9.         SPI_InitTypeDef  SPI_InitStructure;
    4 H9 i& n& o6 m4 ]* E
  10.         DMA_InitTypeDef  DMA_InitStructure;+ o* N- V( ^; e
  11.         NVIC_InitTypeDef NVIC_InitStructure;+ ?* S' R9 u  d" D1 j1 w* P2 T) D
  12.   
    " }- ?1 g" ?2 k- g  d6 t  t- U
  13.         int ii =0;, V. h; u8 F# K. W+ W# K
  14.        
    + ^9 F, x9 h& i; m( ~% T
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);, D6 R7 }: i, @6 l3 O8 X6 P! a* O
  16.         /*!< Enable SPI2 clocks */6 Q2 H1 l( Y; r* e3 F
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
    9 J1 j* }+ x" x! ~4 o; w1 d' ?: a
  18.         /*!< Enable GPIO clocks */3 P8 w2 N$ ]: ~; a2 ?
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);- q' e* ~) V1 x+ l' u( R
  20.         /*!< Connect SPI pins to AF5 */
    - d2 q  K, I; e) s' Z& q, a
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);3 @- ?5 i& L5 w$ [+ s2 |
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);1 _) [% ^9 d- v# |2 x- q/ y
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);9 \/ f+ I6 q; x5 s2 ^

  24. 2 x1 G4 v# K% q9 s/ g
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;% v6 S( B. M( X. u+ ]& x
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 X. S8 F: ~+ @3 g
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;! k7 @1 A3 b0 T0 b) Q4 z
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;  c% u$ E3 U' M: t# c2 u5 q
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    ; c& k. C6 A5 j9 h
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);* b( p' A  K* y9 @5 t7 D+ f0 u
  31. 9 D) ?8 E  k+ K4 R9 Z2 t
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;' n# j2 t+ e+ D9 t! D& k& G
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;* L% n3 T+ A& Q
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;# k% w: v! B( e: T
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;, y$ l" y* Z/ H4 _( I
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;8 d! K% l! v* [
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);, q: _; @& R. S* J1 \9 Z
  38.         Cdfinger_BspCs_HIGH();. |0 j6 {3 h4 H
  39.         //Cdfinger_Bspdelay_ms(1);
    % A, W9 k& c+ ?7 W; {, v, [. ^
  40.   //Cdfinger_BspCs_LOW();
    ! d0 U# |! w( T4 K
  41.         SPI_Cmd(SPI2,DISABLE);* d" T2 s7 I7 O& q% R; a6 e9 {
  42.         SPI_DeInit(SPI2);
      L/ V9 |' b7 h9 u! X# z
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    $ l6 }- }, q  x' }
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    & t8 d9 l' M* t$ }& m
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    ! E# @' `2 L8 j- ^. p
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    8 q' ~0 J& A6 g2 Z: r9 ^
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;& f3 M/ Z  U9 c1 J1 i7 l
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;, H! z' \% c; T! D  J# y( x# o2 v
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    & x& v$ h9 R9 a) v' [. h  V
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;3 m, c2 m& E* e" B: D% }9 ^
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;! {6 A7 \% L( z2 }( g0 C% W
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    4 f, I2 F9 }; `$ G8 E; u3 W/ T

  53. . M) P) c; {5 W4 D$ a
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);& B) n& d  l* F% I7 R3 b
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/4 |, h) Y( e9 L
  56.         DMA_DeInit(DMA1_Stream4);7 j6 ?6 ]. t- @# i; @
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;) i2 x2 g9 p+ N" g0 b7 t
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    : G6 l4 `7 [4 V& _9 ~  K
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];
    ' k9 d. a0 l: {: C
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    ( ~0 e+ a  ]$ L" @# S
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    5 \  U* a" m2 O$ o/ }
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;5 J& ]4 |9 O' c2 i8 G
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;2 X* T, O2 v# O% D9 ?
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;3 H2 y. M0 {. ^/ g" l+ @/ s' L1 P
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    6 w# S  E8 X& i- I
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;' W& c. _9 Q% T: g1 ~8 c
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;) K8 h2 u7 I# T+ |
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    " }& X, n, P3 q7 i" {; ~& G6 R
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    ! D2 [# O, H9 x; D6 y( O1 e2 J
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;8 j* h, z1 ?! |
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    6 V" r# r( k  E1 v& e- D2 `
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    , h% h: C$ m! G9 h# H
  73.   
    3 k. V; U. m# X- E& e9 ]* Y
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    3 C& E; c' G" g; q
  75.         DMA_DeInit(DMA1_Stream3);3 r0 R# i1 L7 D: Q" v7 h8 w
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    7 `0 C, P( F) M. q7 J- `; f" g
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);. w  I( b5 R7 C
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];. C. ~0 E* x( ~. D/ h0 M
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    / c# i( E6 j# |0 a+ m
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;3 P. P+ R2 s+ z7 z& V9 D6 }
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    0 e9 w2 n" B( A1 |) x) v% S
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;+ k9 l: C$ u+ D' c  i0 }' ?: V
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    9 {" Z3 T6 A) C0 |7 _$ g2 n! a4 G
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    , h3 \8 A: Q' Z. R7 `
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;
    + M( d* x4 u! J# l# s4 Q
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    : P2 M  e1 z( h! w) Z' ^
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    ! G' H% o2 L& F' F0 o: m% o6 z
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    * |0 `! h2 ^% c9 a0 J
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    6 ]) o) z( P" S& l, \: j7 O, H
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;8 d7 g9 [# I3 z
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);( j+ V0 b; W' k$ f' `
  92.         //Cdfinger_BspCs_HIGH();
    + R* B+ D/ q5 s( _7 j
  93.        
    " m+ k# Q8 ^. P/ T

  94. , _# b* P, S" q5 d4 f

  95. , \8 C% ^. e$ X
  96.         //发送中断& L1 f5 ~' l% O2 l; L+ r3 E. `
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);8 L& K' a6 c8 {6 ^1 x+ z( s5 L
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     4 r! H& L6 q  U; z
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;2 U/ ~; D, H# o1 m. T8 Z$ Y/ T
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    8 y1 Q6 }) H2 X
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    - k$ B: L2 u' k, ]8 V
  102.         NVIC_Init(&NVIC_InitStructure);3 a3 S6 T8 R' [+ }! ^. S6 V+ Q+ d
  103.         # q6 H: |( q+ n  L+ F. h
  104.         //接收中断
    & T7 d' k% a& B
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);; d6 r0 u2 |$ b( Y1 x9 \! b+ |
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     : d  r2 x, {' n
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    ! y. v2 T* T! f2 ?9 u: f
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    7 d# _, L/ x8 V. G' V
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    , `4 M5 }6 t. X' W, h( g* Z; ~- Q
  110.         NVIC_Init(&NVIC_InitStructure);7 `- ~8 Y: ]# t- R: G
  111.         SPI_TIModeCmd(SPI2,ENABLE);/ @" i- m/ g6 }' z3 q% S, B; L) j
  112.         SPI_Cmd(SPI2, ENABLE);
    - N3 e# g, F6 Q9 l6 {0 k+ z
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    . Z; v, i, U/ o6 k
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    ( i2 f' w- b: g* W" |  t
  115. 6 s/ K& U$ r- y* B- I+ m: V% T
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    1 ?% O4 G/ p1 `( U$ H
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    - y. V( K5 b+ z
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);% w: ~4 P# W. f1 M9 h" e) e$ R
  119. : B- f! v/ V+ t) O9 Q# n6 H0 V
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)  y# }5 P3 y9 s  l, {1 }3 ~' Q- ?; V
  121.         {
    0 {  ?* F9 ^" z" @  ?, @: a
  122.           if(ii%8==0)
    1 \1 u$ l- u9 K- r
  123.                 {
    ; l5 C" I  Z- ?4 _' h; ]" A+ Z
  124.                                 printf("\r\n");# Y) G% G% U# N
  125.                 }
    ! |% }0 O/ L4 Z4 g; I: j* p  Z
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);3 \7 B) k8 s0 ^, I# o2 w: R& k
  127.         }
    $ @0 h3 I7 a: R, m: g  F
  128.         printf("111\r\n");  ?* ?% E: K4 Y/ [2 ]- S
  129. }
    - g0 E+ N4 }( E( q/ {
  130. , l' d" t" x& k. b. f
  131. ! w- u( E+ Y7 \
  132. void DMA1_Stream4_IRQHandler(void): x0 \3 D4 F/ d
  133. {/ i+ w9 M* \- s8 A: }
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    , Q  l0 y$ y& O5 T- Y5 U: ]
  135.   {3 W/ o9 l  t/ w' T& K6 V9 E
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
    & p8 P* e8 p4 Z; o3 [( o
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    ) G# P; p2 s4 [- ?! h0 c# ?! Z
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);; m! i/ x# [( A* l9 T+ H
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    , M& x' d/ n  l+ v2 O! j1 ~
  140.   }
    ( ?; [) d: r, |3 l, F  @/ g" K" ]
  141. }5 [$ A0 O4 g' G5 V  v
  142. ! |: a% J5 {; j% C* k( M( u: E
  143. void DMA1_Stream3_IRQHandler(void)( y3 l$ q7 v/ k1 o5 d+ A# b* g
  144. {, P1 [7 ]8 C" n$ y0 W3 q
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
    , j& {" {4 Z6 q) q$ ]
  146.   {
    7 j1 Y5 P2 ]- Z. c6 P+ O0 [
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    / b$ l2 K/ E0 U7 C# }$ X' A) }
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);+ [& Y) z8 Z4 I' x2 a- b, V  k
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    / |6 `6 h1 y8 I4 z% d2 ]
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);' Q# R2 f3 h# r0 ]5 z
  151.   }# t$ r! m$ s2 ^
  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的波特率是不是必须为相同的,才能正确通信' J3 Y: P- Y3 S. ^. D3 x
以下是全部代码:' u/ j$ N( N; ^! }
#include&quot;stm32F4xx.h&quot;, K: ~: h$ b3 q  R- A
void RCC_Configuration(void);
/ `9 v; |5 t$ z; O' A) R2 `) jvoid GPIO_Configuration(void);
2 s  N" A/ i3 x# x" K3 H0 I& f5 Uvoid SPI_Configuration(void);) M6 P6 V5 S2 z0 {7 I% {3 `
void Delay(int nCount);4 P# J- R8 \( v4 Y0 s
int main(void)4 Z: J( |3 k7 c: W& L
{  RCC_Configuration();
! l" [( l. `, _5 D/ T  GPIO_Configuration();. F3 k. l4 R& {
  SPI_Configuration();
' u' w( \% H( r+ Y$ N: j( I$ ?. S while(1)
2 R3 y- t" @4 r3 t* v+ T' }; ~# V { int data=0;/ X. a) {% Z: S. Q7 G. S$ K
  SPI_SendData(SPI1,0x55);
2 h  y" t7 O; I: O" o  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);   G: L# x$ u. k
  data=SPI_ReceiveData(SPI2);: b* k, G& |4 B# d& S
  if(data==0x55)- F$ }: T5 g9 E" N' c9 o3 F
     {  while(1)( j1 d. r9 {, _* C0 S
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);8 C/ C7 Q$ w5 p, }) E
                Delay(0xfffff);
3 U: x3 c7 b1 `1 Y                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
4 ]3 \9 O! F) D; S) m- u' O                Delay(0xfffff);/ N4 v& B/ h  @2 f' J5 N
   3 K& o4 @- s. A2 X8 |6 E
             };" ^! e) C# q2 u. ]. y; a
     }
6 _9 g; k+ I# \; y( w     else while(1)" h8 d1 T, e/ O7 @
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
3 M9 ]+ [( Z- }( j# l               //Delay(0xfffff);) `5 \; x; U% O/ i) E5 J+ A
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);# K* p' D1 n/ }, f+ V
               //Delay(0xfffff);
) k9 j* Y2 X( \) V1 y* z   $ L6 ~3 e& @3 S) n$ E4 ~$ K7 c& [) J
            };
: L# {! @9 z) V4 ]7 C2 ] }
$ {) [+ i% i+ ]7 v! Y}/ V% E! O7 D+ S9 H# L
void RCC_Configuration()
$ j& V- X% A% w2 Z: _{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
) K# y6 H- E! @( m$ w, O6 _7 E  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
! y: E- I4 a- F( K# h2 D  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   8 n$ ]: F; _: p5 z% v
}
& x8 S  N7 z: K% Rvoid GPIO_Configuration()
; y- U% s: e0 ^+ w( p( `0 a( I{  GPIO_InitTypeDef GPIO_InitStructure;# X' Q9 o( f# z7 H
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;" Q7 a5 P' R2 m9 c- c
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;1 S! y" e/ C+ G$ {
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;; p0 W' Z- s1 o, r2 P( h4 l7 v
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;/ K, a: o6 s' Y7 d& U+ K
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
% q. y: P3 u; S# u" }% J/ V8 |  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
, l1 ^% E5 v0 Q+ o" J  g  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
4 r. p) `. @# W9 K- B/ }  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;2 O& t+ E- _) A, h/ L* j
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
% E2 v2 \* d5 \' [$ |  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;: ?- m0 j  ~0 ?+ Y
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;, h: A, X+ p  A# |& {- L
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);/ `8 q- d/ |  |  B
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
6 ?4 [" T' u; M( R! E3 i! R  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);9 `8 C  g7 v9 l; ?! u3 k3 s0 J: P( E
}7 S) U) G: Z1 a, l% I8 E5 ^: L/ O
void SPI_Configuration()" \: C0 }; J- Y9 t& X
{  SPI_InitTypeDef SPI_InitStructure;
9 Z, c% {9 v5 ^/ s  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
% A7 ^% u, u* {, B! K* i  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);4 A: u% _' `. N5 I5 y6 U
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);9 n+ R3 E% ?# I. ]* I1 ?0 g8 y
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
2 E' w. G# \) O3 U& E; `  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);6 E8 b* J. W0 d; g3 ~6 k
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
9 Z% ?/ v% X, I6 z# a0 p- W* Y  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;5 _" A' W, k- \! Z0 e
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;2 C* y7 p# p8 j4 h2 }  x- f
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;6 ^8 h* o; e% k
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;  v' y; O: h' ^& c/ A
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
/ x& E; t  z$ Q4 N+ D* r  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;( t. e4 S0 }1 ?* @! g% I% I
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
7 o' S# r! x1 D" R   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;0 [$ `- T5 v) R
  SPI_Init(SPI1, &amp;SPI_InitStructure);
6 y4 x$ P" J- s- \! [  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;( E- X, n& L; K( m" o# b
   SPI_Init(SPI2, &amp;SPI_InitStructure);
3 D' ]: t( L' K! m  U" ?1 S   SPI_Cmd(SPI1,ENABLE);0 V. P7 `' |& a, q; N- J
   SPI_Cmd(SPI2,ENABLE); 
+ J* B; [+ ~+ E4 R8 e3 |}0 v1 R! `! w# g3 w  D- Z
void Delay(int nCount)
9 y" u7 }8 o5 b2 P3 a{ int c1=nCount;
7 G& }4 a! d! ~ int c2=nCount;' F& {' x! {. g) I- J  l
 for(;c1&gt;0;c1--)" F! T+ z6 N3 A; j* v
  {
3 e# D9 ]8 Z' U7 n. C$ |" r; |: \& o  for(;c2&gt;0;c2--);
$ o; H* p% t. ^, P# L6 L" W, v( c };
- y; A# _" Z: j: @9 L5 z}
) L1 h- D( G9 R先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:
3 o% [/ M$ w$ f) n' P# l2 z楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
7 @" _. _# i' h8 ~2 z" g8 x4 m" Y以下是全部代码:
8 ?% J  N1 B& \$ O" p# m#include&quot;stm32F4xx.h&quot;
3 H4 k+ n6 Y. B8 b$ Zvoid RCC_Configuration(void);/ s5 x0 q2 ]: D. |+ y* n4 A
void GPIO_Configuration(void);6 `2 S% f) x9 I
void SPI_Configuration(void);
' @8 \+ r: C6 S' H" N# N: p, T3 ^$ u/ `void Delay(int nCount);2 X6 {3 ^1 I, `# V
int main(void)4 ?& K' p9 w0 Y8 ]: Z7 H/ L7 _6 t7 x
{  RCC_Configuration();; a4 @. B) i1 B$ M8 z6 f3 C
  GPIO_Configuration();
$ u8 F; H. G6 n) T* c4 @  SPI_Configuration();
; K# p* u( J0 u; k" a  u; {! C& Q while(1)
6 F; Y. ^9 d5 U9 S& s8 ?+ U { int data=0;* [9 f; K6 H7 G1 ~% h
  SPI_SendData(SPI1,0x55);
4 j7 @, A1 Q: d2 \+ y6 \7 k. ?  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
6 m; `+ v4 \7 D: `* T  data=SPI_ReceiveData(SPI2);  x. i$ m& C( g8 ?3 n
  if(data==0x55)
4 W) Y# c& z/ T' G5 Y. K4 c+ }0 p     {  while(1)3 N% ]2 Q* y) W1 a& T' `
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);/ F( T" b6 P2 a
                Delay(0xfffff);
5 J: x! K4 h) M9 U$ `" L                GPIO_ResetBits(GPIOA,GPIO_Pin_4);: l. _9 P- O- T- _5 m4 O
                Delay(0xfffff);$ |( V8 W8 p( U/ z9 k2 p
  
9 ~% N, h9 K( i* Y             };7 e/ Y/ |$ v% F9 N6 p! D
     }
% U0 S9 ~% d# v     else while(1)
- w6 Q- B" @0 o1 O8 ^0 u            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);5 J2 a; O, w# z
               //Delay(0xfffff);7 M  T% q6 P, O, O
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);% s- p, t- D. i& k
               //Delay(0xfffff);
% r4 ~: T' Q! e. o  
3 z+ e$ D7 W  k: ^: |7 h  L            };$ s5 ^# g8 o* R$ R
 }- v6 e( J) ]/ p% I. J, R" A  z8 x5 z0 G
}
; ~; x% U* L) Zvoid RCC_Configuration()
& e0 V8 j- n) O( j5 i( `# ?, _2 k{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
4 B. K: y5 [7 I- k4 ~) y" j) v; O% |$ P  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);% I% q8 ~, f% W3 e4 U* N( u
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   1 Y7 [! F9 K6 q
}
$ r& q0 K: A; Q1 t' }* [void GPIO_Configuration()
# S4 P: O" v. y6 ?7 n8 e/ {: _  ~+ {* i{  GPIO_InitTypeDef GPIO_InitStructure;
7 U6 l! a  N& j& h0 ]6 a  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;9 Z& c5 W1 ]1 {7 W- u. [# t! W$ v
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
# b, s- D* ~* z  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
) _& t) _+ [* s7 Q( K7 O+ _* o, q  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
/ M+ |5 f) X  {! M( M  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
* Z9 t+ k& F+ q/ U; T" [  t  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);: ~2 l2 _# {1 |
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;" }8 d# F/ c+ B+ h5 @$ V" y+ f
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
# ]( I7 z" G* V" s2 ]  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;4 V& S  K% P9 [; T, v
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;6 |- N# h+ o- |- ~5 W
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
; a2 ~% m% j" b5 S+ q$ J; W  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
0 L9 {8 [5 I+ `! i2 J+ [# _  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
1 S: ~, X5 \2 J/ B  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
) x% @& _, F: L3 O1 H4 j8 K7 g}
. e9 I2 g6 d3 g9 z6 Mvoid SPI_Configuration()
, }: V3 e6 o1 s. C  @& K{  SPI_InitTypeDef SPI_InitStructure;! u  `" k8 W5 }0 v5 F: n  ~( G+ _
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);3 e3 J' p+ E0 }! y) X* K
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);; A# N- N2 o# g+ m3 |
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
" C, m! j& c  B8 C$ B   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);" I3 ^' v5 H8 D1 i4 K( q0 V0 |3 c5 T
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
, J$ E* Y8 b! A& }: [  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);; ]. H/ c1 K5 X, u
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;' q! _8 ?7 M  E' S0 I  \
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
( v; p, @3 g; j6 d& W4 u$ s  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
3 y% ~1 i3 u  Q5 ^0 t& d" l! T  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
1 m6 j' I# _4 Y- U+ p3 B8 t  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;4 X* F4 k* R% _4 r2 P* _$ t: F3 X
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;3 P+ P  n* O8 R
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;2 I" ?2 m, e& ~3 S, V  Z7 \
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
) @8 ]+ d- l& p5 D3 M  SPI_Init(SPI1, &amp;SPI_InitStructure);
+ P' B; S2 _3 k& `" b  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
4 O$ a) o) X9 O. C/ e   SPI_Init(SPI2, &amp;SPI_InitStructure);
( U$ e; R9 ]1 y, h   SPI_Cmd(SPI1,ENABLE);7 a& @# _/ W- c; q- c- `% p
   SPI_Cmd(SPI2,ENABLE); 
% e$ q: p9 p- B! Y5 E}
5 n' y7 V; d8 Y" vvoid Delay(int nCount)9 F2 k5 ]* s1 S, a$ a8 n3 K
{ int c1=nCount;+ v6 d) C: S5 Z) R  F
 int c2=nCount;( l' v, A. P. s! S
 for(;c1&gt;0;c1--)2 x- {/ J$ o) R3 ^/ W: _2 L, f
  {; E5 N8 Z& e( G8 f  d. `# ?
  for(;c2&gt;0;c2--);, z' x' `$ c/ x4 u
 };# _5 l4 h* p% H6 p. ^: ]
}( x# l: K' \  O" ~4 _7 @& `2 ^* {/ A
先谢谢了~~
# \0 x) j* Y) q% d: `* Q  @1 d( ~* H+ J - D" U- q6 @0 K+ Z) c, n: D

8 o0 i6 C8 c9 a" y楼上的问题,看我帖子给出的提示哦~
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发表:
3 t" m9 |6 J: u5 [% `. U/ y 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。" Y. m" M7 G7 F) k1 i  O
 2 ]# P$ E3 k: \

8 ^/ S- u& h8 d6 l9 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 运算效率不高

    D& g9 P* u& o& _0 l
鬼魅一样的Hard Fault  v. G6 B9 y# k4 G( ~! o6 y7 R
 
, K, u: F) Q: R% `- Y该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
1 x6 }% C: X! g4 c2 a. J 
, C- x! g" F9 A2 M  U' ~/ w1 `咋解决?
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版