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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表+ @- X5 g- Y2 n0 ~2 o2 Q
( k( A3 l: a- i/ U1 X7 h( q

" f# P' J! x8 x: L2 _8 G社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
1 G2 w. R( b8 E) d9 C5 U3 x
- L" F" B4 c0 E4 ]& w5 R+ {提示:点击各主题,进入帖子,可下载ST工程师解答详请
2 u/ u  T, k. F. |$ y. I
! D$ y2 p# Q% U, P- }  B. V/ O) V  c2 ^
一、通信接口
+ |* E0 v  g3 @6 j5 ~0 \1 \5 a
) g' l# ]4 P1 }5 {. u8 W& h/ C! \1. STM32F2x7_Ethernet(FreeRTOS)驱动更新2 ~' |  D0 O0 p9 _/ `9 n# q
! O5 W* {# |# n; A& S* z
2. SPI 接口发片选信号导致死机1 q) N3 j$ d1 x

4 M! F6 ~. B) }4 r3. USART1不能设定600BPS的波特率7 z5 ?5 p  a" u" U' g
6 B# p' A/ V0 T* ~$ d( H) Y
4. I2C 接口进入 Busy 状态不能退出0 y4 O1 I5 [; P
1 ^' e1 d: ~/ N
5. 对 Flash操作导致 USARTU接收丢数据
7 G6 Y/ z+ F* b" @/ D) ]6 R+ m8 V3 b
+ n- t6 `1 w9 Q  n9 Q6. USB接口易损坏
6 c+ Q* t7 Q% V+ L' |  U0 | ; n: G3 `3 l% m: F
7. UART发送数据丢失最后一个字节5 r$ ~; W& w$ J) M1 S5 @2 D

. i  J" `9 b! U3 `8. 使用 CCM 导致以太网通信失败
, ~7 H0 g- a0 }( `' b' n4 ] ! l$ G6 D0 o7 K# ]  S6 y7 g9 j
9. SPI3 接口没有信号送出
% t( Q* d4 o: T; P# {0 p
% a5 ~) d9 H- f10. 时钟延展导致 I2C 通信不可靠+ ~$ A2 Y0 r( ^  s2 Z

+ k) q5 l9 ]  M' }11. M0的USART波特率自动识别问题
! W! ~- B2 N& T2 t 2 p. Y& O- A* ~1 n* ^% I/ P
12. WK15 OTG做U盘主机兼容性提高# k- ?2 T0 B8 b/ i. Q. Z! ?

& Q) A5 u7 E( G. W- Y, O* _  h13. 以太网电路设计注意事项
- o; \# c  n' M8 G
6 f7 H5 m# C6 y14. OUG主机库在BULK传输上对NAK的处理4 i1 d' p# v, G* L2 w0 ^# x+ j# \
4 _& {# c3 j1 ]* S. Z1 _( j, p$ P
15. 串口断帧检测
1 E4 k8 A5 ]% O0 S ' A+ E- u$ Q0 t7 e$ ?: \
16. VCP例程用于数据传输时丢失数据的处理1 [: T0 i8 t5 i! W

+ e0 E) W) Z# z: }! @8 C0 ~17. STM8L051F3P6串口UART数据起始位判断的问题
3 G0 ~5 r8 Y& K% Q; s 9 B; Y% Z* ]( X8 _5 d8 H
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号# e2 i5 V, p$ I* V

9 \- H* I( y  Z" b. y5 `- y19. STM8中UART奇偶校验的使用方法8 }2 |- b7 S: g4 X

0 z/ M& y4 P0 U& r) R) S* _20. STM32以太网硬件设计——PHY! V1 |) ], q& x1 J* l) F
& E) m4 C% `5 F0 H' N* I6 ~8 b
21. 一个判断I2C总线通信异常原因的方法4 w2 |( o4 f' g  F4 _) t
" C* v$ u1 i' j8 m, d2 d& H3 [
22. USB device库使用说明/ k7 S5 e/ J, t: p# `

# v( l( a. E0 ^  U+ k23. STM32F103上USB的端点资源
5 B! H6 G, n# k
3 |$ k8 z: B% P9 ?3 j24. 使用CubeMX生成TCPEchoServer程序$ {4 D8 o2 J$ B9 ?/ T
1 P( T6 s, s6 t: W8 T
25. SPI接收数据移位+ s* F9 F4 P( Y4 c; O0 e

# P: b8 H; U: }& v, d7 D26. STM32F0中Guard Time的设置
$ G; a1 Y3 _* {7 T, ?# p6 b2 k
! |; Y  E! ~& d. m27. LwIP内存配置
4 z; |! Q7 U$ K; s& U, F+ K$ [8 r
# E4 a6 D# X9 v28. STM32 USB Device的简易验证方法8 H' j3 F# F4 i. _8 [# w( L
- @! ~4 O$ P& S5 b0 ~2 y
29. USART 中断方式接收无响应问题的一种情况及其处理方法  m/ M2 U2 _7 Y
0 c/ e- z& c, I4 s" I* \
30. STM32 基于 Nucleo板 CAN总线的建立$ X0 }3 I' @1 M2 j
4 W: D$ v! `1 f* ?% t9 S# o
31. STM8 CAN总线的IdMask模式的讲解, n) z+ D( c9 c  I9 E7 D  m) S* `3 J
; e6 G- M( `% [- a' f- ^$ C# i! a
32. STM32F746ZG USB 驱动不正常 / k9 k/ x" e. ]  b2 }* V7 k

, W: O) j4 a5 |$ d- @6 ?1 q33. MCU在STOP状态下通过UART唤醒分析 3 Q  o& `/ h: F5 B. C; }5 Y0 D0 E3 d

% ?) d" ^5 m  U% C  f' J3 D( k. x34. 通过STM32CubeMX生成HID双向通讯工程
, f4 k" L5 u3 T0 q; Q8 y" Y7 v* e1 W3 W2 I4 t9 d
35. 串口工作在DMA模式下有时接收异常
( F0 k0 T7 g/ W& o$ O7 D
8 ]: J, [8 R2 z8 V0 `* p5 }- d36. STM32 Bootloader中 DFU使用限制
# _  N. C! I9 ?& J" z5 l& p4 k6 g3 ~8 G& W$ k
37. UART异常错误分析
) ^% u. w3 |& E* A& B3 T5 W* X4 ^  d- T: j" f8 F" C: M9 g
38. 基于Cube库无法检测CAN2的接收中断 5 B7 A  e4 Y4 G
! n8 j3 X8 i3 D0 N+ N/ R
39. 基于STM32F7的网络时间同步客户端实现
2 P3 O' x! a! D' ?' \2 ?4 J
; C* r: O3 L; q; z; z* g40. HID与音频冲突问题
- D+ h' W& W6 v" h8 e( e
( z8 t/ u! q& G3 W41. 在进行USB CDC类开发时,无法发送64整数倍的数据' K7 a' j# ~# b
2 e6 a0 }/ T: `4 `
42. 从零开始使用CubeMX创建以太网工程
( w$ |1 t$ c; p  e0 p: k
) S4 o2 o1 q! ?/ C' H43. STM32F4xxx的I2C总线挂起异常处理
( A; n+ j- G( G! {" \* m7 n. n! w, e9 b6 ~" ^' H
44. LPUART唤醒STOP MODE下的MCU
2 I2 m( }8 a1 w* o* Z( k% b7 }9 v" |: j3 y6 I
45. STM32系列 MCU模拟双盘符 U盘的应用
/ ]0 G; x$ Y! f3 F* V2 K. Q) E& z% ]4 I3 q. W
46. CEC输出的数据和数据长度始终不匹配5 P, _( h. {! }/ y' {/ B. k

! r" k$ d9 F3 r! l7 A47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析) V4 W; {* H1 w0 m* d
9 X# g1 m5 [% [6 d. Z" f
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)
1 K! {* J+ H6 B$ B! q) i# Y& I! a6 ?) R; n5 \* }7 K
49. 增加UART接口应用时的异常分析
! {; _  u1 z4 F4 o( a& Y$ q' {6 R; M% r  J
  y% x# ~7 U3 ?50.UART应用异常案例分析7 j! x( ]9 `) O) A

) r) x5 X5 t8 C& d( p5 h  H9 m1 s51. I2C配置顺序引发的异常案例4 y7 Z. V3 p  S2 N& F
: z! Q# P- _( F0 m& H8 ~* W, Y1 a
52. STM32 USBD VBUS GPIO
" {. }9 e8 G* N" i
1 y( w1 Y  l- x9 l8 P( A53. USB传输数据时出现卡顿现象
6 P# ?' l! q1 C& z- B0 R" q& ^; C" f
54. STM32的高速USB信号质量测试实现9 @' ^4 r' [/ C1 M3 q7 q
/ z7 R+ @4 T* X+ _. L  N; X/ Q
55. 基于STM32 I2S的音频应用开发介绍0 w/ v6 J" F) m7 J

0 G6 s- f3 N* _% V( o56. HID_CDC复合设备在WIN10的识别问题  
5 [- p1 g0 \* s! a4 D9 N: w( ?: {4 B0 _( f
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  
) K6 n( {6 ~4 C: _1 X/ f7 W9 X! L; I8 M
58. 一个关于LPUART输出异常的问题分享  
: A6 f! A7 e1 Y! i" M/ M: s. L, B
' ]& N! ]# L% X
59.通过 DfuSe 工具控制程序跳进 DFU 模式
0 B" I. h) K9 B6 j% ?! K, V; M
# v; u3 L# b1 P, }
60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
! W% h4 b% A, Q2 e7 s) J. v

( v2 P: p: E4 o61.一个因初始化顺序而导致异常的话题 (2019.12.24)) B0 L( w* K4 Q* @$ U) Y

5 r; {  I3 H0 {# c! Y62.MC SDK 5.x 中增加位置环 (2020.5.29). z4 K* {( Z: U$ `( B% s! S/ O

0 @6 i. L- ]( v0 s6 u/ l63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
/ t! [5 \! x: z# H3 r3 D6 X
; r) q' y" E4 I64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)# R1 X, R) j1 v& e
( o$ R7 }6 K: G- u6 h& ^& o) h
二、电源与复位
4 k9 ^. z3 V, l5 b) @$ A6 o
. ~: J$ G% G6 F0 A% l( g1. Vbat管脚上的怪现象
& O9 H/ i9 a' [5 K6 ^$ M
4 ?' Q6 K* \/ N2. 上电缓慢导致复位不良) y. u$ i7 Y$ c( w1 {) f' \
% t7 T( l+ o; ^- [8 `' Q& }) B
3. 关闭电源还在运行/ J& [( H4 X6 t# W
( l# p" i* d! A; |( L
4. 使用STM32 实现锂电充电器
% {% R% r' I8 N- q " }! _+ r# R& I
5. STM8L152 IDD电流测量# C" u$ a- n# ~2 V2 |. c! q

# W8 Q7 Q. p6 T, Z" V) A! T% M6. STM8连续复位问题# D- V$ M* A' x, J  q2 Z

% k" F; X' r( F2 v9 m; V7. STM32F2电压调节器REGOFF与IRROFF引脚的使用5 ~* c# e0 P$ S- q1 f

& w7 ~- Z" s8 r0 ]' @) Y1 \2 k( S8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流3 F7 T1 `( x" O) x2 o3 j1 B/ r

  i# b1 p; Q1 j) B9. STM32F7与STM32F4的复位序列比较
: I6 h! q  a, q/ m  D" Z1 k% C7 q8 H6 U5 [7 c* t$ c
10. STM32F107 复位标志问题 * f- @* a. x4 ]7 c2 R% K

2 Q: `. k' o- p# p11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  5 `- A: u; o( m: H3 I: J0 q
  o8 E9 ^: e, f- u7 N# h
12. Nucleo_L053不上电也能运行6 g) F6 }% B9 T5 t% {8 X1 h# v: T
! c5 Y+ i, v2 L
13. STM32L4中STOP2模式下的漏电流
# d/ {" v7 n$ d; L- G& {8 D3 P+ f4 V1 T6 S! q: h
14. 在没有外置晶振时HSE_RDY异常置位
' Z& v" @8 ~" |- ^  |( n& E1 h1 A( j7 x1 `
15. FLASH被异常改写   (2018.5更新)
5 ]. q1 M) h/ D2 O. `& M
* m! f; i/ ?6 L, A7 e16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
5 l2 R, Y7 \. d/ x) i
$ P3 {3 g% d' H& M17.一个 STM32 芯片异常复位之案例分析(2020·2.27)' k% |3 F$ B* ]- A

4 ~# @% K9 A* X- Y三、IAP和Bootloader$ a; `2 H8 q: S1 m1 K  v

& k* A/ W# E; u1. Boot Loader与上位机通信不稳定- k+ [! i5 X+ |

7 M5 l# k: ^5 M  u: a5 }2. IAP+APP 模式下不能启动 RTOS
& T5 h" x2 [, s1 |' O& j: O  F! {
2 Q% ~; k5 f+ c' k% R3. 从 IAP Loader 向 App 跳转不可靠
" p& o% w; E# O8 v5 e- C( T0 E ; T+ X6 N: y! D' Z" J& S
4. STM32 MCU IAP例程跳转到APP代码简要分析$ j: ~/ F5 n  L

! A$ ~0 `7 [! ]9 ?; q! z5. STM32F091从自举程序向应用程序跳转的问题与解决1 X" J8 q  Z, N" r  Q( y! ?+ k2 J
) V. @- {7 k* m- `0 s1 X, r
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
$ y3 x" C, R" R" c5 l$ X0 B+ ^' X1 P. V, ]$ o, t+ R" g
7. STM32F0启动模式相关问题探讨. r" M) s# A2 v5 q& X2 E
( r( B+ \' H* u4 I& y. i2 S, p7 N
8.STM32F091空片使用System Bootloader下载代码
" [0 \* B% X5 P9 S* h0 d
5 ^2 h# k, [5 G% B5 R1 J4 A  v7 }* N9.STM8L  IAP 应用程序中编程指导
8 f  z5 H  W% u, I
5 i; n/ Q$ _6 x% W+ S10. 如何通过STM32的串口实现简易脱机编程器
* Z) C. m/ Q, M: C5 H
' B: k( i# M0 G' w+ t6 t! c11. 一种从用户代码调用系统存储器中Bootloader 的方法  
2 z: D0 t- }# W1 t1 S& M
3 r0 _" l# _1 v: W' Y12. 利用 USB DFU实现 IAP功能
- u* Z" d& _  v7 p( Y0 y3 J# b% P* s  p+ n+ j: E* y% S' V/ e7 X
13. STM32 Bootloader中 DFU使用限制' @; W7 N4 W& i# X' J

2 w9 K$ p% K5 l1 b7 A/ o* D4 B* W14. STM32L011x和STM32L021x启动模式注意事项
2 e( h8 Q, R8 T% ?4 Y( C% h6 s9 I( w" e8 F1 i4 \- g3 N
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
& Y  z3 P8 ?" H5 ^/ N" w: x4 [% q: v1 F
16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级 # c* b& O. H. w. g2 p! M! u+ r& v* a
# L, s7 w$ M+ R& }! h  Q. p
17. 如何使用STM32NUCLEO 板来测试串口Bootloader( E! t; Z6 F4 E7 @$ g6 |
" r0 y" Y% {- n$ |/ b/ I% w; `- ?& I
18. 在STM32L011上通过I2C接口实现IAP
2 x" Z% @- ?# {0 ?& M$ |0 A+ R+ x$ J' Z. S; @/ Y# w& F2 G/ R# X- A- |
19. 在IAR中实现通过将程序在SRAM中调试的方法
1 `) x+ U* g! Z2 ^/ y9 J. E& Q& @1 v
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题: m+ H" J+ M6 o! p. ^/ z
1 v6 U, @9 _; N8 g7 x
21. USB DFU IAP 例程移植的两个话题
, {& q. M+ c: k/ J6 l- r
7 V' ?- f( A9 I; e22. STM32F769双bank启动
" l7 H, [& W0 X2 e  l5 z+ p
+ h( a+ ?/ m, b" J23. DFU加载 工具 DfuSeCommand的使用& S9 Q) L6 o$ S# d, [

& i$ j( Q3 n8 G" C: M! d24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
) X' b% `/ j& y; y+ ^( P4 C/ N/ S2 Z5 e& n
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)/ _2 J$ R+ }% M  L5 e: m: a  t4 s
6 u: m5 [& ]  h  n5 S
26.STM32 Bootloader异常复位案例(2019.4)
, R% z: U; I  r
' S0 ]2 }7 K: F( \6 B
四、存储器( @3 e$ v/ ?( q$ J6 D
! X: b$ Y% p; |" ^$ [! s* l3 `+ r
1. 对 Flash操作导致 USARTU接收丢数据
& B, c, |7 M- o; F8 D 7 I6 C1 h8 r! ^; b( p( |
2. 使用外部 SRAM 导致死机
, J! N8 S4 o9 L/ b  w$ L  q
( r3 _8 `7 t6 K3 u! v( B3. SRAM 中的数据丢失
" d% e8 d- _* n
# `3 k* a. ^  g4. 干扰环境下 Flash 数据丢失
" a  S8 \! E3 s1 h
+ C' ^0 z; z- i1 J' P6 I9 g+ Z5. 使用 CCM 导致以太网通信失败
1 m# U6 J- K  m9 t0 s2 }! b# ] / K8 n: p. ^6 `3 Z& X6 N. N; d
6. STM32F429使用外扩SDRAM运行程序的方法% i! X) K6 v7 R' v, G5 S( F. B

  w; Q4 P7 o* L6 n1 X! l7. 使用STVP实现对STM32L1系列EEPROM预置数据
& a3 i& n8 Q$ Y0 z9 C # A7 C4 u% S, p0 }2 R+ L1 B
8. FreeRTOS RAM使用情况及优化方法# `6 z) @& g) X6 V- D7 M) A3 w
+ \) t% N( [8 i' ^# J0 |; g
9. 在IAR 6.5下如何将数据存放至flash中
8 n* I) b* V/ e
" S3 Q# c4 {/ b+ e1 Z( a! G8 G10. IAR下如何让程序在RAM中运行! X/ z# E4 U6 A
3 G% N! n/ q7 ^& a- \7 R8 n
11. RAM上电后初始值问题& O) V  G. W: h+ Z; q8 `

7 T! J* T4 P# e4 c4 b! Z6 o12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计3 N% Q( R/ `  M1 h) n; z5 y3 k/ t
: O3 L4 p" I# Q& j" @
13. LwIP内存配置
" c# h+ ^5 ~1 v, j1 v& A7 @6 N( `5 @. r5 l) ?0 s* C
14. STM32F2高低温死机问题6 H8 x! q7 k' l* o* W$ D
1 i! B- m; g9 e' W2 H! V
15. 使用STM32F427的CCM RAM时遇到的问题
: N  a! U- P7 w& @2 U2 g
' q) E. E2 ~2 _# O16. 利用QuadSPI外扩串行NOR Flash的实现  
2 p7 _; D) B" F: t5 I" C* \9 B) \# l8 }/ ]1 `7 j! P/ A
17. STM32擦除内部FLASH时间过长导致IWDG复位     ' `: l3 }' e' ^" ]% _2 K0 f) \

' B; I+ g- t) [5 }
  U( l, G& J2 @( @  W) Q' y
18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
; k9 F4 l+ Z3 ]- u. p, V( ]( G. R" e4 P5 X2 I" p" ]4 [6 U
五、模拟外设- @7 a- J) @! r" @: w

3 F- A' ~" F( P1. ADC对小信号的转换结果为零. o0 I8 ?0 _' E3 `3 I, u

; J$ Y( N8 T' @2 A( v" u2. ADC键盘读不准
3 S. j7 l+ l# j" |9 Z 0 |- P- U/ b0 f. m7 p& k) a7 ]
3. 扫描模式下 ADC 发生通道间串扰! z- C% Z; g" [# v# ?$ I- \
3 g' w' q6 @! g1 V: v# w
4. DAC无法输出0V的问题分析解决
9 f) e( D7 @$ H7 H
. k9 S! l' G0 J; N1 ~* y5. DAC无法输出满量程电压的分析解决
7 L+ y& P4 c1 J/ W
* p8 B7 _7 t, q+ a* R# S7 m6. STM32F30x 的ADC 采样的傅立叶变换1 a5 h0 ]9 y  b' e0 ]9 D
' X% {& P8 b/ S* x
7. STM32 F1系列 DAC的示例详解- F. _. l' T/ W' T

9 |1 i0 X* a. |: T8 k- z: I  X: l8. ADC 连续模式采样浮空引脚问题
/ D/ X% {' O# N' {8 s3 V& j0 T! o" l& Q6 m5 X( }  U
9. PWM硬件间隔触发ADC
# V7 a4 x, c1 H' w8 B5 L* r2 u1 `$ S" C' f; ?
10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC' G' V6 v* g: J( ]( L% ]

; V" B+ P* `7 u# z, Z. y9 G; I11. STM32L4 系列中ADC 通道配置上的区别
& W7 ?" c+ o5 G0 {% L
: j* ]3 s# D' y% }% ]% f/ j3 P12. STM32 ADC模拟看门狗及其应用
" _! n, ~$ K! }
; E1 ^) B; L5 b% ^: V" D- o13. STM32L053 comp2 比较电压无效问题
) p; {; g7 i- G( T; g/ K( \1 M4 |- o5 t# p) q$ \
14. 运算放大器OPAMP在STM32L4上的应用
+ h! K+ H  }, W2 \1 A; L. y$ w' }4 I
15. STM32 OTA例程之ESP8266使用 ( K6 M" g4 @* w" y8 A

/ H. a2 L; ~) ]8 `8 m7 y4 l16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)* S# o0 o) \- a) Z- t: N
% B: ~8 B2 l8 u6 u
六、计数外设4 ~, I1 R9 T+ |- P

& g" i; ?. R/ E0 z% Z2 H1. Watch Dog 失效
3 p. v! i8 z% h! ?* d9 Z$ x( R- F
6 R/ `; c1 Z7 a, i2. RTC计秒不均匀6 c0 o3 t% ~$ \% E! V- Y

) V  T5 ^2 H+ ?4 [3. 软件启动模式导致 IWatchDog 失效
) X; y  Y! e7 \0 ^* I3 e+ u
4 b# J+ A! e$ a. u4. STM32F030R8 定时器移植问题
( |  [- i; ]2 x% K* R
, ]  F: I" w1 i+ M; {( R9 Q: G) e5. STM32F0使用RTC Tamper的几个注意事项0 f3 `7 H) N6 c3 Z
/ S% Y) Z% z/ M& q
6. STM32L053可控PWM脉冲方法之DMA
/ {0 c- M, T8 _9 }: I6 k
& j' T& ?! T- F# V7. CounterMode,OCMode与OCPolarity关系. K6 q8 J, x( L

. K6 l4 K1 E3 C1 O- \. m8. STM32L053可控PWM脉冲方法之DMA: E3 @, R3 B4 Q/ _
5 G0 d; K0 }4 Z- y6 T0 S5 a
9. STM32F1通用定时器示例详解—TimeBase# ^9 b7 X2 F9 ?6 J  o) N
- @! p  h! D- a( x
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals
. c+ t+ W- c5 \6 f" l! [
; i) Q/ M  W- o& k% o& a11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
8 p$ h& P, d2 P# Z8 I
  R9 v# \% K2 W/ L  _/ I12. HRTIMER的多种Fault事件联动机制
# @  I% h  M- P& @4 A3 n/ | 7 ~! n- p8 x' {3 c/ S( J2 v
13. STM32通用定时器 示例详解 —One Pulse
  N8 n" n4 M5 I8 u+ \4 m; P; ?" y" Z5 j, E5 e
14. 如何用LSE校准STM32F4内部RC振荡器
; U- q: N. @8 ]; b6 F* }
/ i, d. L* m1 F9 a3 k15. 一种使用Timer测试HSI实际值的方法
/ X  Q, a! ]& |
7 p$ }$ ~* f" t( K9 \16. FreeRTOS定时器精度研究" l! Z8 z& t: c- c- `

  ]& \; h4 _% _17. HRTIMER产生多相相移信号
; j5 D2 a) U( o: Q9 k/ \
6 c3 d2 o! J0 Z2 p$ i5 z18. 窗口看门狗启动时异常复位问题
/ Y% ]) ~  v, U1 n) y+ ?) a0 i9 n* j& `6 i  H3 b% f
19. PWM硬件间隔触发ADC
# D8 U* S$ U$ i9 V8 ^. C8 v" u! A. K* T' E( ^' `6 u# ?
20. STM32F030低温下RTC不工作) u9 f; @4 S- O3 x4 J8 W3 ^8 O4 g

, z( v' v( ]( q# r  L9 a21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   3 V3 V* W( L6 F" A( O

7 M  U& d* E' J; L22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
, g9 f, |. o$ U: d# U' K' V/ |5 i; V
23. 基于STM32定时器实现定制波形的示例 (2019·7·25)
5 f) ~0 H' X2 s1 |
" C8 F: E+ M4 g24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
) {; q9 ], x5 ]# |

: n( ]- e" ~7 W, D; B# R5 |9 _25.MC SDK 5.x 中增加位置环 (2020.3.31)
" R) e) h( b4 N9 _! w) W" H5 g# f6 a

) X8 F3 t- {3 q$ p: v26.STM32高精度定时器PWM输出话题 (2020.4.29)+ \8 j1 s+ u! A
$ N$ k  |2 a, u, j, \7 I  d

) s& _! c6 U; F  a27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)( u2 |1 ~- V5 D$ ~9 Q' l; w
  ~  D: K9 W$ s6 A# [5 p
七、内核9 W( @4 j, A* l, e4 Y% ^$ t7 w
% _$ `) G, Y6 \! A1 C8 {3 A
1. 使用指针函数产生Hard Faul7 m. \! ]8 Y, [7 K+ B2 G# m
  Y' \7 K+ T; S# e+ y% W! i. L
2. 调试器不能通过JTAG连接器件
! Q% F$ h0 _" P, u ' |7 B2 c, X2 M; ?' {" z3 h8 E$ L
3. 鬼魅一样的Hard Fault
2 u4 \/ X& |2 b; g( o2 j + u/ l* _5 A/ o, Z2 ]- i
4. 进入了已屏蔽的中断[
9 ?4 M( e4 P- G
* w/ w( h! X; ^4 m7 c5. 浮点 DSP 运算效率不高
% e* B3 f/ y" d6 Y; j
. N1 \: _% Q3 W  q3 s6. STM32上RTOS的中断管理
( U! m! I* V* H" Y4 c, Y" w0 J$ W0 k* j+ D- q/ A, M; R
7. STM32F7与STM32F4的复位序列比较" F* P& X; A, t2 P
+ `9 e- C6 D. s8 e/ t% q
8. STM32F30x 的ADC 采样的傅立叶变换* |" n% V5 \1 E0 t  M0 c$ M% c0 A  i0 T
: o0 q9 O' Y2 C- c7 h3 L
9. EXTI重复配置两次导致误触发中断的问题0 }/ v% L' |& m

" G+ y2 G9 c9 U10. STM32F3xx/STM32F4xx使用浮点开方指令
% _7 ^- h  F4 ?3 C/ z
: `; v+ F/ r% J0 Z7 i+ f, H5 \+ f( e8 D11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响7 v9 ~- v1 z8 s3 P

$ A3 v( L7 I  e6 C  D5 x 12. STM32F7 MPU Cache浅析  
* Q! J# e* Y# I* E& r9 E7 U$ `3 x3 D, s$ P/ p/ D" S
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
8 B' w7 Q) w; u4 H0 f% z5 w

; q& }/ `5 A: J$ K8 w5 O14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)
$ |/ C9 F2 J: ^8 x1 ?

4 s/ \- W, E' E* w
! V2 Y( d: [. R八、系统外设1 `2 o# O: v4 J  N3 q0 D% A2 B2 j
6 u3 I! p0 P' T2 l; ?
1. PCB 漏电引起 LSE 停振
: k1 ?9 a9 T( H: E7 s7 _
" a% d8 ^3 h9 t2. 时钟失效后CPU还会正常运行
: o* T/ q' s+ |; W- z" X- L ' u. a+ T' ]% T) D) \' a4 V, V
3. STM32F2中DMA的FIFO模式) `. O7 _( N  Z8 O6 |
1 R: i& L/ Z8 E2 p: |  c
4. STM32L053的GPIO翻转速度的测试
( n2 a' I5 a! j5 a: _+ s+ x- P  W0 {0 ^, \  S7 T$ U& K- `# J- U
5. STM32F4xx PCROP应用
" m8 k; Z& t: U; Y0 N
4 H0 G, `/ {4 {4 ~3 Q6. STM32L053的GPIO翻转速度的测试+ T6 L2 p0 @0 y6 B' U9 P

- J0 K$ J3 h, T) |. b" }2 {( v7. 如何在IAR中配置CRC参数
: `& t* ~, J2 w4 ^
. K& `, D) w6 O" E8. PCROP区域函数无法被调用的问题与解决" g* q. P& Q5 F! P" |1 ^
; [0 O+ Y2 K# P; b- m+ H
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题, |7 s+ E. j4 p9 }2 V) f
' ~) Q. [: G) a- k  E4 e! o  }, p0 i
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计7 W/ x  U7 N9 [( r$ ^

$ X' o# `9 W) n# C/ l) Z11. 如何用LSE校准STM32F4内部RC振荡器1 s2 Q1 n7 g$ m+ _* z
" U0 F( \9 c% ?
12. EXTI重复配置两次导致误触发中断的问题  
) @: Z  ^; K2 ~7 \2 M* e
# d% q, q9 `$ u. e- S, d3 ^5 H. ]/ Q13. 时钟安全系统的应用(LES篇)  ( P, ?7 o# l( y$ T& b* g3 k) C

" p* Q6 n5 a: A7 E4 L( I
14. 利用DFSDM开发PDM麦克风应用介绍  2 v7 V0 _, \( Y  H; H
) u' J9 N/ I) K/ t0 @% o2 G
15. STM32H7的FMC外设在DCACHE使能时运行不正常
( {* m7 n* G$ {! v! b! r8 o# v, M0 U: Z
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)" Z6 H1 f& {6 U5 U# E

5 D: E1 a0 q6 V# X' K/ @6 s7 h# I0 N1 Q7 P
九、标签和收发器
) z. K2 ~) d& |4 Y+ k# b- F" d $ H1 `/ U  C( K; F; P$ s
1. CR95HF的初始化步骤
- D6 C8 e; z* O. I ) f% c0 a% U/ d; P! |& Q( w/ U% s1 ~
6 H" m* h- k, x4 f9 c& m% x

( v- v5 d& P( w7 X0 L% \十、生态系统  U9 H8 {3 T4 F' }

/ z, S4 z1 E! Z% U9 M1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题% D" B" c  L( U! |

* ]+ X7 t; R( j- n6 q5 @2. MDK Logic Analyzer 功能在STM32中的实现问题
7 y2 O/ @' x8 ^. m 4 J1 r% f7 K& @. m) `9 J  f
3. 在IAR6.5下如何将数据存放至flast中
5 I5 |. w) ^/ V+ c" T
6 \1 ?% k) z6 ^; J4. FatSL移植笔记
* M/ N# `. }! ?' D+ n! Y
  J9 O- ^& v' j6 t8 \5. Keil中使用STM32F4xx硬件浮点单元
# p2 {3 f/ H2 _7 f2 w* `" }8 m " }' o, \# b  T4 _/ B% y& o
6. 如何生成库文件(MDK和IAR)( k% }$ l; i. T* W
3 n4 p4 d0 t! ?+ S9 b5 ?& B1 ]
7. Nand Flash文件系统解决方案
: P6 Z8 ]5 _, x* q8 e
( U1 p9 K3 I8 A1 q. o! y" E* K- j8. STVD在调试时弹出“Cannot access configuration database”的解决5 k+ h2 R9 _, T& @: a7 {4 k

8 q" f4 x1 F; N, o/ [& v9. RTOS低功耗特性的设计原理和实现# z& m( B% }4 t1 u
' E+ h+ l# r) C$ \
10. IAR下使用J-Trace进行指令跟踪, b4 u4 l& [+ _; L8 b" I. z2 j. j
1 f5 ]6 ?" y% m, c$ w/ |8 t5 |
11. STM32上RTOS的中断管理
5 i! _" h0 J4 _- s. p$ {
8 t5 n4 i- m- e2 K+ J  ^& O12. IAR下如何让程序在RAM中运行
. P1 j: h( G- U; r' ~) w* I3 t0 e/ p: C# x
13. 如何在IAR中配置CRC参数; x2 b8 w1 w' }, d% ~% Q
! V# W& u9 P& |  |7 m3 B# V0 v% }
14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册. {6 t4 |% F4 l- a

$ n' R/ J5 H& j( i# e+ e15. 使用mbed进行STM32开发及STM32F0的时钟问题/ D6 c8 S( }7 _9 {; r! R
, A. ?& S, w% g: n# c* U
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
" v! A. T4 B3 Y: F1 d$ M ( P) H/ v7 x" L" b8 ]
17. 多任务系统中的不可重函数使用注意事项: F0 k* Y; I! o. `( w" d' O, m. }9 n
5 Z. ^, I+ n6 o) K- X/ b
18. STM32 utility的hot plug功能
/ u: B9 J0 t* \! M" ?) h; A  D$ a7 o6 z1 X8 m# z/ m( y4 O
19. 如何将CoreMark程序移植到STM32上) }0 v1 [; Z+ D. M- [
" n0 v8 w- c+ G0 {' ^2 v
20. FreeRTOS定时器精度研究
8 P9 B4 d/ _2 u
0 @1 r$ E( x  `( |' N; P21. 如何使用Eclipse和GCC搭建STM32环境
1 a9 \% y# y& k4 O$ [  ?  O
- \9 j3 @' V! T5 f# F22. 如何建立一个基于GIT的STM32库3 E' w9 G# }9 z% q8 c$ u# K
  T  \* a: P& V0 J
23. 从零开始使用CubeMX创建以太网工程0 ~  y. b* E- z$ k8 p5 R: j
  I2 l: G( k. l! e* K# i
24.从STM32Cube库向标准外设库移植FatFs文件系统
0 _- \# A1 ^% h3 N/ g. J/ b( i
  \% Q, U3 X. _- ]' r) _25. 基于 STemWin的屏幕旋转
  K7 X- M6 i5 W/ u7 b* q
0 j" E- y/ }$ z# ]3 b26. 编译软件 Hex文件烧写 9 U. f8 _0 N1 [" j& ~6 ^

% t' s, O1 \( v4 O0 o$ S% H27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 $ A7 a" ?1 Q  z) I1 f8 j, O' t2 L
( e, ^3 G3 _3 l
28. USB CDC类入门培训# r8 v6 G" {  l

$ E: z) h5 Z! A0 ]29. USB DFU培训
. B. w: z8 P$ K. ~1 [4 j4 R( k* X' Y5 k2 }- \- {
30. 用于量产烧录的拼接Bin文件操作
6 J4 l$ t. j7 I5 o( _7 n
" J  n* d2 o* J! c2 A8 E31. STM32免费开发环境该用谁. w* r" p& g# k( \

  V  N: z- N8 ]+ R32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)
- ~( r+ j5 J& r/ K  h. i$ s1 u2 b' R7 k4 l* d3 c8 M' m
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)
4 w" A/ Y- k  i
" v: v( X& P3 B8 d' N& q6 ?, R34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  9 L& c: M* K8 K$ }" u' e

) M! r/ U. p! L4 Q# ^35. STM32 FOTA 例程之 cJSON使用   
6 a; t- q* u1 w# k8 q6 X8 L
! i$ _$ V  Q, m; T36. STM32F769DK 云端固件升级例程使用说明
, @# n* V( O4 p

6 z1 z& R) C1 s0 t* W; C37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 , n- M% G+ d3 u4 Q2 K

; l" R. M5 b: P5 z. o! E  \38. 基于 STM32 的阿里云物联网平台方案
# r, ~! n3 p" V/ D
: n  S& q1 W* [5 k" ~39.AliOS 任务上下文切换原理分析  
  D( i$ w1 C" u7 T4 m9 a
+ K1 W9 x' ?( w/ T* ]; j40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  
, k, ^8 D" f: A! F! i
) ^, Q2 N8 w2 {) O! |, v6 A  n41. STM32F769DK 云端固件升级例程软件开发文档  8 y. u' ~6 V8 T, s  }* w! Z

9 V: w% Z' w0 G# e3 i! x9 @# C3 _42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
9 J1 w5 B: v/ j# B7 M' E9 E
2 C& z$ _+ X* I4 Z0 J43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)9 k  M/ S7 m8 A1 l

% s; a- {8 E) c8 e9 {7 k44.零基础快速入手STM32MP1 (2019.9.19)
- T) _0 J) U; S
  Q8 p; L, R2 q. Q45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
% y4 Q6 p1 \8 ^6 g
* R  O7 `- O1 o2 ~  X4 f& c2 f% u十一、调试  Z& W0 w$ W& O2 V8 D1 Q

% A, P% E% ~9 V* S1. 关于STM8S SWIM Error[30006]的分析. z# R" w; s4 @! y

* z, B" o8 w$ V! Z& K7 a2. STVD在调试时弹出“Cannot access configuration database”的解决
2 r( x' Q' `, x# C
- w& M6 @! G/ C0 T: E% _7 B3. IAR下使用J-Trace进行指令跟踪
) ?1 a9 v2 c1 H5 q9 D8 e+ b- b
6 ^& \2 P5 W8 S1 {$ F$ ^4. 菊花链 JTAG STM32  @4 h- B, T. Y$ r0 @3 `: a3 I! D+ g2 N, [
- q$ ]1 d0 J: P, r6 |9 K
5. STM32F411CEUx 能下载程序但不能执行0 |2 x7 z" A9 Q

8 _0 A6 X+ Z' s6. STM32F103C8T6 程序上电跑飞
1 O8 p  f2 B( J6 J% l; m  C  T7 n# [+ z
7. 使用STM32 ST-LINK Utility 设置读保护后不能运行7 K, Q8 J" b" N# Y5 q* y

- O/ \  [! I4 B$ Y, K. {" u8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
( [5 t4 `/ O) L/ I$ B1 K4 t2 L4 O5 [  }- {: ~8 s
9. SWIM协议的GPIO口模拟
$ _" {+ a! |7 f) X, v0 C0 d& X: n9 D% c
10. STM32F091空片使用ST-LINK烧写后复位不能运行用
$ N& G- n- a, T/ m% c% A
4 ?6 z" D! K3 S- b0 _5 l11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)
2 K, Z7 z" ?& {" s# P2 U0 N" l. j  R  y5 @1 L
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)
3 R7 G( C9 @, y6 L9 \: v9 t0 W. d! z4 x, B
13. X_Cube_ClassB代码移植 (2019.12.24)
- b& f# c3 q3 L6 a; @6 c
* Z5 ?+ h; l& t7 X1 e# @: @7 w
' W8 p3 x# n' K4 v( v- J' |
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)
: e8 R. r0 C! M' a: l2 b8 x1 t+ B4 a# e% p7 A7 v
十二、人机调试
4 w2 e/ K& D5 Y' l
8 N, s7 n3 h9 `  L1. 一步步使用STemWin在STM32上开发一个简单的应用9 q7 t8 x( `/ \8 T; s. U

1 R4 Y6 S6 \  z( M/ U7 O2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计! @& a4 U& k; B! k* e( j

# F! J( ]) R; ?2 A# {6 }3. GUI方案中ALPHA通道处理介绍* U) y8 T8 @, Q. |" B9 o

0 F! ^4 H1 [% Z. t: M4. 基于FMC8080接口8位LCD的STemWin的移植! e9 E3 V* z% I: e) ]9 I6 u

8 `, h8 l# {& a) ~5. TouchGFX中Callback模板实现原理 (2019·9·12更新)2 p7 s; f& y, v  Q! [

: M, v$ x. h) K* O: J' a. E; a6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)
6 h) [* S$ V$ g& a6 s1 e" U0 `6 u& V6 D
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)
, {! F1 i) U) |; b3 K+ q" h8 u; ~' F5 \4 R
8、STM32L5中如何关闭trustzone (2020.5.12)
6 V4 n* O, W# S% b/ q1 ]* ~& S' o* d0 ?  @
十三、马达. ]5 y1 [) p+ j7 N2 j3 R& Q' x3 \
+ P/ _. _5 L8 _
1. 电机控制同步电角度测试说明) G! M; o% X" R9 G: k/ k8 D/ R2 p/ G

; Q& E# w. K% }' U' M7 V! y' ~4 I& K9 |2 A6 b# j: j
: E& ]; R2 |) n2 B
十四、安全" m* I' {  B% j8 ^3 [* s

2 g$ ?0 D( A, j* `) G9 C1. 一步一步使用STM32安全启动与固件更新(2018.3更新): Z5 R6 u' x4 e' i. L( X$ [

; D' ]! K: o# Q1 B( x, R) L9 _/ G: b
十五、其他4 k+ _+ z# @+ X* Y/ y* [# [0 y
. D8 U% o6 T7 s# |- |3 ^
1. 跳不出的 while 循环5 @( p' f) S) l5 q* _% ~
' F9 ?+ l7 g  P  I
2. 外部IC连接NRST导致MCU内部复位信号失效的问题- A% C9 b' K7 a
5 @+ U: T9 V: ~) s4 Q
3. 潮湿环境下不工作* |" U  Z5 n. a8 R, D; W

# d6 ]* i4 g- E, w: n/ B4. PCB 漏电引起 LSE 停振  q; |: k, q, d- j5 P+ n: h
" @3 C( @7 b+ c6 q/ a
5. STM8L152 IDD电流测量' w! R8 s, e/ j: x4 c3 W( `0 }
: v3 O" l/ Z$ o* E6 L" ^( t  L5 c
6. 使用STM32实现锂电池充电器; J9 I, Q& d% G) W* t5 A

7 _' K; b6 r) r1 d" t9 e& f* ]7. STM32_STM8硬件平台基本检查
9 ?7 P# g5 v2 l$ ^9 ~1 W# t
+ }' F# O) H4 N* E4 K/ }8. 验证STM32F401在STOP模式下的电流
3 e0 n' F( }& v  k$ D& G+ V: {  ^% w" [- A
9. P-NUCLEO-IHM001 电机开发板串口调试指南0 t- p- W# u/ w" }  S8 b- P2 W

4 z! K0 d2 H; V: n' I10. 一种计算CPU使用率的方法及其实现原理
: ]% X5 q2 u6 P% T
% `5 m7 P5 ^# C* c" d7 b11. STM32 RTC不更新原因分析7 V$ J: D+ \& y* X7 h6 V( z0 ^, v
) Y, g( ?  Q. P0 `2 H! E
12. 关于ST库函数的代码性能对比
4 r, ^6 D, f" G, H
) z+ B  ^$ R0 p  ~5 m. [" b5 c; M1 b13. 在IAR中实现通过将程序在SRAM中调试的方法( N1 e+ D! ~1 w4 v
2 S# K6 U4 C% ~
14. M95xxx EEPROM写保护配置
8 c5 f8 V3 m/ `* y$ P) k2 E6 U  ]
- g/ n5 r. L- m; W1 _2 H15. 4SRxx的GPO的属性! d) c/ s- }, W

/ f' U, o# F6 s16. CR95HF的初始化步骤
, D; |9 |! n! B2 Y. p6 z( R* q5 s$ h
17. 电机控制同步电角度测试说明  / N& X! P" D+ [0 q; o7 T7 w/ z$ a
' @- i8 _) z, h, S/ y, \( j8 V# f
18. STM32+BLE通过 Notification与 Android应用程序通信的例程4 J' H  e# V% x$ a% Z8 L; h

  R2 \* x" ]9 e( g  X19. M95xxx EEPROM介绍7 E9 |' s& C& z, i

5 L% k  h% j# C3 [9 n- [20. STM32 DFSDM测量温度应用 ; C3 v6 B# g* ^; C
! h" m; j: ^; o: A
21.代码实现PCROP清除" R) ]9 {4 |( i6 g4 ]
1 d( J2 L, q. z4 R6 `$ U6 e
22. 理解与应用MPU的特权与用户模式
4 ]9 n0 i. e, ?3 Y0 E- Y* M& a! d5 s3 Q$ v; ]
23. 用于电机控制单电阻采样PWM变形信号产生% X* [2 M/ e* U
2 U2 p' K* U2 r( q. ^5 ?
24. STM32L低功耗模式唤醒时间测量, T0 d3 g, t2 _9 E. s

. _) O+ E! [+ l- B$ k4 J" g25. X_CUBE_SPN7程序电机启动抖动问题
( a( H% J$ s$ Y6 W# K4 b
9 C; b' T$ p% f: e26. 发现STM32防火墙的安全配置
/ |7 y/ S- j' X9 t2 L' T+ {& z+ }* _9 G
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改7 `0 `6 c5 i4 [" ]# v

4 _: R8 n  M$ H; M5 a6 n- f28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
- c- f8 A# p' H2 ?7 H2 I
( }8 {% b$ N7 O! ~- _  j1 f
温馨提示:

8 q; R2 D. Y% U. r" L0 x
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
$ B- n* z! n- O1 u% }( p7 z6 E% n

+ z+ B3 j# H# E1 C' b, l- X0 _6 [3 r4 {9 F

) X& {  y" r6 \% `
. W( X' ?" f: p8 o+ M2 B
5 m: s$ ~/ s# Z
; m# T& E6 b! a5 w
6 y; x( G3 Z6 L/ a; Q9 h7 W& w& s+ A' }, t2 E0 x2 ]
1 o% A5 e- ]/ I) d

+ Z6 S7 ?! C2 p# q1 D& U4 h8 R5 F

评分

参与人数 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
好详细,多谢分享' e- ]- |- y% b$ Y6 o* r
5768340 回答时间:2018-1-13 14:42:54
HI  
, a  e# Y% W) t, a3 c6 @$ k   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:( b4 U2 D: W+ h& U: m+ Z
   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************4 L" Y  o5 m' W4 c
  2. 函数名称:Cdfinger_Bspspi_init# T' [% I( h% I, M+ d5 O: P' F% r
  3. 函数作用:spi初始化函数
    + R, h. Q" m, g$ n5 y, z* z7 R
  4. 备注:
    ! i& k9 w4 |3 j( Q4 q6 T$ Z
  5. ******************************************/
    $ g# h5 z: `  k. `$ r
  6. void Cdfinger_Bspspi_init(void)
    0 |& O7 a5 p& Y1 x! r$ X
  7. {6 r1 K. n- V* T9 i/ f7 @
  8.         GPIO_InitTypeDef GPIO_InitStructure;+ `4 M! n/ e4 Z" X  q" r
  9.         SPI_InitTypeDef  SPI_InitStructure;' q  z0 w- \  M& K. @
  10.         DMA_InitTypeDef  DMA_InitStructure;
    2 O: ]  O7 e+ o5 [
  11.         NVIC_InitTypeDef NVIC_InitStructure;" N1 @% v* n! `# L# }
  12.   
    " ~' d# i/ N4 f# O
  13.         int ii =0;# w5 f+ H3 V: N( L
  14.        
    , A  V+ W9 A$ f
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    , N# }: E0 E4 x& X
  16.         /*!< Enable SPI2 clocks */0 d: H+ H7 R2 N& m* g0 Q3 h
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);0 |6 A3 y5 E! P' I  j- `6 h  ~& {
  18.         /*!< Enable GPIO clocks */
    7 x, f; N- M$ u5 g; O; r/ u$ G9 a; Y
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    , i$ ~  O( Q0 H& c
  20.         /*!< Connect SPI pins to AF5 */
    6 S7 X' F2 _1 d/ y4 Z& p/ _
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    0 L6 S6 p) |1 S
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);1 r1 P& Y9 I0 I( |: y& }# u! s
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);, z" A! n8 K, w. ]

  24.   j+ e0 p( o* b! \
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    # C/ |* ?7 s: Y) `5 A; T
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    * n- O; @* ^. t" e0 ~$ X$ c! s5 I' B
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ' B' J% ]0 C, a
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;6 ^' P+ H3 N# Y. K/ c: {' M* W
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;* P( E5 X. J& v8 l9 _
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);* z6 @$ f3 T5 p6 s/ r; I& t# m
  31. % k+ h( \! r: J, E! P
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    2 `! ^; s& Z- k
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    $ e/ F& T* i) o) j) \! u4 |9 D
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    3 H: L% A: v# U0 r& J+ }
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    $ E# c6 q6 |2 j* N/ s& {
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;2 D" D) d/ r, {$ c2 @# m+ X
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);, o' c! F  ]3 P0 e) a
  38.         Cdfinger_BspCs_HIGH();0 |; ^, R3 `( L0 k+ ~; T+ o8 P; k
  39.         //Cdfinger_Bspdelay_ms(1);, i% X* v  G% S. f- Z" T1 }! @
  40.   //Cdfinger_BspCs_LOW();
    8 t( _: D- \# x/ {- E
  41.         SPI_Cmd(SPI2,DISABLE);" S6 F8 ^( Y6 \
  42.         SPI_DeInit(SPI2);0 q0 Z! a5 J# b/ f
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;" N' w) U3 h2 V7 n# ?! H
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;' }; x. y5 w4 M  e( z& `3 I
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    ' ?+ a% P% Q' J& D5 R% k: ]
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;0 l1 ]+ t6 l0 f$ l
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;- _/ |3 u0 }/ s% @; v
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;2 m$ Q- s7 K2 u5 f8 |2 Q
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;1 }+ j- x9 |, [( G3 K
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;8 e( Z6 ?6 ]. B* e9 ^' K
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;0 D1 E; F" t8 }7 i, r8 X
  52.         SPI_Init(SPI2, &SPI_InitStructure);& ^; }  M) ~7 R  n+ U: ^
  53. & c  }; V9 k* M  L4 J
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    / _8 d2 t3 I0 Q3 F: n5 A9 n2 y
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/2 B# F8 ?) n- D1 s5 E1 F  s
  56.         DMA_DeInit(DMA1_Stream4);
    8 q/ a6 O; S! [: ^% l
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;8 H/ S' n. F* z% Q8 u: E+ @. }$ m
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);9 p6 J" F0 Y: z( f+ J
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];+ t9 `( B; j6 {1 V+ t4 S
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;8 s& k( u; W- e0 Z! W" N. s
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    - s' e' F% s$ w: z1 [  u
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;* O6 \+ J8 x+ d. u% ]3 T/ I, R
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;* O3 \" x( F5 S8 ^) K
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    / H* V' ?6 p( O6 ?, f8 \4 k- o0 v
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;8 [/ t7 V8 S: g+ W- `! A
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;
    + A0 V, r# }/ @, ^4 h
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;" y% s0 ?3 n% L- \& D
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    & e. S# M6 l4 c: Q) Q1 y
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    0 ?: e, f. |. z0 K: n/ Y) [* ]( i
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    * J. F! O4 K! Y6 ]( K/ f
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;3 ?, [; s" j1 Q# V; o+ q
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    ) ?1 C% ~+ E9 X' e2 M
  73.   
      r% l+ F, u8 n+ o
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/! n1 h1 N, `9 N9 F
  75.         DMA_DeInit(DMA1_Stream3);
    7 u5 D2 w. r; P! W0 c' t. q- L
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;$ O/ }! [5 L5 ?- ~6 |* b4 W/ \* e
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);
    8 d0 x+ `* g5 R& R9 g
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    # ?. ~$ i, O  H2 b
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    & S; ^3 Z/ R4 [" _, j1 t1 f& w' c, `
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;5 k/ s4 b/ B6 V. o/ ]$ j
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    ( c: J7 N; A; J8 H/ k8 w0 n
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;0 y& @, b& ^, H0 M& g: }4 _
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;5 C( }0 A: [, e
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    ! u$ k4 i5 K$ }
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;' {* A2 f6 J$ c
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    9 l) k2 N0 {# Q8 Z, D  |0 H
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;0 ^3 u: k  O! N- P" X# \7 ?
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;( J% ?3 z' T* g& e( @+ E
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    / S, T) I, }1 i  e( e, l
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    3 E( F5 c5 N2 A: f
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    + |( l' c% |$ p1 U  R) j
  92.         //Cdfinger_BspCs_HIGH();
    1 J7 S/ a9 I0 F3 i: r& Z
  93.        
    # w' V; I* {/ Z; d8 x

  94. % s9 P3 l/ ^5 O

  95. % V9 ]* s. |( x
  96.         //发送中断+ A3 O! J, y$ l, R& n5 _/ D( n
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    , M# ]1 F- r6 B( N
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    1 K" v! {4 k* y# r+ G1 I
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;7 ~( [6 {, U: X# q  V
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    6 J4 V* G$ g% [6 Y2 J
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;& I' M. K& `, T/ {& f
  102.         NVIC_Init(&NVIC_InitStructure);
    + n) W- ?( `! y% k3 H1 {. |: ^
  103.        
    4 x+ s6 z3 N9 E6 E
  104.         //接收中断
    3 ~' y2 d9 ?' B* }7 I3 ?$ B
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);% B4 a. d$ r7 F( Z* U  m
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     ) b2 B/ y% N9 U
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;4 ]7 t8 l) b# T: L
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;8 j. J! k! o# R4 S) a0 F  h2 A
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    9 r+ z* B) O5 ^$ u  E
  110.         NVIC_Init(&NVIC_InitStructure);7 l9 W6 {6 X3 {$ Y
  111.         SPI_TIModeCmd(SPI2,ENABLE);
    ' j% b' S0 K0 [
  112.         SPI_Cmd(SPI2, ENABLE);
    - i9 f9 S2 I0 w/ N
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);) T4 Q* a8 s4 c& G& J
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    8 l; c4 @9 E9 P1 d3 t4 S( }2 a. |; `

  115. , l- D, H6 ]% S" F
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    ! d* S, [& `- `- G
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    6 {5 S0 E. q, j: J/ K, l& F
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    ! z" ^3 S) `1 k

  119. / r8 d% M$ \/ Y. E4 y
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    : C9 ^% J7 K9 Y8 J; A6 Y( X
  121.         {* b+ |+ B) ~: P8 ?# w8 @; B! ^2 q
  122.           if(ii%8==0)
    : N2 |$ c2 \6 m1 p2 s
  123.                 {& S" U) g0 P" R: D$ A0 J5 M
  124.                                 printf("\r\n");' c; v9 p9 Q( {% e$ R  D
  125.                 }
    1 o' q' q4 Z3 H8 r* `1 R- N
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);
    8 K7 }9 j. X5 R: C  o- r
  127.         }; F/ X6 g3 l/ d. v
  128.         printf("111\r\n");
    ) `4 M+ p& b7 [& X& r4 r
  129. }4 y3 k. b6 I/ @
  130. $ h/ b. |9 k9 T1 j
  131. % ]) C/ k$ B7 u7 y' {4 O
  132. void DMA1_Stream4_IRQHandler(void)
    ! i$ ^" z; A% j  s. n' d  Z% w
  133. {* @$ h  \' `8 S4 \$ M0 @, N' y3 Q3 ]
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)% t2 N- g1 N0 _  B, c* w  M& c; t& z+ C
  135.   {
    * Q1 }) \/ j4 ?- M: D! L7 c5 U4 O
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));1 Y& L& j! Z; T* o, E' B* }& I
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);0 I$ n( o+ T; [7 L
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
    ) d$ u* l; r# E/ _, m- A4 Y7 G% Y
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);7 l$ b" K9 q; ~$ ~6 _- o
  140.   }
      ]7 X) b6 d2 H+ u% d* X
  141. }# L, z9 x9 D" v6 t2 Y/ v

  142. 7 N8 j& {4 H3 T, l- L! h
  143. void DMA1_Stream3_IRQHandler(void)
    + \8 {) |' X9 o/ n" P: h9 E( s) c
  144. {
    3 d6 y4 [, [5 _/ x* q
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
      W( G/ G+ o1 c' W( U$ b1 h; n, {
  146.   {. p( T, Q) d! j( ~: ^/ E$ a- {. w; D0 _" s
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));" n5 I8 F& b! X& J4 J& k2 Z
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);/ ?% S3 L- d8 g3 e2 b
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    + U4 k9 v4 k- C$ t  n
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);$ `( E0 p4 T' s  I/ g1 O
  151.   }
    ' t3 i; q: W  F  [; ^1 [- k4 B/ [
  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的波特率是不是必须为相同的,才能正确通信
5 S" @# k+ i7 t" z& ]& g以下是全部代码:% @  j; _4 c5 E- `% l* V
#include&quot;stm32F4xx.h&quot;
0 ^. I+ V6 U  k/ T% k6 A1 I# Rvoid RCC_Configuration(void);
0 B* g& `5 k5 }% p/ O- f! d! vvoid GPIO_Configuration(void);
" |% a$ a! S4 yvoid SPI_Configuration(void);2 p: `7 {- P/ z2 D) P
void Delay(int nCount);
$ `. E$ }! S3 Z+ Uint main(void)
1 J6 O; X4 |7 u9 `% }$ |{  RCC_Configuration();" U1 n8 _6 Z1 G& [5 z0 Z+ X3 x5 @
  GPIO_Configuration();
2 n1 N. e' R: X$ f7 u2 R, @  SPI_Configuration();& a# U. U8 o8 S
 while(1)& x( k1 u- t+ I% ^7 @
 { int data=0;6 H% }/ |. {& t" K  o2 ^9 L, m
  SPI_SendData(SPI1,0x55);
6 }; H7 l  b1 r/ o% q- F% H8 t  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); ! l* }9 A* d3 Q9 y
  data=SPI_ReceiveData(SPI2);
; O+ t+ X7 S; z; M+ l  if(data==0x55)  y6 T  _/ Q  ?) u0 y3 c4 }
     {  while(1)
$ N9 }4 V& w  h. ~% }  q             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
/ |% L9 Y! o2 p, n' t/ X0 m4 \* D, y                Delay(0xfffff);( @* `5 |6 E' U
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
) w; u3 M, ~  h1 R5 w                Delay(0xfffff);! ^; }: X9 L  ~6 Q$ ?' W
  
) j) A! k( I+ Q             };  O- Z- u  ~4 t' ~1 k! f
     }* n/ r# z3 G% \2 f# W
     else while(1)
, p: k$ |9 m+ Z2 _6 d4 f            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);1 G, X0 Q9 F" Z; R
               //Delay(0xfffff);
1 N) f% [4 q1 }, M6 a0 }# L               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
% {3 C; g$ n) b* f5 l* O/ j. B2 p6 R               //Delay(0xfffff);- G7 ?4 `9 \2 S% t" Z1 D/ G
   / W+ N9 C4 o  o: O7 l# D9 ^
            };
2 T1 h/ P, ~. A3 d5 o+ a/ [ }
  c% [9 O6 E  Q2 n9 a+ x  N8 T}
! ?3 b  ^) P; Q: f! qvoid RCC_Configuration()3 K; g4 Z2 t9 U9 L
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);! J6 r  ]2 B1 p" p
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);; P* }, r7 E" z  S! F" T6 @
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
. B9 j) I+ \' M  r- @$ G9 D5 C}4 d" T; U0 r8 d6 w
void GPIO_Configuration()+ }  c; @0 e) E2 B, N" i
{  GPIO_InitTypeDef GPIO_InitStructure;# l! m: J& f- z) ]
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
6 q0 l1 S0 t4 G  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
6 d: N' W* @8 D5 B  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;. C- p" V- _( ^4 q- A; u
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;9 \- K$ G3 e9 B/ I! G: S
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
( W3 I2 C1 j' r. }. N  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);' d( ^" |6 S' u/ N+ N, t
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
4 \& e% |; R% z0 ~+ ^' U9 I  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
& E- m! g3 a' D  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
) \  {  _# w! f5 I: ]. n9 t  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;0 G3 A2 q! ]9 u0 ~4 Y3 O
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;7 \+ B3 h( N1 y. f$ s3 H$ K
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);/ ]  k- G2 i/ q2 f. z* P
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
9 r2 `) U. p+ m6 p  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
2 |9 _( U" f. e, O# w9 @: K  Z. N}2 \; J  B) L' @
void SPI_Configuration()
' }$ S7 U' U" A6 Q4 Y7 G; }{  SPI_InitTypeDef SPI_InitStructure;1 j. i. d$ c# \/ t
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);! ~% K( ~" `! v: k$ E
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);$ U8 N- d3 [/ m0 z6 f
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
; l* \/ b# e$ f- ^2 O   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
" M) c) H" z3 U/ S3 X' H# W. N  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);% n  f) F' M0 V. |9 X
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
3 G+ w. n7 [& Y0 }2 C3 ^; f4 r  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;# X5 m. r$ D( A8 g
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
6 |9 {3 g% D9 ~9 L( m# K$ S# h  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  r; I, b9 M0 Q& Y  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;6 F% o+ i. T: a1 k4 ^( d3 J& ~
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
8 L  S# v, }8 t: I& w8 u( ^  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
5 Z7 Y7 N: A  e1 ~   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
6 f) }9 u( V/ H/ W" \& j6 ~   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;) A# f4 W0 o- Z4 {: o$ G1 u
  SPI_Init(SPI1, &amp;SPI_InitStructure);/ s) Q( q1 I+ Q* ^: b, s3 |/ b( N5 h
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;( d2 ?; Y+ t" ~6 a) X
   SPI_Init(SPI2, &amp;SPI_InitStructure);( U' B+ R4 N% E* y3 p
   SPI_Cmd(SPI1,ENABLE);" X4 P" {) g5 K" |
   SPI_Cmd(SPI2,ENABLE); 
1 a; U1 w- X, m0 b}
- C9 v: C# k/ bvoid Delay(int nCount)
3 C0 k7 C0 N7 I4 ]. H5 k; E) x' m{ int c1=nCount;
$ d5 ?- g5 w% e( p2 b! c int c2=nCount;
* L- [3 P5 l: i' j+ z7 L for(;c1&gt;0;c1--)
/ Y8 J( ~3 y1 S8 k, d  {- S, T5 P' d  p9 Z7 r" E
  for(;c2&gt;0;c2--);
% ?: G( U* }& l1 @" ` };
) I8 w" I( D( v) s}0 G- e1 |, m+ }+ J* t
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:
6 r. R1 m; k; n6 g楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信5 u& l3 K9 b6 F2 l  a+ D1 P4 H; f
以下是全部代码:
& u7 K$ H- G. j" J" }#include&quot;stm32F4xx.h&quot;" v6 ~3 W  e9 v+ Q& m5 M8 V* w
void RCC_Configuration(void);% L8 m0 \* }* h1 o' s/ C
void GPIO_Configuration(void);9 @8 y$ p, ~7 [/ d4 _* a$ Z
void SPI_Configuration(void);
8 v/ B# i- h" r. Z, t% B, [void Delay(int nCount);9 b: H/ D# e  ~1 Y% H2 D) i
int main(void)! E6 o8 i: v5 z6 n' a
{  RCC_Configuration();' q8 B' Z; Q- ~# P
  GPIO_Configuration();3 [3 G# s1 C) c/ e4 v
  SPI_Configuration();" U/ \7 N! `  R! ]" [5 u
 while(1)
* q% J3 u/ o, k1 S1 c/ `5 C { int data=0;) E8 F% F. |: @
  SPI_SendData(SPI1,0x55);( S3 b5 m- [0 A# A% y7 Y* K6 \1 h
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); " ^1 f( p( H5 X! O
  data=SPI_ReceiveData(SPI2);6 [8 M& E9 D* m, |- |$ e' T, H6 c; ]
  if(data==0x55)  d* P! @# u6 d2 L% _/ J- i8 I7 H
     {  while(1)0 _7 \; g/ N' g+ m. y9 P( d
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);. P; L' A, E% x' @4 T
                Delay(0xfffff);, b' @! h/ G! D; m0 K. a
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
2 ~2 j3 O# |. h% Z8 [                Delay(0xfffff);
* U, a' x: W: `3 P( `1 c7 J   5 b! C" I1 m# ~2 ~2 h; O
             };5 J- c6 T; }# |: J* v. f
     }) k6 n* L5 v' d# a$ e; M0 }
     else while(1)4 Z4 J8 c( p) `
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
. @% g$ }$ X4 z               //Delay(0xfffff);
8 I& ~3 ?) @8 S               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);/ _1 _) p! f8 {& E0 ]
               //Delay(0xfffff);9 o3 m. R5 M- L" r6 G
   : x, ~5 b/ {0 T% X" E- i9 u6 D; s
            };
. b; `5 w$ P! t' {5 C }
9 n9 ?, `! u5 h5 @2 }}7 S$ c8 R( e# b  w* x0 x
void RCC_Configuration()1 w# t5 r& {( J5 b9 H1 z5 i
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
1 P+ j5 V( T& X$ d  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
' L1 T( ]9 r2 c7 }  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   ! g2 H$ x. Z* J; c* \. B- |
}
! i% O* n! D' `) r1 Pvoid GPIO_Configuration()$ i' L2 R/ z& f! P9 r
{  GPIO_InitTypeDef GPIO_InitStructure;  e& I7 `- V  ~% i5 f5 y! G1 z
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;! Q4 I5 D2 R% C6 C* @
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;- F/ [; S/ W  B9 J* V
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;" m, H1 g2 Z3 J# V
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;  q" Y+ K, [. W9 b
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;, L. b$ y5 H& R$ B/ H4 V6 z) g& @
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
/ g4 G4 v1 E& u  E6 j  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;- b! i2 Q- l5 H' E$ o4 I
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
3 ~, |7 @3 k3 A! ~! z. \; U9 F) i  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;+ _$ j/ U3 I  h4 p* |
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
! j  q/ B& @/ A1 e  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
/ |3 |, H) s8 p; `% y% z) E; O  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
" @! N0 o- a$ N3 ^9 ]& m  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
! q" O& |: l7 |  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);6 u3 t* i- X) P1 E+ T3 R! A
}' F* c: M: ^9 u  g& Y. t
void SPI_Configuration()- V: \6 s7 L; I+ q. v6 A& j5 @1 V
{  SPI_InitTypeDef SPI_InitStructure;
' z: H+ P8 ~, q1 k6 Z1 ?. ?  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);( x0 }: \# Z4 b+ o
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
. X& K8 ]. z7 E0 s8 Q3 V  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);) y' [% Y. `) V
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);, A0 f" C- }/ {1 K0 t5 P
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
( U6 l6 Y* u9 T0 m& K  i$ P  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);) d' N3 I3 E7 z. N" G- N, G3 Z
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;' f8 U3 r2 d1 }5 T7 z5 j$ G
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;5 {# L/ N) {" ?! }5 I( D& M
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;9 ^' z. d. X! Y2 H* [: K# {' ~3 o6 ^
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;2 Z1 I+ k! B# }/ T
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
- c  N4 e! C4 h* _% T  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
0 U; Q7 S2 A. r) @   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
! f2 y) j/ U1 }5 z   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;: [* U7 l9 q) K1 d0 j2 s8 `
  SPI_Init(SPI1, &amp;SPI_InitStructure);
0 s3 V: B( y6 S1 A0 U) ]  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
! S4 H% ~8 e4 \1 ~  y- H6 ]+ V   SPI_Init(SPI2, &amp;SPI_InitStructure);
: Q  v* m- h+ K   SPI_Cmd(SPI1,ENABLE);
% D/ r+ D. {" ^5 Q+ H, M& d+ v0 R   SPI_Cmd(SPI2,ENABLE); . ]' ]! W/ f6 p+ a, @" L/ H+ M! d
}- }" B( Z+ f  ?) ?, W) j8 @
void Delay(int nCount)
9 e& m, w! F' z( I( I: m{ int c1=nCount;
! c* E" S7 g, O% P8 Z+ I, U int c2=nCount;
" h+ c, g) \% s) l7 e for(;c1&gt;0;c1--)
# O$ s" ?9 j' K4 a3 ~) c  {
  |1 c+ l& Q6 l1 l( z6 Q  for(;c2&gt;0;c2--);+ ~7 l0 H/ X6 |  F& b% o( L/ X
 };
* O( R: {% T  Q( D}
5 J- `$ _6 Z1 [4 X: a先谢谢了~~+ i/ j( g; T$ ]% Q% h5 U" s
 
" \& _$ r8 k, q8 O
4 j; Y# a# r' i6 r楼上的问题,看我帖子给出的提示哦~
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发表:: G) u" c+ S4 B( d9 w# N" }# @7 b3 v
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。7 K- F& e3 t% e2 l
 
" b/ J0 l# W  X" `# p5 J! j% \* ^; P1 K
# Y' [+ m% v2 q5 ~! o8 y/ l多谢支持!!
abner88 回答时间:2014-3-9 13:43:20

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

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

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

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

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

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

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

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

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

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

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

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

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

  
6 N4 e- \) e$ w$ B! F* r$ z& g鬼魅一样的Hard Fault" }0 X  e0 |( u7 l+ p
 
' E. z) g" C: D7 {% A- `) X$ D6 g该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。& z: q- s9 K% r8 @$ N  ^+ I! A
 
0 ~# M! ~$ O1 {咋解决?
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 手机版