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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
: O* J/ a' u1 [% A- e/ E) R/ E1 O1 o! ]& H4 |) u; [8 ^4 m$ H

$ n' s1 S' s. N) A1 b: r- w社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。, [0 G; r, c6 t9 F

# p0 |: @" F+ m+ a. J( Z1 N7 M提示:点击各主题,进入帖子,可下载ST工程师解答详请
# M! z( A4 W* h! c. f
1 ~  _) @/ L9 e. W# _
/ o4 E  m, Q. y. L' _一、通信接口$ F$ ^7 S. V% \6 Q6 ]

. V; u4 S) ^$ Z$ f" o1. STM32F2x7_Ethernet(FreeRTOS)驱动更新
! h' o9 f3 n1 I/ U- J & {9 T6 L# L: \) Q% C
2. SPI 接口发片选信号导致死机
, r# U/ z0 k0 N! p7 y2 i; _ 2 V0 X* _4 t9 B. B5 y- |! ]- J
3. USART1不能设定600BPS的波特率+ @$ @3 L( h" x7 u1 ~& F5 E7 \

0 x( Q( G3 P# P4. I2C 接口进入 Busy 状态不能退出; W: m" Q0 o. o

9 e" l8 t0 E2 v0 ^. E4 O5. 对 Flash操作导致 USARTU接收丢数据
7 Y+ c' ]% N  \3 p
$ F. w! l  ]# ?" l6 s# |6. USB接口易损坏
6 R# ]3 B+ \: P) K
5 S/ ~+ w" Y3 T( U7. UART发送数据丢失最后一个字节, Y" R9 \" l# M( i/ E) Y

% F1 X" q  ]$ z7 W8. 使用 CCM 导致以太网通信失败
( ~% a8 s/ y4 U. e. L " @* N+ Q& w7 [2 k; w/ k1 X3 n% ^0 U
9. SPI3 接口没有信号送出* p; C' r6 ?( k
9 X% d* Z- `/ G' ~/ g* l/ @
10. 时钟延展导致 I2C 通信不可靠3 D1 g, S- b0 c: l

4 O: _0 Y* m. G1 j/ M. X1 k: i11. M0的USART波特率自动识别问题; J* E" x; J5 }* h, t2 F# M

. u4 T' [6 g+ e0 P" D12. WK15 OTG做U盘主机兼容性提高9 T$ w7 Y: v5 C& {- U" i/ N8 e! m

( z6 m5 s9 k% h3 f4 W# D3 g0 {13. 以太网电路设计注意事项! y* r: O3 V1 G) r' d

$ P6 ]! ~& [) @+ P: o0 L$ a14. OUG主机库在BULK传输上对NAK的处理, n" N5 A* l% G1 Y% y

5 Q9 R: u& S! v4 O. N( v15. 串口断帧检测7 u' w/ r6 I& X' \' j

8 U0 X& _' L3 t, H9 i$ @16. VCP例程用于数据传输时丢失数据的处理' g" q' l" R2 A. V2 g% B7 n

: `1 `9 k) q* B# ]/ V0 P$ @17. STM8L051F3P6串口UART数据起始位判断的问题2 x4 d+ p- w  o% C8 P/ m. V
% E& ]) h; Y5 W( z2 h: B5 M& ?3 `
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号& ^2 e' r5 s0 q

$ Z. h* G4 s( m7 g5 i' P19. STM8中UART奇偶校验的使用方法
% _( Y8 f1 e# U1 I, W ' k9 x; V' \2 B
20. STM32以太网硬件设计——PHY+ q" f$ @+ Q: x" |- p; D8 z1 A

8 A6 h, o$ v4 F21. 一个判断I2C总线通信异常原因的方法
% F; x* l' T; M% M8 F+ D/ e+ O  N5 \- d
22. USB device库使用说明
- X# U7 Q% k8 e, Y5 X" I5 F  p2 s+ N$ B  q: ~
23. STM32F103上USB的端点资源3 i! o4 B! {6 N: H/ m/ v2 O

: v% b( I  U/ Z# s) U* t( Y) S24. 使用CubeMX生成TCPEchoServer程序
, X- n6 X+ [" m8 U  v1 e/ p7 G8 G3 @7 x" `' v
25. SPI接收数据移位& k  o8 o/ f, W/ @3 K9 ~

  T3 K5 `( b% |26. STM32F0中Guard Time的设置* K+ k/ n# B8 o' b

* T. c8 G4 U8 k27. LwIP内存配置
/ w+ K: N( `+ R2 q* a: P3 w8 X' b6 f* B
28. STM32 USB Device的简易验证方法" d8 @3 w1 V+ g/ ]* D/ }; d

9 Z1 D5 e2 G1 h0 ]. @' c29. USART 中断方式接收无响应问题的一种情况及其处理方法
' y! n- l& ^4 t8 f& O; G" {9 W' r% l1 Y/ f* ^( @  e0 Y
30. STM32 基于 Nucleo板 CAN总线的建立
, U( }4 U7 C2 `( d" K, j! O2 q0 R3 u) R
31. STM8 CAN总线的IdMask模式的讲解
, P; u" M, O0 V; W+ X6 c
0 N6 @0 n7 {8 M/ Z- ~# {32. STM32F746ZG USB 驱动不正常
  v1 o# R$ n1 g/ y& E1 V' y. D( g% e1 E" A- M: h( N3 A  s; H/ m9 y
33. MCU在STOP状态下通过UART唤醒分析 # I1 D9 [& `6 W! w

) |* Z0 q& ~/ u, H34. 通过STM32CubeMX生成HID双向通讯工程
& e# s- {( z6 }
% {! l: Z- O! p) M35. 串口工作在DMA模式下有时接收异常
) P* s4 M, j! U2 T1 ]: H5 [
8 g& |! x/ ~  r- t2 m36. STM32 Bootloader中 DFU使用限制5 k% B6 Q+ i7 Y
( d" ^2 I6 g, i& }( Q2 u6 a. A+ E
37. UART异常错误分析
" Z8 A: `* M8 M* |' D
+ h, k0 Q5 [* k38. 基于Cube库无法检测CAN2的接收中断 . c+ b3 X0 K6 f, X8 ~

4 |( m- R; n. I7 L* Z0 V39. 基于STM32F7的网络时间同步客户端实现 4 H9 U- I1 K1 R' E  ?1 U
: Q$ ~! Y+ s9 ~' w% {( a
40. HID与音频冲突问题
9 K6 M3 K* J* j! X! N& E% h+ S3 {( l& \& |0 P3 d1 E$ s
41. 在进行USB CDC类开发时,无法发送64整数倍的数据7 m! y( ]8 ^3 Y2 i
4 H% b% T4 @. v( k1 m
42. 从零开始使用CubeMX创建以太网工程6 J2 ~9 b/ |4 f

# v3 r* d1 f( b9 [$ r1 W43. STM32F4xxx的I2C总线挂起异常处理
: k8 M0 l, h- d" S9 }' N: J5 P
$ ~1 `$ ~6 o* r5 _  T44. LPUART唤醒STOP MODE下的MCU
, _: P5 E$ l, \9 {* c% z+ e
; Y5 S% z" Q3 x! S" I45. STM32系列 MCU模拟双盘符 U盘的应用
. J  S7 R- p3 l' P& a; j( n4 m; A0 k$ V% C2 M
46. CEC输出的数据和数据长度始终不匹配! h" g& ?( ]- H; ]
3 N3 @$ J8 c( r& [
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
* s' v3 _# e( v
# M, A6 @5 T* h( K48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续). q! r% q' J& W
! l1 I) C! k  }% U( m& b. v" K3 p
49. 增加UART接口应用时的异常分析
1 s7 T- o/ C4 t
6 {, N2 d6 O' I1 Q  R* ?4 t50.UART应用异常案例分析
; E0 t! d. Q  C! f% D4 Y2 p3 i
/ X! c" ?6 Q; u$ `5 o  J  n) }51. I2C配置顺序引发的异常案例4 H3 d$ i$ d% ?( \$ ^

8 c3 m8 f* G% j52. STM32 USBD VBUS GPIO
2 }3 X: n( I! Q* w" A. c" f/ c3 w$ L% F& X% N5 D
53. USB传输数据时出现卡顿现象0 m* k0 }; N: T" q

' Y+ K9 E4 X$ }$ S54. STM32的高速USB信号质量测试实现
( ]+ }  `% H4 ?$ a1 p: v
0 p5 K" r  P! n* }1 w. @! t55. 基于STM32 I2S的音频应用开发介绍
1 Y  h1 W" }3 ]2 f8 A! A
7 ~$ @6 h) v2 }( O8 o* q4 E$ B* G56. HID_CDC复合设备在WIN10的识别问题  & a1 P) H3 G) G# {" L
- n( E1 Q. |2 ^! f0 T
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  ( ~0 l) ^2 b: b( j3 u5 X

( s3 w* z: j' [4 y1 `58. 一个关于LPUART输出异常的问题分享  * W7 Y- N& s6 ^# y8 }/ ^

) I# R$ O' j. M5 f6 [2 F- o59.通过 DfuSe 工具控制程序跳进 DFU 模式
: k* |# m+ z* o3 p2 R. T

! w! H5 L* W' b6 [; B: l1 [# c( s9 s# u60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
) I) Z& J8 Y8 I2 @" |' K( I

$ H0 q6 g9 @2 {$ E3 ^61.一个因初始化顺序而导致异常的话题 (2019.12.24)
. K* c7 J% o5 H
5 c1 I3 x- P& W( N! N4 K5 J
62.MC SDK 5.x 中增加位置环 (2020.5.29)
2 ~0 h; s) r. g! j; N6 x" E
' B! b5 [( x3 ~* C7 `  h
63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)* ^8 Z' M, Z8 [6 q

, N1 S; p8 J4 `' U3 O64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)* D, X5 y' ~4 l' p
& p5 ?( P; K4 ~7 q
二、电源与复位, ]* ~, d/ f! V6 R6 b& ~" A
0 z% J& n  ^) l2 J4 o& b
1. Vbat管脚上的怪现象2 C* A$ \7 q6 W7 j4 K2 b
/ Z  {; w- g; n
2. 上电缓慢导致复位不良- ~" X/ y; c1 }

9 z: Y' U4 U" K$ E3 ^$ g3. 关闭电源还在运行& }) p0 x$ @% d# G" L8 r0 B4 V

. W- W  m! i2 _8 B4. 使用STM32 实现锂电充电器! G- T# M: ]7 K7 r! ]9 O

$ J* ~( ^% [$ h9 h5. STM8L152 IDD电流测量7 n6 j  |8 I+ v% n/ V: d  g
( c& |/ s' e7 v2 F$ c1 I
6. STM8连续复位问题- N- K9 Z, w4 n' p* w" G

0 @/ L1 j7 A! B8 [7. STM32F2电压调节器REGOFF与IRROFF引脚的使用9 t# \, C" Z, R( {0 s3 b
' K' G; t0 Z1 ^4 A2 O8 T
8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流; z  Z2 J( N) B. t

1 Y3 h, C0 n' l) s3 `9. STM32F7与STM32F4的复位序列比较
" q% W$ Z/ l4 v0 o1 B( l
. ?. W  O! ?. Q1 t: c2 C, i' u8 c10. STM32F107 复位标志问题 ' _" P# C1 p& K0 |! F

4 Q& G7 J5 r7 n11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
) o# I7 N; Q( M) ?3 t6 d4 ]1 E& G' u0 S! R6 I4 z
12. Nucleo_L053不上电也能运行
" F3 A/ G/ d0 i- p4 F7 @) u  g) H0 Q" S
13. STM32L4中STOP2模式下的漏电流6 L2 ~' X5 s( _. \6 F. _8 D" z

0 ?  E' ?, j& }! \14. 在没有外置晶振时HSE_RDY异常置位% ^% Q4 D* N( F. \" ?( s+ Q- B' P

& J0 d8 Y6 D- c! f$ Y  k15. FLASH被异常改写   (2018.5更新)
" u* p: P) X1 u3 m  V' x
# g& x) X& q$ D: L: U16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)0 S4 B& ~) {: [/ t' ~

" Z" W) w3 z1 q* y17.一个 STM32 芯片异常复位之案例分析(2020·2.27)1 l" v. O# G# Q5 d% a
1 f. u4 k" W3 E. J7 C
三、IAP和Bootloader
: ?9 x, l# I* G8 s$ I% \6 g9 i$ n
+ V' o( A# w* I9 |1. Boot Loader与上位机通信不稳定* |# H4 I' \3 `# k% B8 Z2 Z
/ q9 K7 E8 i+ B7 B$ p/ u) t
2. IAP+APP 模式下不能启动 RTOS0 ^- }& m1 q- _( S
( ^9 X1 E7 G7 H: D
3. 从 IAP Loader 向 App 跳转不可靠
: r* @5 h1 Z9 z 9 J0 |* ~4 [! I( r) G, I: m4 I9 }
4. STM32 MCU IAP例程跳转到APP代码简要分析
9 O3 m0 g9 Q- c# j; Z
5 Y) w( E: c. A* ^6 j+ {, d8 C5. STM32F091从自举程序向应用程序跳转的问题与解决6 x$ z2 r( p8 |9 O
" P% H" v7 K+ c
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码+ z3 f: C  @4 e

! x& x9 h4 Q) @6 {  ^! M. G7. STM32F0启动模式相关问题探讨
0 h9 b  H; B! B5 i& Y2 ~" R1 l( g( @* U: c: A  d
8.STM32F091空片使用System Bootloader下载代码
. e3 j( C" H6 Y/ h1 m
1 X7 Q' o, C" s5 Q6 F: _1 ], e4 u. ^( z8 I9.STM8L  IAP 应用程序中编程指导
0 @- q$ _. K, n- E
+ I5 N, i3 a& H8 w10. 如何通过STM32的串口实现简易脱机编程器7 J5 c' g6 l5 [8 I/ g5 q. y7 a
" c, J* S/ k0 ]( p) G0 v' ^
11. 一种从用户代码调用系统存储器中Bootloader 的方法  & }5 n0 L1 |; ]$ a/ G+ a
; q6 W/ N! M+ ]& ]' d5 k" G& J3 g
12. 利用 USB DFU实现 IAP功能
& x( t* G2 k' `7 J. [; L0 _0 K' i; w& S/ {' b
13. STM32 Bootloader中 DFU使用限制
  ]# ^& b1 p: P2 J4 U/ e- w( _/ e; B  i
14. STM32L011x和STM32L021x启动模式注意事项$ H2 a! `$ _+ a- P3 D. N

. o7 R0 M6 p0 Z. n15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项 4 \! }4 l( H, u4 N8 t7 f
; }( a5 C" h" h/ q
16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
& s% _! V4 X6 E5 l4 `1 P2 v- v3 {1 B: _# B# |4 }& P* _' {9 w
17. 如何使用STM32NUCLEO 板来测试串口Bootloader
. N0 P% a" T- l. @8 `1 P
: D8 r5 Y1 e5 m5 P+ m4 u3 ~18. 在STM32L011上通过I2C接口实现IAP0 e4 E( c4 Q' n& j2 b

+ ?/ T( h, z3 E) _! a19. 在IAR中实现通过将程序在SRAM中调试的方法
7 s. C/ R( V/ m- I: y: ?' P) n
+ G% ]( n& B" f. k20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
& k$ A. C6 }' g7 i/ L5 M4 ^' c; N- L2 v# w# _8 O
21. USB DFU IAP 例程移植的两个话题
% F2 T5 A1 ^3 [2 Z( ]9 F( ?$ L% r/ N3 G- R& h! i6 R7 @
22. STM32F769双bank启动
: S) `" U3 \2 m+ z$ |: r0 L& ?9 S2 _3 ?
23. DFU加载 工具 DfuSeCommand的使用
9 e% T" y: X* B. [* I+ e1 |2 {6 x0 u
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
& X* e: h9 X! j7 \: J% G5 a& k# a: W& r
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)& `& [  O. x: e8 N0 L$ R5 Y

1 h& A$ F$ \$ }7 n! m& r26.STM32 Bootloader异常复位案例(2019.4)
2 h: g/ x8 @  ~
+ {6 d3 z+ n: E. R# E
四、存储器/ f9 b" d  a& H9 u

$ R  w8 z1 _+ q8 ~9 v8 q" }' `" T1. 对 Flash操作导致 USARTU接收丢数据6 F9 r0 [. M+ o

5 N) g- A$ U) G+ r4 v, x' T& }2. 使用外部 SRAM 导致死机9 U& c6 i- c6 D; O

% w  L7 y% {, x8 |3. SRAM 中的数据丢失
6 y$ d, n( y, U# D6 J ' \' t7 s  `, H6 u; J# h5 A, F6 w4 h: F1 ^
4. 干扰环境下 Flash 数据丢失
3 ~( ?; `$ M3 T6 N' l% e4 ~
. e5 a2 W; Z4 X$ J5. 使用 CCM 导致以太网通信失败8 @0 K- k3 G9 S  c5 r( N& f1 u

6 w- \: I( q' a# t6. STM32F429使用外扩SDRAM运行程序的方法
, |* d) ^: E" V+ g/ `6 B6 o4 [# x
2 I- r6 q& g4 A; V6 G. x7. 使用STVP实现对STM32L1系列EEPROM预置数据* p# N$ e+ |  ]1 Q  D3 |, m& q* d/ X. k3 a

2 W) T1 ?, P8 F/ ^; |; E5 Y0 U8. FreeRTOS RAM使用情况及优化方法9 c; q0 [0 D$ c& `; S" m6 a
# s! K2 P& t2 Y% n5 T
9. 在IAR 6.5下如何将数据存放至flash中# J' z: b: e+ }5 ^. E

+ q3 A& y$ k$ z, q10. IAR下如何让程序在RAM中运行
6 \) \  m: v, O
& R. P2 {' k: ~: a11. RAM上电后初始值问题
/ Q. P, Z( |& ?9 Q" T( x2 `) |
- S# u' f& b8 @12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计0 _! `- @  J" |, u
  k, d+ G  C+ u: \% z
13. LwIP内存配置% l5 }! b  q/ L, U
4 v" r3 W  G, x9 z7 ~3 B
14. STM32F2高低温死机问题
, w# _( X" X3 G' w! G, p0 g5 }! L  Z% R* x' c8 i; y
15. 使用STM32F427的CCM RAM时遇到的问题$ L3 X9 `+ B& h9 U; U5 @

" {* N) X: u; x& D# |6 O9 }16. 利用QuadSPI外扩串行NOR Flash的实现  0 q! R+ A1 u1 d# V! v4 k, H6 X( c
: b. e( D9 }  z  `$ ^
17. STM32擦除内部FLASH时间过长导致IWDG复位     % c, o4 G8 b4 j# D" l% u
% d) d) V$ k1 c3 n
7 V  H5 L& e5 F3 o' b
18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
/ W7 }8 _+ |9 k4 h+ j. b! i$ W5 ?
五、模拟外设
5 a4 w* z9 g' x1 V1 b
6 {$ X1 O8 Y) e( E* F$ k. P- l" Z1. ADC对小信号的转换结果为零
* F# f8 u: z" y 3 l7 |0 R4 R  ?7 p% x6 w
2. ADC键盘读不准
( P- l2 t9 w7 S- p9 | * H; q: B+ E* R; ]' S
3. 扫描模式下 ADC 发生通道间串扰
5 B7 _1 w$ O: h0 y1 j% Q$ ^1 H9 K 8 G2 a6 d# F! ^0 u! b8 G7 n
4. DAC无法输出0V的问题分析解决
) _4 ]% e  b8 v2 O& q
& M5 R# R& e4 |9 x+ _5. DAC无法输出满量程电压的分析解决$ h- O( A6 h- d% G0 x; H1 @
% x* s$ G1 p5 Y$ r- |6 N
6. STM32F30x 的ADC 采样的傅立叶变换+ z* K4 a, i5 _5 ]& a2 N- N; ^

6 I, R. S7 r0 J7. STM32 F1系列 DAC的示例详解
5 a7 X& o8 ]- E* _! l2 {- o) _5 q+ C& c8 f
8. ADC 连续模式采样浮空引脚问题3 Y0 F5 S1 t. E

. e( X# W/ i  ?# K( |/ M9. PWM硬件间隔触发ADC ! u, B* s+ g# o( `
" @! P0 D' E8 P$ d8 k/ m
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC6 ^& D% \! z" w9 ?: P+ `

) ^1 f& u0 J$ g" P) B7 o11. STM32L4 系列中ADC 通道配置上的区别
! S' s! l' S7 V9 b4 a; m% m  ^" ^( B2 S
12. STM32 ADC模拟看门狗及其应用
: [7 S+ \' [2 |& x
5 H* y9 r# U  y; L" A; n13. STM32L053 comp2 比较电压无效问题 . A. D7 k' g6 O5 i8 O, _
6 f4 Q* q. @% W1 o, t8 S! b
14. 运算放大器OPAMP在STM32L4上的应用
; x* @$ Q# I. q* q( h0 X5 u
0 r. @3 |" o: i  B: d. ]15. STM32 OTA例程之ESP8266使用 3 \1 t6 \4 j& t  x3 m

! B) k8 d1 A6 c& W# b16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
; F  H  t4 c: q, _  D; v5 h, A& ^9 h2 Y& G* C$ M6 O: S% T  ~
六、计数外设
1 \5 D$ h1 w- a 1 z! T/ l2 K/ r# ?
1. Watch Dog 失效
  n2 S: D6 e8 u0 f( E' J  Q - {* R: P+ ]6 V" f  w8 x  W4 a
2. RTC计秒不均匀
- q. G( [( b0 a  r! C 7 M* p2 J' y% d4 P+ G6 b6 g
3. 软件启动模式导致 IWatchDog 失效$ \8 @/ k  g  p' B+ _; P
4 D* }, A% z, J% j" Q1 j3 T. q: K
4. STM32F030R8 定时器移植问题
+ G. _9 ?3 G) T
/ v. W" ?2 M8 f$ z# s9 Y5. STM32F0使用RTC Tamper的几个注意事项& p0 i. L, Y5 \# [4 c( p* Z
# p& i# b7 l& z8 d0 d) K4 z
6. STM32L053可控PWM脉冲方法之DMA
* {9 q* e& E  k" Q9 E
0 A: n" i$ k4 z( n! h7. CounterMode,OCMode与OCPolarity关系1 @9 G, h6 V( }, o0 T0 t
- m, E/ O# M- D( t- Q% e
8. STM32L053可控PWM脉冲方法之DMA1 k3 ]: j$ R0 y+ C% V6 g

8 u" |8 A" x. X  f0 j: G$ [9. STM32F1通用定时器示例详解—TimeBase
! N4 D7 V) o* _0 w$ o4 t3 I7 a; x
0 |5 k  K+ a) R: B; }- i- @10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals3 J8 {# _  o& ?6 ~- j

* _# T9 X4 u$ n7 B& g11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生  a- m! R2 l3 A  D/ I# y

2 [1 i; d6 H3 i0 Q4 k& j- @) y12. HRTIMER的多种Fault事件联动机制
, _' t. q" R: O; F( d! S$ R, z3 I/ z 5 o% p% `5 Y' v
13. STM32通用定时器 示例详解 —One Pulse% A1 Q) [# d; w

6 l" R* n$ h2 t$ l/ K14. 如何用LSE校准STM32F4内部RC振荡器
/ G1 t& [0 D4 i1 J& v# |% Y$ _2 q# B" d* r$ v
15. 一种使用Timer测试HSI实际值的方法
  ?: A* M7 A! s
+ @: S& i/ M  B16. FreeRTOS定时器精度研究
7 S* U3 H& z0 k0 }6 w
7 l; o7 }( f0 T9 I' S17. HRTIMER产生多相相移信号) ]" K- `0 j* l9 f

% p" H/ |* y. V18. 窗口看门狗启动时异常复位问题  Y" ]% s4 f& J+ R& G
) J+ q4 V( a3 `3 p  u
19. PWM硬件间隔触发ADC+ O# p4 N& _& M+ \6 V: J0 m. y" E

4 m# T- \* V9 g# i$ i) S4 [* v20. STM32F030低温下RTC不工作
1 R+ V5 G7 Y  T4 X! ]0 W
; y( u: z7 H, a& F$ _21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   
! E: Z6 `7 p/ v% ~6 k% ~5 Q
. w% Z7 T2 ^# }6 E: G6 |) P" Q22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
$ B$ X# b# c# Z; o
. o( d  z! e0 s6 s23. 基于STM32定时器实现定制波形的示例 (2019·7·25)
4 l9 {7 ~) f6 @# `- V
: E- C9 e, y  a* i6 h5 z7 M  R24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24), |( o4 j) z+ G4 [) V- {
( K/ z2 L/ T. G! ]- {
25.MC SDK 5.x 中增加位置环 (2020.3.31)# g& @* g& o* m; i. t) f) g5 u
! p# K& N4 o7 Y% E8 ~
26.STM32高精度定时器PWM输出话题 (2020.4.29)
. e% H' \4 Q4 \7 h. g: R+ p. n8 G8 P' A& I; W1 `" Q( ~2 o
6 F! t6 w3 v+ H$ I" `
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)
% T8 \& E. j7 C1 J  t* U
/ T) f$ i0 `- L8 e3 \5 a
七、内核! a2 m  e$ r: o7 S7 F4 s/ j/ N2 o  p
( {; n( [0 Q  k# B; c9 }
1. 使用指针函数产生Hard Faul' i& Z1 e4 u* `  }

3 \; `+ [- @1 E8 I8 c  ~2. 调试器不能通过JTAG连接器件2 K( ?6 \: R' L$ W

, {7 K7 M# a( O/ k8 f, {/ Z3. 鬼魅一样的Hard Fault; Z. d# ]0 O9 Y  e' [
" _/ o# |5 e" \8 l6 D
4. 进入了已屏蔽的中断[
6 h$ n/ _! i: ]& v1 a
; e1 B6 O' Y! g2 P1 M5. 浮点 DSP 运算效率不高
' K/ E" R' |1 e2 P. q' G
. s% F+ e# m7 q; n# C6 q1 q, S6. STM32上RTOS的中断管理
1 z, i6 S# T) X7 K0 t: W* o* }" f# E2 m" X4 {& z& v+ M5 L& h% Z
7. STM32F7与STM32F4的复位序列比较
. Q7 c: W! Z6 Q
, I0 O, Q; J* w8. STM32F30x 的ADC 采样的傅立叶变换
  {! L8 s9 m+ s+ M9 @9 ^% S# x/ R! O$ M( ?5 ^5 u
9. EXTI重复配置两次导致误触发中断的问题
6 X  `/ F) A+ B
# I9 P5 d7 r& D; {8 {* H10. STM32F3xx/STM32F4xx使用浮点开方指令
0 A* n0 b+ ?1 N' f5 e8 N# A- g! _) R7 [0 N9 o% U
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响* M5 L" _3 V' H1 E$ ^

! S* j: b; _" k: }) S, |+ |" J 12. STM32F7 MPU Cache浅析  
  \7 X3 q: }. b9 ?
$ [- V7 ]8 M! v13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
# r- o5 {1 N& H7 l9 [4 y# R

  @* ^; p2 L4 g2 y14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)5 I- a& N1 W4 ?" r2 O1 d  K+ `0 E
7 p) {) q5 c( r$ I- H4 X
8 ]# y: m. W+ A4 g& l6 E
八、系统外设
$ J, S+ B* n6 ^' J  t$ f0 @% m 8 g1 c* ]% M: D1 |+ o
1. PCB 漏电引起 LSE 停振2 w: r6 ~0 L6 O9 f' I

$ A2 |* A: X$ ?+ ?+ b2. 时钟失效后CPU还会正常运行* O3 n! Q% a( [" p$ c% r
8 F* b4 h0 {( p0 w" g0 R
3. STM32F2中DMA的FIFO模式
. t2 S2 \6 L5 K4 O# y
  Z; j& [& ?+ `8 j/ b* U4. STM32L053的GPIO翻转速度的测试
! S& ^; i2 V3 @! g4 E9 I6 ^
) Y' o  b% C. d: S( v: f1 f# T5. STM32F4xx PCROP应用9 {1 h$ E: w' `( O8 Z, ]9 s

) F9 u& [) M. q% f6. STM32L053的GPIO翻转速度的测试2 m$ |6 [3 E' f  I: h
% T: V8 `1 f% z/ @/ O" ]' Z1 K
7. 如何在IAR中配置CRC参数- W# h8 a9 I; i1 z

9 f) G6 C8 S; Y& {( m8. PCROP区域函数无法被调用的问题与解决
7 O8 A! ^  U0 ~2 v8 ]& A% J
2 t5 ~: T* U' k3 [" f, C9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题  f: r) L$ I! G( p' K

/ O4 @% J) J" N10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
# D5 E) I3 @. _& Q; s2 h4 m- k
: o2 m! K% k5 u9 @11. 如何用LSE校准STM32F4内部RC振荡器- S* e2 ]8 ~7 C+ H9 F4 [# Z& k

+ H1 [# y! `6 `12. EXTI重复配置两次导致误触发中断的问题  
4 N# H8 L# g% D5 w, F: \% k: H) g  O0 t: |" X# `
13. 时钟安全系统的应用(LES篇)  ( b# h6 I3 A+ {* G. A5 D% P# j

  C/ p- l" M' U  ~* a# [3 j0 ]# }$ K
14. 利用DFSDM开发PDM麦克风应用介绍  
: `1 @% S2 x* n. F" U
; Y; V$ u4 q- r
15. STM32H7的FMC外设在DCACHE使能时运行不正常 8 Y. O# E# z( _
! O* n+ W5 j2 g0 }
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)4 ~, }4 y. `- r! }+ K( b

9 b5 K: K3 Z$ s! M8 c9 _' D$ V6 y( H, E9 j# Y- K3 O( B
九、标签和收发器( o8 K/ b9 w7 h; f, m  T4 O5 E
4 w) W# S  ^; r' K, S
1. CR95HF的初始化步骤
! n; E& ~, a; L8 j  r9 G  ^
# X5 K/ {) E+ k% A' U" o8 m8 H) o5 C0 F- s7 N
' W0 N* b( H# ?
十、生态系统
) h2 z" U7 F- b  `: h9 Z$ `' P / Y9 r9 t6 k: S; j5 s
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题4 {0 T# B! I9 y. Y0 @

$ L. a1 l& Y4 t- e5 J: ]2. MDK Logic Analyzer 功能在STM32中的实现问题8 X# F7 `' P, p9 R) Q+ x

6 Z! _& p1 [3 U$ h# x3. 在IAR6.5下如何将数据存放至flast中
4 w) r/ D6 u* F) g$ m" J$ _$ P
2 I4 k3 _4 `( M5 b) k# ^! }" ~# C4. FatSL移植笔记' T% L% ]7 c% V6 _5 t. G

( e3 `! y9 p5 y: D5. Keil中使用STM32F4xx硬件浮点单元! L6 N! V/ Y# R+ S' a
! W8 {: n) ^8 j
6. 如何生成库文件(MDK和IAR)
" A! r1 u% j+ r; c: y' D! n6 F
+ s8 X' p7 x6 ~0 G# D5 a* K" H7. Nand Flash文件系统解决方案
4 _# G6 ~: d0 z8 T
4 [) i, I4 E# ~! Z8. STVD在调试时弹出“Cannot access configuration database”的解决( u$ H2 ?1 [2 z: z# F3 ]% M% x  {

) c/ L' e$ L# ]: v1 l/ ]( G9. RTOS低功耗特性的设计原理和实现/ M% C. H$ C7 k

: I) J! Q$ O7 k3 S' s) N10. IAR下使用J-Trace进行指令跟踪* c' L! J6 }6 h; s7 [( K6 e

/ G6 m7 y) P  p$ H2 E! J11. STM32上RTOS的中断管理
4 E9 J+ L& P: u/ z$ Q2 c& O' }
12. IAR下如何让程序在RAM中运行0 c) `+ F7 m5 j2 c

" V5 ?/ \, }) _5 O13. 如何在IAR中配置CRC参数( m6 M* v8 Z% D, g

$ M* e' c) `0 }' P14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册
: T3 v" Q) o: i0 V/ Z. b
' ]( L; W' J+ l2 Z: l5 f3 y15. 使用mbed进行STM32开发及STM32F0的时钟问题: I$ _* }- s; |! ^$ W( E4 s+ B
& o, U0 l$ H* w( j0 m
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
7 s. u% `% u/ N$ B6 z4 c, f
- g' ^  @8 E5 b2 b17. 多任务系统中的不可重函数使用注意事项) o' X+ e& P$ H% W4 k' U! p
, p; f- t& ^& C: k
18. STM32 utility的hot plug功能! d, T$ a5 h5 j3 L$ }) _
& M, \  d) T- M1 u
19. 如何将CoreMark程序移植到STM32上4 e: u, V2 s, c( [

3 N" }, J! G8 c. F20. FreeRTOS定时器精度研究5 t4 R4 G1 a2 L; U+ L3 E

/ G; a1 u. L) g8 e' w* w# {21. 如何使用Eclipse和GCC搭建STM32环境5 Z, L7 S0 z, p

) k, I9 E( B6 x9 u22. 如何建立一个基于GIT的STM32库
( q; A/ j0 X' |# b4 P" [' g
8 c9 ^: W# w% d23. 从零开始使用CubeMX创建以太网工程6 |! ^1 r# w" p9 f9 [

4 l; n4 ]+ n6 O9 P+ j24.从STM32Cube库向标准外设库移植FatFs文件系统* |. A8 ?! U  n2 I
, c  ?3 G. }' d! l2 r
25. 基于 STemWin的屏幕旋转
7 g8 |9 v4 d9 S7 X. @
! x# L0 Z( n, k26. 编译软件 Hex文件烧写 0 L$ ]. v9 y: R5 w, J

1 U5 [3 D( \9 G27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 ) P6 H5 S" p/ k- o! W5 Q2 [
! `: N0 k5 H) m2 Z' K2 _
28. USB CDC类入门培训
$ }2 I" h2 |$ \( n- Q" k+ U9 Y
# Y$ N+ Z5 |0 a29. USB DFU培训
, T9 S& e+ @" m6 `2 b0 f2 X; G4 [" P7 Z4 [
30. 用于量产烧录的拼接Bin文件操作
' n3 ^% n, b* R; d& v' q
; y  ^( E4 q6 g1 B7 D31. STM32免费开发环境该用谁
  J9 K+ t! O$ V& a7 ?, S0 A$ f8 a; x1 [6 f, _: Q$ p
32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
. c" z6 I; m; Q
1 o& Z$ \( [7 B3 H; p33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
* ]+ d; U" V2 K! k% O7 k0 A- m, v( y& ?! d
34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
* C8 `: y; I0 U4 Z; k" R2 z5 o$ q' D* _, P4 I
35. STM32 FOTA 例程之 cJSON使用   
: s4 \" o2 d. E' J
" j* U0 u! Q: Y8 H36. STM32F769DK 云端固件升级例程使用说明
- f, G% p2 x# d0 {" H
5 s; ^1 f1 ~& D* Q- K, n
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 ) {( L9 y5 U4 i- c

, E% r2 S8 d/ k38. 基于 STM32 的阿里云物联网平台方案
4 u" ^, h# H( X" @$ f) U- J+ L! m* J+ w2 C+ l
39.AliOS 任务上下文切换原理分析  - l0 ]! P+ P5 d+ W% V9 j, L
* Z0 e! H9 X1 Q- {/ n# j
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  : `2 t1 c% z5 _' k. P$ R

- `" F$ W6 M% V+ b- ?8 O; P41. STM32F769DK 云端固件升级例程软件开发文档  " k3 s) J5 L2 j9 b0 I% M

, v2 \3 W  ^2 u# i# L% [' s0 ^42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
+ B. B3 x" V8 t6 ~- O
# b) F5 c' |1 W1 O. g+ C43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)
: N1 W+ v# L; f9 U" H% O$ t8 N1 T$ ~8 E& F6 a, N
44.零基础快速入手STM32MP1 (2019.9.19)
0 _# T  h$ F4 I( D/ e6 V
; u- e0 h/ M: g5 a! Z- m45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)/ _5 s, V% n$ ^
  J/ x4 ~" z6 w  m; |' p* e
十一、调试
* ]5 j4 a& f9 J - k% s) t  f! W% e$ X2 \
1. 关于STM8S SWIM Error[30006]的分析6 ~0 G3 P" Z/ I7 E
/ D) N# g7 ^/ A5 ^7 T; e' f( E
2. STVD在调试时弹出“Cannot access configuration database”的解决
' y! D/ c, ~1 T  z' n
# V! _* p4 }) X3 }. t3. IAR下使用J-Trace进行指令跟踪* m/ j* J5 ]  [7 l7 B

. Z) ]8 v3 R" Z) q, v4. 菊花链 JTAG STM32
% P1 K+ L) j3 r4 C. d" z8 M/ B, |6 q+ y
5. STM32F411CEUx 能下载程序但不能执行
7 ?6 Z& Q2 _: }6 s5 s- G8 A! i* Q0 `8 G) f' q
6. STM32F103C8T6 程序上电跑飞
. j* S* i5 U1 o6 c1 K6 I0 `
5 k" v& i7 X7 t+ \0 {0 c7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
1 Y. O: U$ E* W8 B. l  O
5 R( s: o. i. B- N" F6 E8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  / u6 ?4 c6 \- P& J. r+ E/ l7 ?

) v/ x  {, j! u1 x9. SWIM协议的GPIO口模拟
; _, g' Q5 u: b& d  w8 \1 H$ [; S! ^, w/ C$ y2 g) {7 p; ?* Y' _
10. STM32F091空片使用ST-LINK烧写后复位不能运行用8 Q' X# v5 v; V8 x+ R
% X! h' @5 d' X- d% ~
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)) Z; S+ Y8 h) S

. R9 B) l& P& x$ o) o7 ~- N2 o12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)9 D1 p* \  J3 e4 O
* e0 f2 G  v! J* {
13. X_Cube_ClassB代码移植 (2019.12.24)
2 V# {0 h8 @* ^) h+ ]2 e: {% K) w7 |' a, \' N2 a  d7 [7 ^" a

+ E" w* p+ C8 ^6 M. F. S- a14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)- j, e. c3 S; Z( h  r+ S; D$ A

3 i4 F( ~; `8 \# L6 i' H$ W* k十二、人机调试
; P# i% Q* F# i) ~1 a* M* [4 g3 c- K. s7 D* r1 V' Z
1. 一步步使用STemWin在STM32上开发一个简单的应用; K& m  F1 w5 t0 R' _

5 e- ~4 H8 b8 o2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计7 d0 M& h+ N" z9 E. U# r3 {/ y# Y6 T/ {
9 V, _0 a: F, U) L
3. GUI方案中ALPHA通道处理介绍( U3 f  b$ G  p$ s
$ V& x  q+ u$ B: [8 k  O5 A! N9 ]
4. 基于FMC8080接口8位LCD的STemWin的移植0 W/ ~: _4 t7 W+ e4 E/ O6 d
' x( _# l' C. F+ s
5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
1 T$ Q, i/ V0 Q/ F/ {) K: a. j. A2 @3 W. C8 e
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)7 W' P6 i0 i' f1 o( w
& a( I7 w. T, u2 d5 o
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)! @( q* ]8 [3 s- a  _) J7 A$ v

  f4 G9 `! y: e8 ]9 m% J* O8、STM32L5中如何关闭trustzone (2020.5.12), p# u. O8 l- l: D1 b7 O
. L3 T, \# `1 u' Q0 W1 j; }
十三、马达- ^7 t& P  C1 `
3 {5 G- p8 F& t7 P+ s+ S( q
1. 电机控制同步电角度测试说明
1 [0 [, V. e4 I- a* t$ R3 c; k) [- f3 l6 G4 H1 @0 n2 ^% a7 {$ Q" m

& k' P4 {- ~) q! m) j, U3 A/ G7 ~7 J3 r
十四、安全1 t. m% R. m$ y; ^
. [. k3 X' ~+ J5 n
1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
, v6 @+ U- ~- Y! k6 h: I1 \9 p$ |; _5 M' q9 Y
3 O  a6 w& n, X1 s
十五、其他6 f0 W7 [/ W! C+ o

& H: I: t' H/ H: |  S& L' G5 h5 o1. 跳不出的 while 循环! C3 d/ |3 H% ^' h+ F
; P) P! l6 D1 i9 M2 }! [4 b
2. 外部IC连接NRST导致MCU内部复位信号失效的问题
7 U- }# k5 C8 E5 b
5 S( ]; z0 {; z3. 潮湿环境下不工作
  h, N1 E( v; V  s8 J& |2 |  R
( t8 @  d* _$ a+ R9 S, Y4. PCB 漏电引起 LSE 停振
/ V% f1 x# I) E0 C1 g 5 _. {3 p. o  _* ~; ~5 N$ n
5. STM8L152 IDD电流测量: q* B2 ~1 ?1 _& h& p
% r  ^* e: C, m
6. 使用STM32实现锂电池充电器3 Y% `8 D5 l! F

/ ^# B# _- e8 m7. STM32_STM8硬件平台基本检查
9 @. |2 S$ t1 R  u/ [+ k4 O+ [- l0 m: n
8. 验证STM32F401在STOP模式下的电流
4 D& j* u' H; s. d" N1 Y' ~' F% }. Q, G+ C6 G$ K! t6 u5 d
9. P-NUCLEO-IHM001 电机开发板串口调试指南
  d7 E+ U5 {/ Y3 Y1 I( D% z 9 C' d- @( |0 n, A! e8 b
10. 一种计算CPU使用率的方法及其实现原理
% @& h# W- n8 e) x  O, }1 ^, q, |+ }( a6 t
11. STM32 RTC不更新原因分析8 l, R1 r- C& Q5 s% u+ {

4 u0 Y: w1 a& L- l7 v12. 关于ST库函数的代码性能对比+ h3 j% f, d2 @9 W, f. l( w9 O1 \
, l  ]( C" M4 t3 {. {3 |$ [
13. 在IAR中实现通过将程序在SRAM中调试的方法
) t. o8 g9 b$ A2 U$ {9 w" v4 r' b# K+ H7 N; K2 T
14. M95xxx EEPROM写保护配置: F* T- p8 d, y( D- J# B
# D6 P0 R  ]1 B8 h0 Z
15. 4SRxx的GPO的属性
8 p4 S! u& G8 o, b! |
4 E8 z2 z  J+ l/ E16. CR95HF的初始化步骤
* @% M. l1 l+ [( k9 T
5 q% r1 S9 L2 `4 N3 p7 @17. 电机控制同步电角度测试说明  
3 n/ b" t$ ?7 N' Z5 M0 u
8 F5 v$ {% f8 Y' N* S: y18. STM32+BLE通过 Notification与 Android应用程序通信的例程
+ l' _9 A- i: u  l- `5 ~( M% x( f  K. R3 S
19. M95xxx EEPROM介绍# G/ p7 X3 q2 C! U9 m

3 c* k3 _- I8 h" \# ~# Y& j! e20. STM32 DFSDM测量温度应用
+ l. T' s% g5 l% {: g2 s% T1 E. V) g: r
! o0 ^  m* w9 S3 ?1 H; {1 g# T21.代码实现PCROP清除
8 r' X0 f: i$ D: d/ s+ S1 O0 `7 n' Z/ l) ]5 E
22. 理解与应用MPU的特权与用户模式
) E6 X: q, X1 O3 M# [/ N4 i' n  o. i. p
23. 用于电机控制单电阻采样PWM变形信号产生
# I  \& d0 D& m! t5 ?- p6 I
5 ^) Y- L0 o7 {! G5 b0 Y9 f: j  H24. STM32L低功耗模式唤醒时间测量
6 l" ?1 ]. W7 Z5 b/ V) u2 o" `1 e& B' N4 O
25. X_CUBE_SPN7程序电机启动抖动问题
6 M: a+ s% G2 K3 j1 A2 ]. p& B! g. P+ {- q: t5 k" i5 C( U+ \
26. 发现STM32防火墙的安全配置
# S" h* _6 u' G: V7 K5 e* T5 e. R6 d0 ]" M* j- ^
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
: b* I& g6 j$ B# R
: j# s" O: q4 n1 j$ o' w28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)0 [8 T) I* `! ~7 `8 X- v
& _3 ~% N" s: ~2 M( c
温馨提示:

3 V! D+ ^- g0 ]8 K
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
. A/ B9 d* u4 k& B
8 y9 R( [" e  W" {8 c) v: h
  |2 T0 B- Q3 }+ O5 E4 u
* w6 u% }. z" k2 n2 b, g
) d0 N% \5 M/ t5 a
4 o/ [2 t1 l6 J, G) l' U5 X. M
; ]; o" Y( t$ w2 T8 d; N3 m) _2 \

" B) y2 k6 w% Q& V) S5 N+ _- j- N( I7 \$ ^
0 s$ Z& C( E7 S4 |+ |7 k

, k: x& i1 \9 d' p1 z0 D' z1 b

评分

参与人数 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
好详细,多谢分享7 G! h. G& ^4 W! c& Y2 |9 l) S
5768340 回答时间:2018-1-13 14:42:54
HI  : x' w1 s9 N/ ]& @& F. @( s
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
: n  w  h6 ?3 G; ^   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************$ y1 g" i  `6 Y9 s4 d! ]7 L
  2. 函数名称:Cdfinger_Bspspi_init
    2 F' f2 R; c/ c+ v: a% j6 V6 g
  3. 函数作用:spi初始化函数9 z8 w+ Z: w8 [* o$ v
  4. 备注:% N, W: Q+ q/ `4 k( D" P
  5. ******************************************/$ S( K: r; \# a' ~# i
  6. void Cdfinger_Bspspi_init(void)5 ~# i+ c9 |6 [2 x
  7. {* F  g! X, H% }' j" n) h
  8.         GPIO_InitTypeDef GPIO_InitStructure;) N  }; E/ d6 d- z
  9.         SPI_InitTypeDef  SPI_InitStructure;- [% z2 l% ^/ O" @1 b
  10.         DMA_InitTypeDef  DMA_InitStructure;
    * |$ I! _0 O- d( }6 c
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    6 v% N4 p/ x8 r3 ~, A, _" \2 g5 i9 i
  12.   / J9 _6 Y% x$ ~" K' T% @9 A
  13.         int ii =0;
    * ~" _/ z# K* a9 J. |/ |
  14.        
    ' Z. d2 H$ \  Q4 G% l" P5 j
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    7 n3 N- ]$ ~2 w3 e) \+ x
  16.         /*!< Enable SPI2 clocks */: ?7 K; S7 |8 l% H1 v( n1 b, t- A
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);+ {6 B6 e! n* W% O6 I$ S) W
  18.         /*!< Enable GPIO clocks */
    4 W- E& d3 X" h( |0 d5 G/ V8 S2 l" [
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);* V9 `7 S( |4 g
  20.         /*!< Connect SPI pins to AF5 */! B. k! K6 O8 z5 w
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);6 ?. A! {; ^# a7 R
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);: g" a* `0 N1 {
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    ; ^4 k( v8 b* P5 f
  24. ( ]: J  h( o  d1 ?  U
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    ) u; U+ y& J9 l5 o( m& V
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;5 f7 O! E$ \  T
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;% Z: m% q! O" F4 l. c, C
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    * i* @$ F7 w5 G( |2 V7 R5 {
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
    . V& ~( v+ U6 R8 |4 u
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    . B( j1 B6 a$ \- `& Q+ c
  31. . f' v$ V# K* S  d! Q# x
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;; h& K9 ^1 A* O! b) V
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    & q/ P! H# M) z6 C) t" C. a, ]
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ( S& j9 `7 i% {: m$ \7 l( D/ D
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ! |8 V& ?3 F6 P6 e
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    ) ~! [  n! F+ _8 e& Y" B# N3 J# B
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);  V2 U  z+ m0 g2 |3 @& W' @# a! G
  38.         Cdfinger_BspCs_HIGH();/ h6 h7 L. s; l3 z
  39.         //Cdfinger_Bspdelay_ms(1);9 n1 M! _. s% T1 e0 G
  40.   //Cdfinger_BspCs_LOW();" X; p+ S) B- k8 m8 k3 B
  41.         SPI_Cmd(SPI2,DISABLE);7 {* ^. c# Z0 X4 z5 p: W
  42.         SPI_DeInit(SPI2);
    ; B0 V# g6 K8 O9 m3 [- Y( W/ a
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    ' l$ D* K1 N- W
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    / T# `5 [9 ~+ I& [
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    1 d. f4 C6 _! S
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    8 q: l% o) \; B3 E" T6 r
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;; Z3 J: N& `/ |! k9 p
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    0 e- O# n5 \, O! a# \
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    5 K7 F/ E( g* h1 Q% ]9 V  c9 t
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;$ \* l1 u0 `$ @+ [, J# t
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;" m' N7 H3 }. |  K/ W; M$ r3 M
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    ) g# X2 {- A) u& N+ k- [

  53. 3 o" n- b1 V& d) Y
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);( _8 A! g- ?! v# M" F6 R
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
    " B3 R0 h: V1 S" c+ E$ F8 `
  56.         DMA_DeInit(DMA1_Stream4);: ^4 C8 N6 ]1 I
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;' ?: _2 l0 `" b
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    1 {7 p) ~! K% V- R8 `) O
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];( u; a3 _/ Q/ i8 l6 ~
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;' a0 c6 T! x- j; T, l+ g2 _& E; x
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    6 w& o. L: }2 ^7 n/ S7 u
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;; D' W4 E. ~, J- Q+ P+ |
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    8 R- [6 z9 I! G; a( \: J
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    ' }8 {  p1 y" l* U, v- Y
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;4 N" Z, h9 P+ P
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    & B% Q# W1 |! _5 Y/ Q* {" {
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;$ z0 e8 S, b/ A
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    : B# M$ y+ w* }/ m% h1 r1 Z4 s
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    3 n% b4 P: c, d# o" M5 l
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    . L  L4 {" Q+ @+ x: C" Q
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    " c( }( ~; M$ y3 f3 `8 i( B
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);; [7 T7 U5 L- f" t
  73.   7 C# g% H" M( N* g7 P' i% _
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    $ _& O# p% v0 C/ V
  75.         DMA_DeInit(DMA1_Stream3);7 F+ y8 {& g7 k4 Y  Z
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    % F8 v5 }# M8 N$ X8 E6 p
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);5 f' [8 K7 N0 o
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    1 _! N! e' d& |
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;; u* Y2 f9 k* A0 Z5 j
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;
    3 a! [" o% H: a" F8 j- J
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/ n( m) x# q  I* ]5 E  `
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    / B: [5 p& P* X
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;) P4 [) r- T  W; o
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    ' ]" J; W+ U7 F/ Y; q: r2 K
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;; N1 E7 X+ V6 r& q; K5 ]9 ~
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;9 A6 D' ^" n& k: Q2 S6 }
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    0 J! E5 T6 J4 }# |$ A
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;; k$ }6 l0 `+ P* b  s
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;6 V$ v+ n  I% k' ^7 L' \
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;8 E8 r$ `' v+ G: J8 G
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);- A0 ?, `8 r  K. Y0 a
  92.         //Cdfinger_BspCs_HIGH();$ Q; s5 K9 y' ~: ]
  93.         ) g/ |* R& b: T/ \; P2 u

  94. ' h4 P6 A1 Y' M' m( k2 U- n( E& n
  95. # D; Z6 J5 f4 G2 F+ E, z$ [( [1 e
  96.         //发送中断
    ( x! Z: R" Z# I
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    # V0 k* Z/ Q: e7 U5 a
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    ) ^8 j2 f  \9 |0 A( g; L0 d
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;1 |* H, h- X0 D5 _! F( m
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    . U! I2 d5 q6 S( y3 Q
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    9 h1 |6 F0 K" R7 N
  102.         NVIC_Init(&NVIC_InitStructure);
      J, o# l( X. w) \. D- v
  103.        
    - j* W  t% x( V
  104.         //接收中断
    ! ^: V% `) P( i* H) f6 ^
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);& ^$ G! M: n" e) Y( B6 B2 S9 G' Q( s2 U
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    9 E8 L. \4 ]( ^# n1 z/ T
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    0 j8 K- s- U. Q: p7 g+ o! r
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    : q& a& j7 h' ?1 X
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;$ e, N- A8 v6 s6 S
  110.         NVIC_Init(&NVIC_InitStructure);) J7 s- P, z* n) a5 h
  111.         SPI_TIModeCmd(SPI2,ENABLE);
    # Y, m7 g' |7 f4 i. _
  112.         SPI_Cmd(SPI2, ENABLE);
    + |! d$ [8 K; g& W' `) o& \
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
      T% z: d" ^4 D& t; L5 k& u
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    : Q7 C1 O2 C: M( G4 n  B$ d

  115. 9 E' H- C1 o) G% q% V
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);! d/ R7 B+ t5 _- `& B% y9 l
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    - B) |2 @# a1 Y3 o4 }
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);: Y% i$ n# V) t, V; ~: H, @

  119. ; O9 f" o9 A- J3 A9 a
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    ) l" Y' r: H# V# U- e! O
  121.         {& k1 R3 H7 u& t' A
  122.           if(ii%8==0): i7 z, r4 {8 j$ u' n# m
  123.                 {
      @, y' V% C" n; s# x9 i
  124.                                 printf("\r\n");( I4 T- s: l; H' n6 e' P( F% X3 H  F
  125.                 }3 Q0 ]5 E/ T2 N+ f: ~
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    8 }+ B/ X7 f0 ]" V3 @4 U/ A
  127.         }# ~! v5 n1 ]: R2 S6 l
  128.         printf("111\r\n");/ e* J# z, D8 G8 c. l  f8 G* k6 h
  129. }
    / O; h. T$ x0 V0 n/ O4 V
  130. & x3 o( T8 @% C# `& d
  131. 6 D1 W' S  r  I
  132. void DMA1_Stream4_IRQHandler(void): U2 O- d" p# ?. _' g: y
  133. {
    , g+ K. z% K# N: I' F/ e0 q
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    & k4 m1 w- T( V" }
  135.   {
    + U5 t, {# D( E) g! m
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));% r, h+ M+ D6 h9 }
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    ( Q0 d: s& Q; P5 j7 u% }" f  m
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);9 P! O- U0 a# a, P0 i& _  ?$ k
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);
    3 ^6 y9 X; r7 @- m9 W' O5 R
  140.   }; e: U4 W, d5 j  J0 Y: u) p
  141. }
    7 r* T: g3 [9 D7 E
  142. $ N6 {6 K% |/ q+ Z0 P8 \) x
  143. void DMA1_Stream3_IRQHandler(void): w, k  h+ U" I4 i( o
  144. {$ c$ P5 p/ Z! e2 y* y' D
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)( a( p/ F8 ?. w; j+ g, x8 g
  146.   {) I1 }9 T6 L, v; u
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    - k* \1 [. ]% E, m/ @6 `2 ?
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    . \+ P4 O! K; l0 k
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);7 ~  q6 @& F' W5 s
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);' [0 \7 @4 N' H( D  |2 \' B* C7 h
  151.   }; R4 e; o7 w! `$ {3 c& x
  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的波特率是不是必须为相同的,才能正确通信# E& ^5 }8 r, w7 |; O
以下是全部代码:9 W; B' ?- R) F3 u
#include&quot;stm32F4xx.h&quot;2 L+ V9 n0 Q* ?
void RCC_Configuration(void);
8 p; E% r& O) i; y4 p: }7 Nvoid GPIO_Configuration(void);0 y7 {+ Y0 I( {' h  v
void SPI_Configuration(void);
3 Y3 e# S0 B& @* |! Fvoid Delay(int nCount);" S7 O2 H3 f! b, K0 T4 h
int main(void)1 ~2 A5 Z3 h, ~0 P4 s
{  RCC_Configuration();
" T! Z$ ^3 ]- e3 p- N* X+ J  GPIO_Configuration();" d% r: v" G% A
  SPI_Configuration();. q3 K9 D- y8 G
 while(1)2 ?3 K! W4 [5 ~8 l" D; Q$ {
 { int data=0;& d( F* s6 W6 T4 J$ z; T- }1 I" D
  SPI_SendData(SPI1,0x55);& I9 D. t3 {! g) I( y; j' D
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); + ~6 t8 Y7 m' F: R
  data=SPI_ReceiveData(SPI2);  t- R# ]. F& s& Z2 i
  if(data==0x55)( {' J+ w$ ?8 `/ T' X3 h% A3 }
     {  while(1)0 f" g$ x. O2 m9 j* H, }' x
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
% n  t! T, _; e! I- N                Delay(0xfffff);8 w% M. R) c" D) E& w; }
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
5 G* k( y8 K& g                Delay(0xfffff);& S- N5 W# q! G  E5 Z
   5 F- b- O2 |5 `9 t
             };
* M  N2 U$ S7 k     }: |8 X' }4 e* \" ?/ P) ~
     else while(1)
& m# _: b/ I1 g+ ~3 s% d8 s& V/ ~            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
& D) n! u4 s$ _% U+ T! S               //Delay(0xfffff);
7 s3 B9 @3 D1 H& {( Z               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
0 o! _; }* P/ @8 F: i               //Delay(0xfffff);: ]/ V, Q6 ^( k/ ?
  
1 L3 w$ E1 s% ~- c8 A6 K0 W* p) }5 R0 t            };* P! X& D& U  n  S* z- ^
 }
" B! A0 P3 W& T# {# @. X5 h}
6 W1 l. [& |. ]void RCC_Configuration()
; w; z$ c; l+ q2 s5 f{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
& h" z5 v$ e$ [. a: a, H' j  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
& z$ S0 o3 B2 c1 A% k2 f! y% a  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
+ S3 q* ?9 L5 }' r}
. j+ p( _) D- g6 `9 xvoid GPIO_Configuration(): R9 m) M# q& d: ?8 C
{  GPIO_InitTypeDef GPIO_InitStructure;
7 P& u) U* q* n4 q0 U* j$ j  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
0 q- Y7 K# E( }6 r, t  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;! N! x, ]. {9 Y9 V7 a/ P+ ?
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
" G/ h; e/ k  L' z& b. H! I  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
9 x7 X* f1 W& U0 c1 ]- B  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;5 C8 o( U% t: S, Q
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);0 H9 ^" N: x" V  y, s
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
: N* n) ^' p8 ^$ r, N$ N* h5 I& T  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
4 {( _+ k5 I9 k+ X) b  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  W5 A$ J4 U& n6 @$ R( H1 F
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
/ L& l4 ?( |  q8 r7 Q) q  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;. H. D8 c$ W% c( g, r1 c
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);1 y) z7 z3 |0 ~+ M
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
( I6 G& }: `. A) ^, r# l  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
6 s( I7 T: d5 b# `9 ?* g}; E) A. U/ \9 P0 i- H8 }+ R: |
void SPI_Configuration()
) G6 v3 Q5 v/ n{  SPI_InitTypeDef SPI_InitStructure;$ D- j/ G' y% F7 U
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
) e! r+ O! @! x  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
5 V! N8 P9 D; T" ^) u' q- |; o4 D3 n; N9 O  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);5 g0 C+ b8 t4 Q+ k& \) f& Q
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);: i& B+ q9 q$ w3 D9 C
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
9 g" h: s+ ]1 F5 ^. y# H1 U  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);( K! [: I: r! ]# O; p9 E
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;5 h, ^+ I2 e$ n' Z! M4 j" D
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;7 m' @: G1 o: f4 Z
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
/ B& e" \3 V* I& e+ J$ m  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
" T3 I  L+ m; T( Y  J& C  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
9 a: r) ]! Z2 k: D2 U  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
; {5 I) I' ~+ P+ z, ~4 ^& n   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
, A, }' s9 [' w+ t$ l   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
. D5 I$ c' _' y/ b. x9 ?6 h$ q& S6 ]  SPI_Init(SPI1, &amp;SPI_InitStructure);7 W& a( W, q; j6 ]" R
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;2 I3 K% {( w% u9 W; I' J  U* N5 _/ m
   SPI_Init(SPI2, &amp;SPI_InitStructure);
% L% [0 F- H0 @$ t1 B% B$ ~   SPI_Cmd(SPI1,ENABLE);; U! ?+ `0 d+ B0 m, |& O
   SPI_Cmd(SPI2,ENABLE); 4 w2 ^/ V* K) E+ Y) ]3 L
}
, R7 Q1 `: P2 P" Z- J! _) m' n$ avoid Delay(int nCount)9 |- W0 e  v# h& [
{ int c1=nCount;8 @( l) v, _/ s! m+ j5 W$ W
 int c2=nCount;
( O4 u% _+ d* p6 y  \9 O2 h7 k for(;c1&gt;0;c1--)) u$ ]/ r7 D) e; t6 Y. r
  {
1 U& O( T* V6 v  t6 u/ E* _/ L  for(;c2&gt;0;c2--);$ d1 Q+ c  m. c4 f; m
 };' |+ O+ X6 x7 r/ a# |
}1 s( f8 r+ S7 |2 w& O- F4 B+ g, l1 r9 V
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:
! s! ?  A+ V* U- n2 j' ?3 i* Q楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
; m3 B, V# h% L0 ~4 U以下是全部代码:( F( u1 z. L) b
#include&quot;stm32F4xx.h&quot;6 F( W3 F# f1 H/ {1 H0 U5 p
void RCC_Configuration(void);
: a: @; f$ Y  V2 \1 n. Q* n9 wvoid GPIO_Configuration(void);# Z0 C3 B! j# {! U6 i
void SPI_Configuration(void);6 E1 o; J( c1 R2 u3 Z& K6 |
void Delay(int nCount);9 K& ]; ^# T4 C( w* i! b. u' ?6 ]
int main(void)- U1 _; G. v2 a: ?5 E0 e
{  RCC_Configuration();6 u+ k3 _9 L- n( v2 N7 p7 D
  GPIO_Configuration();
  J& D* m: I3 x6 U9 B+ O7 f  SPI_Configuration();
5 h# a( |: Z& I+ |- E* c' ?: z while(1)9 w1 M6 @7 g8 [+ Y* M3 y! n$ r
 { int data=0;, z& f, L( I: T* r" `5 k
  SPI_SendData(SPI1,0x55);$ u: u" H3 g5 {4 c; B- X) M+ b# ?
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); ! z* [7 m0 L- s  m9 }( G1 U2 Y
  data=SPI_ReceiveData(SPI2);
( B1 \9 Q( L) e% D2 O7 u5 l" r  if(data==0x55)7 C* {, F# m: _  p( U6 ~
     {  while(1)
/ f$ Q: \. [& O9 b             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
; F. x; ^) G  m) B1 b4 T                Delay(0xfffff);
+ j7 G9 D) e. k! e                GPIO_ResetBits(GPIOA,GPIO_Pin_4);5 V9 [: d+ K) J
                Delay(0xfffff);
  y. W; x( W2 g  c. ^3 \  
9 P$ R: [5 t6 n. K             };$ ~6 B! P  Y: n$ k* Q: K2 y8 I
     }
6 x7 n3 J) {4 d- T     else while(1)
2 q9 U$ V* u+ Y% D% a            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);! g5 @7 s- w, ]# `
               //Delay(0xfffff);
0 {  r; v, c. Z! |% Z3 m               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);( S% |, P4 t# x2 I( s  ]3 d( _6 }
               //Delay(0xfffff);
% y  U$ a7 U5 E& }% M   1 H* J9 {: \, U3 z
            };
$ w5 K3 |, U0 H6 `, _2 j4 V1 Y$ ? }
/ ]0 E. L0 B4 l/ c5 [}+ C* s& A" n' F( T' n3 C  R
void RCC_Configuration()3 _$ O6 W4 h) t" C2 |
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
# I% h& u9 D) }! b  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
8 j* S, r. K5 d% k- D6 w  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   ! C3 l0 a' a5 U7 X! j" B
}. `) d6 ]. T8 c; N3 Q1 i
void GPIO_Configuration()( e/ o) H5 z' }
{  GPIO_InitTypeDef GPIO_InitStructure;* h% Z8 r- S8 K2 X6 I6 G
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;6 ]  p2 A% L' ]0 Z. T1 f) K
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;8 l$ k2 r/ S! g% W
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;- j, n2 G; k$ D  a- |7 N4 o4 |
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
9 G1 Q2 H0 x& A  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;- B! I" d$ z  C5 {& S6 |% V
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);7 j5 J( B5 P8 T0 d/ t
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
, G, Y$ v9 V8 U, N. ?: U3 l  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;2 m" _' R! K! h1 B' Z; ?. e& n3 W
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;: h( ~3 Y" F. q4 k5 S7 l
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;2 B9 e% w4 r+ e# i
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;  {0 s6 q8 F: u8 D: K5 Q/ s* [5 y, e
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);: o1 {2 o  N# s% y
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;" b2 T2 B) k3 I8 [7 R+ r
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
5 O9 m) b5 ?4 n( A* B}
  x' r2 ?5 P' mvoid SPI_Configuration(): m3 I4 a# d' Z. ]- t2 J: K; M
{  SPI_InitTypeDef SPI_InitStructure;
- O& C- _0 _- m/ s" o  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
* }% K! L* j6 \: k5 d  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);  f" H9 _, g4 O2 s7 k4 z
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);9 X# k( {1 Z* n6 ^' o8 ^
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);5 _# C2 w1 U! a& |+ {6 K/ I
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
- c+ j$ B) J$ D; Y# n: ^3 H  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);- l% K# n  ~7 g
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
! G. i% W# Y% ^2 s$ k  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;$ v. D; S( W  a1 G; b% s1 p
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
0 Z# F' C2 v- L7 d; M+ ?  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
5 U9 P. H) f( j8 a7 E% h  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;* Z0 G" U0 g! \1 U& d; h: v* r
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;8 M: k, L. C7 s3 p9 g
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
2 G; o. ~+ M4 m) S5 t9 O& V   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;2 R- F' c4 s# x
  SPI_Init(SPI1, &amp;SPI_InitStructure);' d* Q! ^  {' n8 e  \( U# N
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
: V4 k  `2 a. u- W4 G8 T   SPI_Init(SPI2, &amp;SPI_InitStructure);" u$ i* L0 Y% |8 j) l7 I  M
   SPI_Cmd(SPI1,ENABLE);
' x% O! m4 H& V/ K8 U4 F( |   SPI_Cmd(SPI2,ENABLE); 
$ V& b4 O1 y9 M5 x! O}
+ ?, O& G  D/ x& Q4 g! `* y8 ?void Delay(int nCount)
0 f: b9 K' k' o8 @. ^' Y" `0 p: {{ int c1=nCount;, q9 |$ v5 k+ r2 n
 int c2=nCount;; }9 m- b' W2 E+ m* _
 for(;c1&gt;0;c1--)
/ C1 \  W( Z" v+ n+ m( h, |: R/ L  {. b$ E8 Y! m; j4 B4 c6 R5 [
  for(;c2&gt;0;c2--);
( x3 L" u7 E) ~ };
' M* E4 ?7 o1 u7 A5 S}
9 l) l- y7 U6 p3 F4 w% U1 m( @# d! i先谢谢了~~
8 o- G2 {! Y8 W0 o& @( I+ O" b3 M8 H# g8 f ' A; s. `! i/ F1 @
) t, x+ o7 E5 J- k2 u: q% L3 S
楼上的问题,看我帖子给出的提示哦~
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发表:
9 R/ R6 ]8 j! N# w, U 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
" S' ]! v; m! B( R* { 3 ^8 x" m- {; z
" e) R6 ~3 ?. h2 Y$ k
多谢支持!!
abner88 回答时间:2014-3-9 13:43:20

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

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

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

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

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

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

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

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

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

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

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

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

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

  ' ]( U* n  V( {# D5 e1 e# q
鬼魅一样的Hard Fault
7 t3 c# Y8 _/ H4 p 
; Q# l9 q; D' D该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
4 q. g) J/ `5 m 
& t/ y& ?; H' y# A6 G6 z4 m( `咋解决?
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 手机版