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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
9 C! C$ }; C" l' `! X0 L5 x' B
: R& _7 h; D0 [7 S5 D; t" \1 \1 h# f, I. Y7 U: n+ ~( V/ Y- ^
社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
5 ~4 S, T) g' _# t' p" t+ Q* w+ {
9 t+ ~/ [& n8 h: O. L% N提示:点击各主题,进入帖子,可下载ST工程师解答详请
0 N3 B& j$ u3 Q  M 0 g  i2 A) ]% Y
$ {; R5 ]7 \6 F
一、通信接口" G: X0 n7 @, [! ~. L3 A

. y2 _3 e4 l6 `: o. L1. STM32F2x7_Ethernet(FreeRTOS)驱动更新
5 D4 M4 A6 p+ X& N' k3 g ' P& t7 b- e8 ^0 o; [. s
2. SPI 接口发片选信号导致死机
- _7 Q- m4 @  b7 j( l
! i, u; m0 o  O2 }% f/ i3. USART1不能设定600BPS的波特率( [0 e% E4 f3 H) y# H# c
' p$ w) Y' S3 f6 p
4. I2C 接口进入 Busy 状态不能退出
2 l3 s% l$ m" i9 g 0 l% D! h1 h1 {6 E  ]
5. 对 Flash操作导致 USARTU接收丢数据
/ c1 A. A& Q" r* U' H
$ @2 q6 q- E, {' z( }" v. G6. USB接口易损坏2 r7 N* J( F" G$ x+ Z

1 r# g) V6 E6 T/ |) ~/ K7 n7. UART发送数据丢失最后一个字节
# a0 Z  F( {/ I0 g- T
; t) ~/ t6 @; f! K. X/ j/ b8. 使用 CCM 导致以太网通信失败) x) q% m$ ?/ L0 B; C
2 q2 O% e5 b: F9 l+ X7 j5 W6 M
9. SPI3 接口没有信号送出+ i- J+ z) _/ Z3 P

6 Y% r+ r# A3 ~, l5 ?, e10. 时钟延展导致 I2C 通信不可靠
. J6 K7 K' Y4 O7 m
" L2 e$ z: l2 P% K4 M+ C- D) Q7 Z11. M0的USART波特率自动识别问题
) j5 G6 [3 r7 e  ^& G4 A4 m
; R: l1 E" y0 B; r12. WK15 OTG做U盘主机兼容性提高
0 I6 m- ?2 C6 D8 ~7 `& h9 j- o + q3 M7 k. _# q% A
13. 以太网电路设计注意事项
9 \" V: [3 H8 q* S# F2 V
2 v# I1 G, p# B% Z* I14. OUG主机库在BULK传输上对NAK的处理
. k' C3 i* S" v
3 f0 p0 v! N' i. Q6 Y6 u: C3 \15. 串口断帧检测; c# V$ Y9 y% D/ l
5 y$ @* T. O! k. H# D
16. VCP例程用于数据传输时丢失数据的处理8 `( _4 U9 a" H, E& j; a! m

& A. ~& w, W' U- X( I2 p" @* K2 v17. STM8L051F3P6串口UART数据起始位判断的问题% i% C# f) j6 b" s7 j. M
1 G: D  O& g' G; N
18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号; R/ P6 x% ^4 Q2 u; U- T$ e* L0 h
& m" R, V) n# ~8 {4 T
19. STM8中UART奇偶校验的使用方法
, d6 D! X" Q8 z' G% p! s9 E
- d  `9 H1 Q; a+ f20. STM32以太网硬件设计——PHY  Q' l. r  P4 P1 s5 i; h4 P

- C) o3 Q2 S$ [: `3 {* ^; M21. 一个判断I2C总线通信异常原因的方法. m/ H. t" V+ P7 M& y0 ?
% l9 S9 e$ t; Z' `/ G/ p
22. USB device库使用说明
% _* c! S$ v- u  s1 r6 H( S, G* m2 b* N' p- {: z
23. STM32F103上USB的端点资源
; v5 t( V( F" s4 o! y
# e2 K9 Z9 L. J( r( o24. 使用CubeMX生成TCPEchoServer程序
7 \3 R- s0 d4 v* ]3 ^# f) a( g% l+ V8 R& c
25. SPI接收数据移位
  X% `1 p/ t8 A6 [* ^6 o, J0 D3 D % F" s, N, m' i* |( f8 p3 ^5 L
26. STM32F0中Guard Time的设置
! Z1 D; j9 s9 ]+ c% o5 `2 L6 k4 K, {, l) s. A
27. LwIP内存配置2 a1 `" _; n" n! V3 l

0 H0 F; w4 w9 P8 f2 S4 q9 [28. STM32 USB Device的简易验证方法
' B. @, Q  X" E3 @4 I8 `) n; Q6 n3 h7 ?+ K
29. USART 中断方式接收无响应问题的一种情况及其处理方法& G) L4 t, P1 m0 @, e8 [

, x; b4 d$ N; `6 E30. STM32 基于 Nucleo板 CAN总线的建立
/ r: z7 s8 ], d
1 q  k  |9 d9 F1 X* c1 _5 ^31. STM8 CAN总线的IdMask模式的讲解
6 I' y( V2 o2 f- L* Z6 `: i
, [- h9 T+ t& c9 Q0 _' ~32. STM32F746ZG USB 驱动不正常 " M* r* B7 F/ {+ U8 c( ~" G4 K

( E; w$ x- B9 M/ ]8 @7 a33. MCU在STOP状态下通过UART唤醒分析 # p" B5 s8 _( l6 b. n5 q' @2 F

; I9 g& b) y* ^1 B( {34. 通过STM32CubeMX生成HID双向通讯工程
! w3 Y; p& R/ c# [9 v
& N/ p1 L, v9 v( G- Q% Q35. 串口工作在DMA模式下有时接收异常
! w" M8 h+ Z5 B$ \
6 i+ i: X8 o# @, P* {- Q& `' Y+ n36. STM32 Bootloader中 DFU使用限制& Q  c' `- c9 X- E* N0 F' j# ^

1 c6 J0 b! }$ g0 i3 `! d/ g37. UART异常错误分析
% n. j! v' [) K& g! o& e7 O- F; ]7 Y% P$ x5 j; W$ V
38. 基于Cube库无法检测CAN2的接收中断
. m) z/ I0 c+ w6 |! M
1 }4 E" _2 T1 A# H1 B39. 基于STM32F7的网络时间同步客户端实现
/ @& m' {/ B& U' i. l: p/ x9 u/ x% n) {5 K. M' J
40. HID与音频冲突问题
. J# h  _6 u/ M1 _3 M* {* o3 o9 @8 q" Z/ P* x  T6 a
41. 在进行USB CDC类开发时,无法发送64整数倍的数据( S4 C$ m1 Z4 p' m& e- c
! H% g) S  A+ t% \! v
42. 从零开始使用CubeMX创建以太网工程1 q2 @6 S4 D' n! }1 U) {* D
: O2 d# d: N' T1 p
43. STM32F4xxx的I2C总线挂起异常处理4 M! Z5 X- U- F+ R1 C; N4 c/ S
1 ~+ q, W  ~7 ]* L/ w
44. LPUART唤醒STOP MODE下的MCU- e, V" v: i8 U$ |2 M8 p5 S
% p. {- U  P. }, s
45. STM32系列 MCU模拟双盘符 U盘的应用
- H# m8 {: X, i* v2 h6 Z, J# T! V) C: B9 c  o% e! c% ]
46. CEC输出的数据和数据长度始终不匹配( [( K& D: I: e

/ b- t; Q$ b) d, }4 Z47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析( [0 f3 c0 X, d% b7 f/ \. j" l
! ]9 N3 p, Y# v1 K! K: \
48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)7 [) \% O. p! \

1 A( B  [/ T& Z49. 增加UART接口应用时的异常分析
3 D$ f% S! a% x* i4 ^. C0 d
8 ^6 y6 o' f: m  E' Y% n50.UART应用异常案例分析! b- i4 l9 w: Y1 V9 _
6 B! Z* l+ G1 e# E9 w# [) Z# K
51. I2C配置顺序引发的异常案例* O6 j8 i' ]2 C$ A
, Y' e& `( Y! y' P1 l
52. STM32 USBD VBUS GPIO+ @# \: G& j6 R; m: V3 L

7 m; q* \- W# I1 P53. USB传输数据时出现卡顿现象+ }" d1 A( e. c

6 y2 b( T5 T5 k54. STM32的高速USB信号质量测试实现- ]  V" R3 A, p: h0 l

' `  z- B5 T5 n3 M55. 基于STM32 I2S的音频应用开发介绍
! ~. \0 }; Y' @/ [0 A+ ]$ l
( k! s4 J2 u% Z; r1 j& W5 i56. HID_CDC复合设备在WIN10的识别问题  
& ?, c- T( j& l# t& j9 w  w0 w# x, W4 @3 s2 F* z9 k7 h
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  * n, {- b9 y* [2 B$ U
& P5 R% v2 u# E
58. 一个关于LPUART输出异常的问题分享  $ Y- `  \9 n; L

* \+ K* X5 |4 o. v1 F0 C% d59.通过 DfuSe 工具控制程序跳进 DFU 模式  d  c' {( H% y* ?" S3 k

, u; K  v& f0 I/ U60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
. R6 d/ R+ b! w( ]& }% G* Z5 K
% X- \4 H) k1 N
61.一个因初始化顺序而导致异常的话题 (2019.12.24)% V/ B: S3 r) {, H3 d1 w3 W

3 I  i& Y+ n. ~& m4 Q62.MC SDK 5.x 中增加位置环 (2020.5.29)
9 e. d5 [8 Z0 q- s

9 O/ E. {# Q& {' ?* O) u63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
4 X; @% ]: Z3 a/ b3 Q7 v
9 {! b9 J3 u* Q; z. t+ W64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)1 {! F1 M" `+ v) E% M/ f

$ I( O- n/ ?) p  c4 C! y  L二、电源与复位
8 _  J* u7 W/ H  I2 Y( h, Y ) i) z! K# S- q2 D. E! r" t- N3 r
1. Vbat管脚上的怪现象
/ p# t" {6 K& y1 `- y3 v5 M; | ' A% G+ f1 C0 o5 K9 d, o# e& A
2. 上电缓慢导致复位不良: l6 L- g4 F1 q/ \1 R4 v( A
6 M3 X2 m+ F  c3 d( |  F1 D
3. 关闭电源还在运行. |- w. a5 J( |8 E1 Z5 H/ I
$ ^- l2 {& `: f  m: y* b4 m2 T
4. 使用STM32 实现锂电充电器4 I) m: V% T2 E  E: R5 w$ M" w
, l8 D4 K# p) z) |
5. STM8L152 IDD电流测量
) X; k$ \4 H. F9 w9 K
' {- _7 W* y3 g& U4 k, w9 B% R6. STM8连续复位问题
* U/ w- R) ]" x0 ~. P" S8 x, G & v7 g2 X7 r% k
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用; L; x# i3 X5 ~1 v# E; V' }
. P" }" h( v% @* T5 o" W. a
8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流* G5 F8 S' `2 g8 b

+ z4 i: ~" a5 w5 W: s3 m* m+ p9. STM32F7与STM32F4的复位序列比较# z' U& u' l( C& _' Y* X/ K; e
3 x1 Q' J4 L9 J
10. STM32F107 复位标志问题
. e1 I. ^8 n2 L' T# O
  A7 O5 {2 j: L9 _2 X! @. Q, h11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  - @- L. X2 z- C

) X9 a9 t+ [7 Q4 h: h. A 12. Nucleo_L053不上电也能运行
; k6 Z; D8 A. Y* @1 N
% f9 Z. F8 k, ~: ?' K13. STM32L4中STOP2模式下的漏电流
0 C0 Y/ N1 l& f; y3 m6 J1 H/ ?) v
14. 在没有外置晶振时HSE_RDY异常置位# {% _* E( r. ?) S( F. M  m3 p
2 @' y$ I7 c4 m, J8 C( [
15. FLASH被异常改写   (2018.5更新)
6 |7 d* v* T6 A. F' o
1 g9 ~, N7 Y" b# h1 t6 ^5 b16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
; ?' P' [: E; N$ ?% T- U5 L% W3 z2 G+ H* \
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)+ x# e( g( {) D9 N+ |& [

* P" m  T8 ]4 G! Y9 e三、IAP和Bootloader
7 `, h. \0 a; {5 Z( k' J! l
) X2 g% z! x% Z1. Boot Loader与上位机通信不稳定# E: |: J' `+ F  C

% N8 I# B; E: A1 I2. IAP+APP 模式下不能启动 RTOS# ^% v* e, Q, d8 e6 }

2 }- d5 [- {3 C7 _. G$ h3. 从 IAP Loader 向 App 跳转不可靠' B  Q+ i; c7 K3 M# j  K9 C
% I# R; t3 s1 {) r3 L4 C: }
4. STM32 MCU IAP例程跳转到APP代码简要分析/ B+ E) }2 _: q4 K

+ {9 o3 F: e2 Y' z5. STM32F091从自举程序向应用程序跳转的问题与解决- e9 K9 ?; G! t, Z! Y& q) |
2 [) \/ w; t! g1 l% ~- Q
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
- H' h; F2 y" j) i+ C3 p3 E5 B( p4 \) ^! X0 g6 l  ?' O
7. STM32F0启动模式相关问题探讨/ l3 ~8 V# u" X* S5 v1 b& s

; y+ P; q1 S; f5 O0 p& l) V8.STM32F091空片使用System Bootloader下载代码+ A$ w$ `$ g+ y. g

7 W, z/ x- u8 g+ N" j9.STM8L  IAP 应用程序中编程指导
' w+ F4 ]* e/ _9 l) |# S * L! g8 q0 h3 c1 w
10. 如何通过STM32的串口实现简易脱机编程器) O9 s" P4 q# M; d
% n( t' @3 ?0 d
11. 一种从用户代码调用系统存储器中Bootloader 的方法  4 ]5 J& |7 V  |& y
7 V& m( {& |+ H. v
12. 利用 USB DFU实现 IAP功能
) [8 m1 a( X- s
8 V; w+ L) }6 D) O13. STM32 Bootloader中 DFU使用限制
/ f. i/ l8 [8 c" C6 G* {$ Y
3 H2 i) a. a: T4 ?# ^3 Y5 ]! k. z% o14. STM32L011x和STM32L021x启动模式注意事项
5 b% L& r: h/ M2 J0 H! G5 i0 Y: n6 r9 i: f4 R
15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
6 [, U0 |$ f7 A) _
' T/ y( R) D& ^) e  Q16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
5 A) V$ v* [7 P2 s6 D, N6 o
- R6 M! l7 J' q17. 如何使用STM32NUCLEO 板来测试串口Bootloader
& Y6 y- U. g, {6 H  T/ f
: n6 x6 y2 E' A( B6 V9 V+ w5 a- _+ `9 L18. 在STM32L011上通过I2C接口实现IAP6 O; g6 J2 ]$ W$ t2 N- [
8 p. A3 X' w: X4 n' X6 M2 }
19. 在IAR中实现通过将程序在SRAM中调试的方法
  l4 h: ^( R- }+ A' a: x& @
, P0 E; K9 D1 B1 @2 ^! X$ \# \; |: R20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
! y- ^' ?& B  K, A( I+ g3 U9 t; a! J1 g/ w
21. USB DFU IAP 例程移植的两个话题2 Y) H; I0 u. y, p
7 v6 L( ~+ N# d/ V/ W* Y  X! N
22. STM32F769双bank启动
$ j4 W  z, [; x5 o
% ~2 a% @4 y# m) N* p23. DFU加载 工具 DfuSeCommand的使用
5 o1 D3 w- \$ G$ h. E: h/ a
# x# ^! N* h, N9 F24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
" R: `5 o8 O" _+ H! L1 A' I* U3 i7 a2 m7 V" L/ n
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)6 l5 s7 E: \. T5 Y

) f2 u4 t- h( T' z9 A5 S# J26.STM32 Bootloader异常复位案例(2019.4)) x  ^6 g) F, c$ E5 ]0 k# g* @
  X" `* O. X6 Z% q( ?
四、存储器& m% F1 y6 o5 ?; h$ l
: N7 R5 N! j* s% A
1. 对 Flash操作导致 USARTU接收丢数据0 N2 i& w7 S, z6 t6 w) G/ g# B* |5 ?
) R% X  Z9 q* a, t! [& _5 p
2. 使用外部 SRAM 导致死机
6 b9 F3 x) Z' k3 I$ |* ]$ y ) T. a0 t5 s  l& K7 q* o: q
3. SRAM 中的数据丢失2 H" s2 G/ b2 c: l; G& @
0 O" u8 _" _# D
4. 干扰环境下 Flash 数据丢失
: M3 \5 f3 x+ z. u0 l5 E6 W/ Y0 C
0 q+ k1 e+ P+ d3 {; t3 Q5. 使用 CCM 导致以太网通信失败3 q7 r3 h1 |. r( L7 \

! ?2 C9 D/ t) {6. STM32F429使用外扩SDRAM运行程序的方法  Q6 T0 B; l6 ^7 d% j6 K9 p5 X
% B$ K, B3 u  G, v, q8 c9 x
7. 使用STVP实现对STM32L1系列EEPROM预置数据; |" ~' t, @) S8 P: X% k
" w  e2 ?5 W. a- c5 _, }
8. FreeRTOS RAM使用情况及优化方法" ^. X5 c5 f, A( F+ o: L
- p9 P% `: z$ Y7 Y6 J: p5 q% s
9. 在IAR 6.5下如何将数据存放至flash中
3 v, d& |+ q8 e7 l. V
5 e  Z9 C1 X3 `; _1 v( x. ~  ?10. IAR下如何让程序在RAM中运行
8 Z, u! y7 z7 H- c/ E/ v: }, w0 c - ?3 ~- a+ y$ p- m0 H6 h2 ]1 p( e
11. RAM上电后初始值问题5 Y3 y, o3 ]/ \1 ~) c% U9 U4 O+ P
  v! m: ^4 W* [
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
* |, B5 X4 g. L# B3 [. N6 j. h
2 R+ a$ W* }5 }13. LwIP内存配置
7 G7 y4 K* Q- L) ~3 D/ w& o: e3 Z# \+ y/ B: h4 k
14. STM32F2高低温死机问题) i! e7 U* t) D/ s2 c

* S6 K" W, g0 U  N) r$ _) Z15. 使用STM32F427的CCM RAM时遇到的问题
+ F/ ^4 S  O8 Y; f
( R2 T1 g9 e3 L, c5 _/ u16. 利用QuadSPI外扩串行NOR Flash的实现  - E5 L/ C% ]( e! p0 E$ D! h! @2 V3 \
9 _' g! ~# \  |6 _- E
17. STM32擦除内部FLASH时间过长导致IWDG复位     
* M0 |/ b  T+ l  H4 r- D+ z3 G9 o; c! U% _

" k( A+ C+ _4 d. e18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
7 _/ P; x5 \" [0 g3 ?5 H) e  H" I, B
五、模拟外设
, ?* X7 X* w) Q! m1 U$ `- @
7 [( e" ~) o0 t, z% `( E! ~: |- J1. ADC对小信号的转换结果为零7 X" B+ `2 }) O  \( N6 w9 u4 k- E

8 c: [& ~( o; s) \* o2. ADC键盘读不准
- o0 U+ V) U' Z9 u4 `" Z$ z2 _. e& ] + l6 P( T7 H( M
3. 扫描模式下 ADC 发生通道间串扰
! u0 V0 B) b7 y: `' g5 _
* D0 W; U1 v( X" L4. DAC无法输出0V的问题分析解决
! M# O7 z: h5 [+ f0 t % \2 ?3 R% N# I% G/ s" h5 n
5. DAC无法输出满量程电压的分析解决
7 g: O; U' |$ `3 G 7 `7 S  x+ t, j8 @9 p: `* C% j( z
6. STM32F30x 的ADC 采样的傅立叶变换
5 n% U, E) p$ b: d2 C8 q7 W- L1 W0 m. Y! x8 j  I6 Z; T* r
7. STM32 F1系列 DAC的示例详解  A3 Q" ^1 K4 A9 g6 x0 E; o0 O; W
# ?0 N! J) T& q/ c* W; m1 D
8. ADC 连续模式采样浮空引脚问题
& W. x5 K/ Q0 T& T& |4 v) V. u- B5 ~  i9 f* m4 h
9. PWM硬件间隔触发ADC
1 T# K$ ]  X/ t; T% d9 N9 p
3 G5 r0 h1 _( k6 |; K10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC
# }, [9 h6 ^8 c  ~# k- m0 H
4 n. p  u3 F6 e11. STM32L4 系列中ADC 通道配置上的区别6 W" z, g/ o$ I( F
0 H0 l2 q/ u, [! L; S: ^$ H% [
12. STM32 ADC模拟看门狗及其应用
4 B2 N) X0 n! \6 o5 r+ Z8 M( b) ~; u) S
13. STM32L053 comp2 比较电压无效问题 # t. q7 P  G9 k" d8 V' p

0 ^6 K( d( h1 |3 c7 d9 A% s9 {14. 运算放大器OPAMP在STM32L4上的应用0 ^1 ^9 a1 E# G+ X% t, s- l

( H6 u1 t! G; j$ \) I15. STM32 OTA例程之ESP8266使用 # ^3 K1 m; p7 m/ @
( j3 q: y. z9 a' f# l# r8 Z
16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
2 M. F4 |1 `: f, v" s' w' E( @$ j- R) F, u6 s' n
六、计数外设* ^% e" G5 _7 Y: v

" @, q/ b3 {: D6 ~4 `0 `# x1. Watch Dog 失效" B3 D$ @4 Y7 j& h+ A) G% A% M

! w  `% B& e# y' R2. RTC计秒不均匀
( x( G' q7 {1 y9 d% d
* k: F5 w6 S" ~+ h+ u6 S1 p3. 软件启动模式导致 IWatchDog 失效' A$ F" U) T4 v* x

) V9 B6 q$ p  l4. STM32F030R8 定时器移植问题, M+ R9 V0 E3 p1 J! \2 u7 m
1 a2 ^/ z7 O. E) {
5. STM32F0使用RTC Tamper的几个注意事项
. I+ [! G% [* J/ z+ w6 h( [4 k6 l0 z* k( k. V1 g
6. STM32L053可控PWM脉冲方法之DMA" M7 k) ]2 L. R+ j" ~

! D2 A3 W0 U5 Y' h  Z$ I7. CounterMode,OCMode与OCPolarity关系
( E$ j' Y: H6 ]2 u* H9 c8 `1 g+ e" z; L  s. \( z- D
8. STM32L053可控PWM脉冲方法之DMA6 l: z+ D& I" U3 a  \- J  `

+ N6 V% d1 ^- }; ~7 B/ a% C9. STM32F1通用定时器示例详解—TimeBase
! r  f. l5 B& T2 w8 m  h
; O, o1 ?* U6 t. o$ n4 v2 }" w; G10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals0 Z/ U1 R  I6 e7 Z& P
1 }, b) W* `; f. s( ?2 a) |
11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生- p- @; {: B6 A$ l# k

2 d. w0 ~: l  y12. HRTIMER的多种Fault事件联动机制" ]7 P9 f$ o# `' R6 K

9 q3 Q) K  [+ r) M; v- ~+ ]13. STM32通用定时器 示例详解 —One Pulse6 |% Y7 Q, d' T
: E7 _' D( V+ s
14. 如何用LSE校准STM32F4内部RC振荡器
# ^8 T) N7 Q4 I' }& z& ?1 Z: x, e# K
15. 一种使用Timer测试HSI实际值的方法0 d2 Y6 @; |0 @
0 \9 s6 J7 Y8 Q4 ~4 t4 i: g! l
16. FreeRTOS定时器精度研究7 E7 s! F0 P( i) D( O
3 l" P- X: H6 \5 y, F4 m
17. HRTIMER产生多相相移信号
& p6 U# P; F) D* h6 p  [  e6 l3 n6 j
18. 窗口看门狗启动时异常复位问题
  P; q' v7 X3 ]- t8 W& o# J) j' A
/ X- G; e4 X4 Y, I: ?19. PWM硬件间隔触发ADC; O4 Y' Y3 x+ K) e

6 f' e. f: Z5 j  m& G20. STM32F030低温下RTC不工作2 b: `! B8 Q( F1 c, G3 x7 }* h

+ i+ h! K+ U# u3 j21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   9 |5 N: t  N) @5 m0 ]6 J' c

5 Z& G, d8 z: `! Y' L* `" [22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
$ }2 m; d- G0 }' {4 I5 x2 W: m& f6 g* J5 [& t& ^, }  v
23. 基于STM32定时器实现定制波形的示例 (2019·7·25) $ @( U* e$ W, z1 T

% M, w6 h" N2 k5 v9 N1 m24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)' }4 t* _4 W9 R. U! z
* V5 h9 |' \4 Z' X
25.MC SDK 5.x 中增加位置环 (2020.3.31)$ h+ S8 Y4 M" R/ z/ B
) n- o1 t& [. V6 L0 ~! Z
26.STM32高精度定时器PWM输出话题 (2020.4.29)2 o6 A/ R0 Z. j
6 @+ |0 e* c7 P0 h0 W2 Y$ ~6 m
9 a: e' f6 W8 P
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)0 V8 i1 ]7 g2 u% y: }, \
7 C2 s, ^: s# T" @) y' F
七、内核! f; O0 e* z4 E. x& x! P7 S4 P
! G7 u6 N8 \$ x) g: s
1. 使用指针函数产生Hard Faul
1 b  I: @# J0 v, `
4 i8 t( f' @6 |1 u" |2. 调试器不能通过JTAG连接器件2 G1 q& Y. g1 O" j2 |7 ]

. H3 U, F- J; Z4 P3. 鬼魅一样的Hard Fault3 z$ G& t1 o1 H  y. |' G! Q
7 |4 V. s7 |& T7 p6 x
4. 进入了已屏蔽的中断[6 d' W$ m5 H! H3 h
0 v, Y6 A) K$ c4 [0 F8 }+ H
5. 浮点 DSP 运算效率不高
0 \  D- d. U" _  U/ Y) X# e, y$ a: j$ r& v% m* z% d
6. STM32上RTOS的中断管理
. D' R- T) X+ w' \+ Q: F* b" H# M% G1 _- A! y& `* i& L
7. STM32F7与STM32F4的复位序列比较5 h/ p1 u4 U; h
2 l0 O6 k. r9 U" w1 w. _
8. STM32F30x 的ADC 采样的傅立叶变换- B6 I% n) f, n: ]

. w# @) S$ g' r5 T9. EXTI重复配置两次导致误触发中断的问题
' N3 \* R  I2 r3 n1 ?! V" p+ H7 O! a( N% \5 y5 V! K% t
10. STM32F3xx/STM32F4xx使用浮点开方指令
5 m. [7 o6 Z% c) s0 V( E  ?
9 I. q! i2 F  y+ ]11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响* m( J) B5 O) u5 A# k) a' V1 l

: m% q* _. Z5 D9 @- b 12. STM32F7 MPU Cache浅析  / D) R4 I- |; y! s9 d% [5 z+ i( _1 W
0 A: O- j: \, x, j4 H. u
13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)# z; @9 k. V& k4 @
( B# a: F4 T4 ?0 U4 e6 h" o  [
14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)
- G2 I/ a$ H  y$ X

! m0 |7 q: s* |8 j! ?3 W' |0 N/ @6 F% t  k0 l" Y
八、系统外设
" s7 T8 r4 E# R. H' ] 6 ]7 D/ A& v8 P# S
1. PCB 漏电引起 LSE 停振' d& l2 l5 o! z/ b3 G+ Y0 c& [

! {* Y3 C; M/ p; A& t2. 时钟失效后CPU还会正常运行# \* n4 A8 N0 q7 _" |
( K9 b2 u  Y+ Y& A" O
3. STM32F2中DMA的FIFO模式/ U, A, W) c) P+ R' h

8 q4 q! ~8 U, H4. STM32L053的GPIO翻转速度的测试3 m9 |# M! Z9 b# T7 g& D) u' Q

% d# ]) _. ^2 C9 x! v  e0 M5 V5. STM32F4xx PCROP应用
( U) x, c( b0 [* j# @0 V3 f" J% C
) r+ E  W% u5 d6. STM32L053的GPIO翻转速度的测试
  Y: g  D' q! |8 l# t. e8 E- h: ]  W6 W/ {3 z
7. 如何在IAR中配置CRC参数
& X0 b0 u5 N# ~7 b1 h( l& P
! N9 g1 f; E5 F3 M5 k: G( a8. PCROP区域函数无法被调用的问题与解决
' d( [+ q! p* @; m
+ ]; q3 O2 O2 B9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
9 _# O4 T. D: }9 L0 z, ^0 p
0 F7 \: k! m2 [% V10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计" r' |, u2 [& x' D
5 Y1 d9 h7 t0 n  y( Y. O2 h# Q! W
11. 如何用LSE校准STM32F4内部RC振荡器7 ?, j2 ^1 ]0 x0 Q! t( R2 v1 z
' e( H: m- ~% ^6 |* I
12. EXTI重复配置两次导致误触发中断的问题  
9 P0 O" O; W' S6 w  q6 m4 d/ v; t9 [% z4 ?  ?5 n. k7 B) t* f4 \
13. 时钟安全系统的应用(LES篇)  
4 \/ u8 |1 T8 ]& }, Z( ]8 t3 e, h

7 e! t8 e: h/ `) ~4 F
14. 利用DFSDM开发PDM麦克风应用介绍  + m& ~1 P/ J& ], n# B; M% L
' w! a6 g$ ?6 R' r
15. STM32H7的FMC外设在DCACHE使能时运行不正常
3 E, o1 U4 q; z, O, m
  d( b3 Z' Z4 @: M1 A16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)9 \* F& e; m/ `  M  y9 g- R) D! W
$ U# S1 f3 g% V1 L0 V
4 ~( y2 g: M0 G  v9 t
九、标签和收发器
) C5 B" T8 `: G' i9 P9 s  T( S ' k. P% K9 t2 {/ R; G
1. CR95HF的初始化步骤
& j& H. `6 W/ V 9 ?, R8 \6 i4 F
1 C* ~# e; p5 m6 g

" d* `* l; d& Q. W十、生态系统# e8 f8 a/ m, g& i
# ^& D/ n/ |. C; |  v; G8 ^
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题" L% K7 q" v1 v3 U* t

; V1 Z4 V& p& b% [3 `- M# H9 I* r2. MDK Logic Analyzer 功能在STM32中的实现问题
1 P9 B; A/ b8 a) ]) _
+ s) `) _8 L- f3 C1 M3. 在IAR6.5下如何将数据存放至flast中$ t' v3 \! [  @  b& I
- X8 S0 v9 W. F  S4 D+ E9 R& K
4. FatSL移植笔记
( }) \5 k) @: K: H3 Z, |( o  s* G % o& {# p4 H8 I6 _' q' n
5. Keil中使用STM32F4xx硬件浮点单元
/ x( O5 ~5 z3 T1 W7 I+ X% O
# J8 i# i' s- X' O' B7 d6. 如何生成库文件(MDK和IAR)
, ?& M  T: M1 R& V + t, M4 M4 r3 A3 ^1 ^" J% N0 I0 j9 ]
7. Nand Flash文件系统解决方案
& ?9 K6 ^' g  O3 |6 F& Y) U3 B & j2 X% X3 t1 v9 |
8. STVD在调试时弹出“Cannot access configuration database”的解决2 N, R6 p2 e* ?; W9 M0 m
, K0 `* G* K: ]" V
9. RTOS低功耗特性的设计原理和实现
$ y  G; `! h3 b4 ?6 c; M
- U) T* w3 d# s4 y8 r: _10. IAR下使用J-Trace进行指令跟踪$ @& z7 P  F0 p7 r

6 X1 \* e3 W; L$ s11. STM32上RTOS的中断管理' j# ]8 X, R7 c: ]# B8 U& \, I
; {5 r- q7 y9 l
12. IAR下如何让程序在RAM中运行8 L6 F) a2 N6 N
( W1 ~+ g2 C$ M+ D, J
13. 如何在IAR中配置CRC参数
& Y. w) E8 v; y& H. p/ H
+ v2 q1 E) K, d5 w  B- [9 Y) T6 p/ C14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册
$ f8 f. r: a+ ~* I: u' M1 j% d4 S1 Z7 S' v" m6 O! z6 W
15. 使用mbed进行STM32开发及STM32F0的时钟问题
" ]4 Y$ K5 z- M
1 I, F1 e6 S9 I  E9 ]" a8 Q16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
! M# e6 z# i  n' ^4 A
- s7 b& H) L' f17. 多任务系统中的不可重函数使用注意事项
! _. q: v$ m6 R, F0 H0 Q
1 {& h4 m3 {2 I! _18. STM32 utility的hot plug功能
) b* A3 f9 F7 u/ l7 g, J3 h0 F+ e4 H4 o: T# u
19. 如何将CoreMark程序移植到STM32上
; W; z- B. {6 S: X% R2 ^" g0 @/ G* {$ @; _% H" W7 @" ~6 k7 W
20. FreeRTOS定时器精度研究* P1 ^1 B, i. i$ U! U: v
6 @5 n. a5 Q9 E; z  {& ~
21. 如何使用Eclipse和GCC搭建STM32环境1 p. x" z' M- x9 c8 {% t. I

2 I/ \. O3 Y1 n/ z/ x8 q22. 如何建立一个基于GIT的STM32库
6 K; k6 ?4 ~* g2 ~
3 Q2 r7 P% \$ L) N9 b23. 从零开始使用CubeMX创建以太网工程0 @/ `5 R3 }0 J& u0 I5 ~' v
% \1 Z- E. C9 j3 l( h- c
24.从STM32Cube库向标准外设库移植FatFs文件系统0 i! X/ F1 ^5 S3 o
% ~& e  Q3 _$ \% A: h& h8 q
25. 基于 STemWin的屏幕旋转
# k7 R+ b; A- K: A: c+ s5 ]5 {/ E  x5 R7 f% q7 M
26. 编译软件 Hex文件烧写
/ K2 z4 C; z$ d7 x4 d* F$ r2 i( L/ |9 j: ]5 z# V
27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
$ F6 C% D1 r  I* |, C' |3 w7 b: V0 x
28. USB CDC类入门培训
1 Z1 Y7 a% x# Q5 K3 X
! a1 B/ g+ U! V/ Z0 a! n29. USB DFU培训 - H+ C* y4 d$ E. j8 C

8 I$ v% M3 Z0 X7 f! t" b30. 用于量产烧录的拼接Bin文件操作# O$ `9 P! {0 @, N0 ~( i
4 p% b& @0 ]& |0 U
31. STM32免费开发环境该用谁
* H5 |2 f+ ^" G  l  j  X0 ~/ t
& w9 E% T& {- |9 r7 g& V2 H* Q0 v+ _32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)9 ^5 J, O, P! H. F. [8 ~5 k

3 n4 `* W. [! H7 D* F33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新)" i. A( q# K6 f
+ p+ {& H" l1 V, Y  U9 P
34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
  s; X& K. l( S+ [; R' U
% N. R3 w& |2 x35. STM32 FOTA 例程之 cJSON使用   
" H- N; C' ]* d# w7 a
# m5 }) ?( K* S6 u" c: e36. STM32F769DK 云端固件升级例程使用说明
& K( R+ _: d& x& r/ w+ D

3 R! F6 n; Z1 e% c' A" t/ p37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
' J2 Z. b/ g9 t5 y9 V) y
2 J* s# f8 g, H- `38. 基于 STM32 的阿里云物联网平台方案 ! E" {/ A- O+ H& z4 u5 x2 H

; K1 U" r) n' X2 M- N) T0 k+ X39.AliOS 任务上下文切换原理分析  2 y: d; n$ n5 l+ j0 q" J! i) _! N
* q. t4 X9 V! o  Z2 W
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  ( L5 m3 q, @% C' \+ O! S& ^) q

- f, ^4 S: D$ p! x( m5 B" ?3 m41. STM32F769DK 云端固件升级例程软件开发文档  , \- O, @; k6 z6 z
3 |8 X" {% R$ I2 E% J
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)$ [; e3 `( w2 P- m0 b

3 ], \5 J$ S% R% w" z- o43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)( [7 e2 U, c) o5 _( U. a
( _  l0 f5 H4 _" a8 h
44.零基础快速入手STM32MP1 (2019.9.19)% U5 v' a7 L/ ~9 K3 Q5 G
! B8 u- M9 ?* }3 O* g4 t! g. R
45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)
; Z( h" _) A: ^8 C
9 o) W8 m( I; ?& A% i1 L, ?5 n# y十一、调试
" F0 T5 |7 J& A / h: J: d! l" K6 S) U9 g8 z
1. 关于STM8S SWIM Error[30006]的分析5 I; ~. H" \* u* I- I
8 i* }0 Q( d; |* J* r5 i
2. STVD在调试时弹出“Cannot access configuration database”的解决" Y1 }  V+ Q+ G: G

# c9 v; i' T. k1 \0 S- S3. IAR下使用J-Trace进行指令跟踪8 }3 T4 O* {- ~2 ?* x7 V5 d6 R
9 ]" q* F- F" _/ M2 S% B1 P) X$ P
4. 菊花链 JTAG STM32
; H2 v/ R' Z% u/ q8 H
0 v! h$ v% Y, p# f5. STM32F411CEUx 能下载程序但不能执行% m/ `# P; Y/ y( `, n
: R, n% f: b# w) N
6. STM32F103C8T6 程序上电跑飞7 E1 u' Z3 Y& f& f, e2 q

% g) p, U- X1 u1 {( \% u& i9 a7. 使用STM32 ST-LINK Utility 设置读保护后不能运行' b; Y! d6 Y- P

. A! P. Q, r2 R9 m( I/ b6 n8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  $ ]3 K* F3 L2 A0 \& x. A* _

# E8 o+ l. k1 \0 n9. SWIM协议的GPIO口模拟
# n) q1 Y& f# `8 n0 p3 [) i( \6 r4 g" r/ b
10. STM32F091空片使用ST-LINK烧写后复位不能运行用( R, B) u7 X' |. u5 G
3 J: \+ p" ]  B. U) T' ~
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)! ~! J. L2 b2 l* v/ G8 S' l- m% t6 c

1 k( @$ b1 g6 G12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)
) [1 Z0 F9 N. A8 i9 T$ E9 X0 d9 F
) ?1 H! v, J: S9 h, n# Q0 H0 v/ b13. X_Cube_ClassB代码移植 (2019.12.24)
- h- P& [. T9 K9 O, S3 S  s/ s. `- t8 R2 N" o; Y
. q$ A7 E, l8 _0 d
14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)! c! Z5 s6 F2 ]7 x4 Q

! J6 o8 w$ q. |( O) Q十二、人机调试7 l7 n+ u, V& j. c! |) c

* r3 d9 I  N) ^1. 一步步使用STemWin在STM32上开发一个简单的应用/ ?4 ^& V! B4 T1 _  _' ~3 B1 _* P
5 C6 _/ E4 z) a3 @+ @
2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
" m* H+ G8 [& |& x4 l& `) b
6 y' s+ [3 h, L6 S  N5 G4 c3. GUI方案中ALPHA通道处理介绍
9 D2 a- g2 N6 X, [8 A- Y3 b1 N5 f2 {; u! H) J) u# E  `+ J
4. 基于FMC8080接口8位LCD的STemWin的移植  |0 u! G' J4 k& J

) i/ T, P  B+ ~0 [4 p) d5 S5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
5 ~! |1 M- l) B0 W2 o: M4 R' H/ i1 r) P% T5 X1 C2 H% s
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)4 r$ X- U# S* z, G' o

4 u- o4 ~! ^- M! Q7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)2 z& ^# P) P9 v7 I4 C

9 V. k" @8 {* M( P! ~1 z: ?$ F0 _8、STM32L5中如何关闭trustzone (2020.5.12)
! p: `- c0 p4 [+ N1 U/ i
) F5 J1 [$ w. F; V# z十三、马达& |+ E3 u. C% M% J/ Q
! t, e9 s+ }2 w6 ?1 g  P
1. 电机控制同步电角度测试说明" I1 \$ E$ @, R, y# Z  t
  s+ ~% K0 h  t

2 U- s7 i+ ^4 u: r  _
1 \( P# o3 T& \* c: I8 m十四、安全
1 V4 N- h$ |# L

/ F+ G2 C; t; |* h0 u1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
/ S7 A% O' O% d- Q* ^1 T
( e( L: `. N8 D3 @- r" H' p* ^% z; j
十五、其他4 m( b  i; }/ |5 q

9 p" O. C) d4 o' L& |1 s% i1. 跳不出的 while 循环" z3 K9 \4 ~; \( Z1 W# o
: R& h$ y3 p# v6 p
2. 外部IC连接NRST导致MCU内部复位信号失效的问题* ?3 j8 f- W) ?% M
0 |2 U0 u. ^% K; _* _" J/ ~9 ^
3. 潮湿环境下不工作
2 }' E4 ^0 b& }) ~  G, i* K
# H, {$ Z. }. [- p6 z! D4. PCB 漏电引起 LSE 停振
. j$ i  W( c1 d ! I0 Z' h' j( J9 L- n
5. STM8L152 IDD电流测量
* x3 [% ~) V. D( p. C" ] ( C+ B. N+ X2 [
6. 使用STM32实现锂电池充电器- \' r7 I1 }" m# s

( X' [' S& |! w( d7. STM32_STM8硬件平台基本检查
& r) r. F# N+ e2 }! @2 L
9 n2 A! _- X- Q% P5 f9 ^- u- {# G/ b8. 验证STM32F401在STOP模式下的电流4 Y  ^- R7 n9 T* t9 Y

  m+ O' z- X" [  B' s9. P-NUCLEO-IHM001 电机开发板串口调试指南  h8 [" A5 r( w& D  a0 _- ~

0 {3 I) M2 b, V5 c/ e2 {1 k/ m0 J- t3 n10. 一种计算CPU使用率的方法及其实现原理
5 l6 M9 O+ f( \. |; r+ T0 o) ^: s5 Y% e3 B/ H2 `* A
11. STM32 RTC不更新原因分析
6 r1 p1 `3 q% i  d) Y1 W/ O& n% o. T0 I/ ?! Y1 ~3 a# m
12. 关于ST库函数的代码性能对比
8 m1 a+ F9 j' e6 B! v+ R( f7 R- U2 v4 O3 q0 ?2 o
13. 在IAR中实现通过将程序在SRAM中调试的方法  h. S! T6 _: v& |; u5 x  G

- r0 \6 h+ x0 p0 N/ @8 U) y3 D+ T14. M95xxx EEPROM写保护配置
4 ?1 c* L& _  x2 o( l
0 {6 A+ U$ |1 M  _8 a15. 4SRxx的GPO的属性
2 B; r: X" T+ K7 ]3 }( R6 G" @5 s" o0 o9 C( |( n
16. CR95HF的初始化步骤 5 A$ s* U( t, |1 I: j/ _$ u! e
- a$ ^; Z# _6 q
17. 电机控制同步电角度测试说明  
$ o, T. _' S% [# r1 k; m% J& I7 `( ?5 k) O! k; s  r5 L7 v2 P* P* p: v
18. STM32+BLE通过 Notification与 Android应用程序通信的例程7 A2 s. p. e& Q$ U6 _: m" Y
$ ^8 V. z. Z6 }% I1 a* @# ^
19. M95xxx EEPROM介绍
1 V, y; y+ F+ G' i( ~
' \) U- n1 [% ~' ~7 X1 \) w  ^# ?20. STM32 DFSDM测量温度应用
" M$ J/ E  Z" n, N$ M, E7 G& W) i$ L
# X1 Y' O, I: X" G0 M. F21.代码实现PCROP清除2 C. D# D% D- K- q3 n5 P
6 e3 C& p- e. J# A' W$ t
22. 理解与应用MPU的特权与用户模式! k+ X; B$ X% `% W0 W: S/ C# L
$ a; c4 c$ |: H2 U' T4 N
23. 用于电机控制单电阻采样PWM变形信号产生
0 b9 C1 q6 d0 r" n6 U% Q* j- L/ k# H7 q* ?
24. STM32L低功耗模式唤醒时间测量) J* e0 m% @- m3 s

' }+ d$ o' L" O6 M8 d25. X_CUBE_SPN7程序电机启动抖动问题
! u# l- Q1 d: p4 R& m0 C2 `6 n% W3 C0 }" h4 X" ^: }
26. 发现STM32防火墙的安全配置
+ Z3 A% J1 Y; M: p* x
) g' y; m' P6 u27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改
% d7 [! j9 p; D( u4 J; {% D  P+ H7 C+ ]. v3 K+ X
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
" [  j' J7 ?) Y8 m
* k- G4 _: Y: A. K0 ]0 k1 R2 c& G$ n
温馨提示:
- f! b9 L, U3 x" Q
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。
! d: n$ m% ]& e9 {+ n

/ Y9 C- l+ r* Y( l! r& T/ u
7 e9 D( X* {: Y- F* W; }
! i' T4 |$ x! J* d
! H8 O  G3 s7 s% F, [* c- e& L& j
: E/ M9 Q+ c* d; A5 Y0 k+ L" \& x3 W4 I8 V

8 _" x4 Q9 P7 d* ?6 s" \/ G) W% l) |
; T# s0 c& W5 Q* j9 }/ [9 a& N
, ^  g5 N2 F/ l3 F& }' A9 U6 e3 F7 g. G# l

评分

参与人数 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
好详细,多谢分享+ M# |4 Q" x7 R6 j  u, q
5768340 回答时间:2018-1-13 14:42:54
HI  + m4 G. f* H5 J5 R7 P
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:
: B( R5 n) G3 x3 X/ X# n, Z   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    * f) U4 k7 U/ O9 B6 C" `2 M" i+ {
  2. 函数名称:Cdfinger_Bspspi_init
    / [# M; `5 M* l" p0 E/ {
  3. 函数作用:spi初始化函数* v; C0 k( b  Z4 w* J
  4. 备注:3 U: q4 C  y. n# {9 A! _+ m& o$ Y
  5. ******************************************/
    + g/ @' H% A7 f) N0 X8 B. D
  6. void Cdfinger_Bspspi_init(void)
    2 T7 P+ c5 p8 Y, G* Y& ?
  7. {
    & C" j7 ?' X. e; H( A9 F1 Z
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    : t* _6 V/ b2 }6 O! g% S0 N
  9.         SPI_InitTypeDef  SPI_InitStructure;9 n- D2 w2 |: c0 @/ x
  10.         DMA_InitTypeDef  DMA_InitStructure;
    : N9 Y: q8 G; z. Q
  11.         NVIC_InitTypeDef NVIC_InitStructure;2 F% n! W1 E/ S* l4 F
  12.   
    0 m3 [3 w8 A% |2 f: s
  13.         int ii =0;- o( L* J: p# L: s/ `: Y+ x% w
  14.        
    0 Y" G# y% f3 r( |3 A' {
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    * Z) V; D' D  }# u9 ?' k4 l8 H
  16.         /*!< Enable SPI2 clocks */
    & {# x9 x) b' l# b! s; [
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);1 c* M7 y! d% Y
  18.         /*!< Enable GPIO clocks */, w% b' G4 k7 W% l- l! y
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    1 ?; d5 m; Y* [5 u
  20.         /*!< Connect SPI pins to AF5 */% U4 j1 \# q& v: o6 |3 `
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    8 j9 \% `( W, a
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);% B8 `3 @3 \; J$ @
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);. m8 V- u* M8 x

  24. - h4 I+ F- O# ]* R
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    . y6 z, u5 b3 W. T
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    - ~, ]8 d+ s# f1 `
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    - X0 N) D) Q" k
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    9 S# X" p( c2 T4 H1 x& @
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;$ t3 R* k( R- [% L, b6 k
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);+ e$ h# h9 V1 d; ?- A' M1 c

  31. . n* j( P3 y. _2 K6 M6 h$ g
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;. _' H& T: L% w0 ?
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;- S5 M! O0 s9 w. B* e
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    % i1 x- U! j) \8 u( e
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ( z! e* R/ B4 y- D5 U( ]
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;  x  U) x# v' L/ `9 N- ?! X9 z
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);1 B. i) Q6 J& E1 k+ G) [0 G) _
  38.         Cdfinger_BspCs_HIGH();
    : S6 t* C5 Q! O* p% q+ V( Q
  39.         //Cdfinger_Bspdelay_ms(1);
    7 G" Q6 r# ^9 K$ a
  40.   //Cdfinger_BspCs_LOW();
    0 U0 ~, T( p, u: G
  41.         SPI_Cmd(SPI2,DISABLE);
    ' ?5 Y4 Z) s* c# A" |. l% `1 g( G
  42.         SPI_DeInit(SPI2);3 A' U6 w5 [" A
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;' t+ @' ^  {! Y6 [: [
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    . B6 D1 u! h, u& e/ {3 M; a
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    - b0 V3 s, Y* \0 x; o
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    ( }/ z' \7 ?/ J
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    0 r0 g$ d0 \9 B$ ~" S
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;
    7 b, h8 U0 @2 \) ~* x% @% v- x
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;4 Y; _0 I' ^% i4 b, y  j
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    4 m; Y  b  |/ ~' q. ~
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;
    , N0 H% z1 E3 F, {5 l% n* e& b
  52.         SPI_Init(SPI2, &SPI_InitStructure);; |3 l! ^; G0 W% M& o! z: r
  53. 9 k" U! N) `* G  O9 s6 o; t7 e
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);$ A% J: z: P, ]. h5 b! x
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/! h; B' p/ P- J1 b" A
  56.         DMA_DeInit(DMA1_Stream4);
    $ _' H) v" H2 X! b% a& v* }& q
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;; x9 j3 D- S: l3 W" J
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);2 r1 d1 {( R7 B3 x: h
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];3 i: E5 v* s  C- a4 n! [
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    ) h; v7 k$ q6 T5 u2 K) l
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    ) o# l7 Z( p. ?) @
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;
    9 C$ {4 \7 C* W' Q2 `0 ?
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;: T# |' a' D( W1 H$ |% S' ~; W
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    $ N6 Z+ u- ~8 _  `$ _
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    $ v+ e7 {0 n; c' p0 ?) X6 i9 @
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;/ G% D3 s4 q" }) B- f' |
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
    : z/ h! M  v5 w( N( ]
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;' _& Q% v% ]' v/ Q2 u& p' W
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    , B# e9 X. P4 T" q9 R) }" b! X
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    ' D: U: W. M" P( g0 e
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    * ?( u- y, e& D$ d2 d7 u
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    7 a* e- {) L7 V
  73.   
    ! B% I  Q8 `& C; b" F) a
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/
    & E# p/ @/ b) W8 z, ?9 u
  75.         DMA_DeInit(DMA1_Stream3);! j* r3 x5 R* }7 G' A$ N6 y
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;$ c) |8 L! U& }! N+ Z' Q* m) i
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);1 X$ H: ]5 C( {" ]6 ~
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
      `. i/ y1 {' q+ m. Y7 T9 e- k
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;2 X2 P) ~6 S3 \: a* l
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;
    ' ^: X' l! Z7 Y" P5 s5 B" {
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    9 z6 N( Y6 v" |9 M8 I: |
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    . u$ a9 z7 s" l7 k3 |; ^7 j
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;" C: V; |7 K, U$ }! d
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    , @! N) X+ ]1 f! D
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;+ o5 X4 b6 ~0 u' G: X4 |
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;) ]" B4 K' p  O" X7 n5 x. N
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;: M  j7 L* F; N$ P  u
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;! g* a3 n/ [! q: @  X/ b
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
      _2 z- F; d9 \! ?2 r
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;( K; d3 J' S# p: n! r. n2 Z9 Q
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    ) @* c% q* Z9 h" w
  92.         //Cdfinger_BspCs_HIGH();
    ( g4 ^& |  i/ A2 q1 N3 g9 q- U
  93.        
    2 ]2 q" e, d  V) }9 I/ h
  94. , A% f; t. i5 @. t  X9 j1 B" p1 c

  95. $ E7 ?5 l1 a+ \' R7 Z% k9 z6 c
  96.         //发送中断4 ?  f0 Y/ Z2 h* N8 y4 Y
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    8 g7 c& K! X- n
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    ( k* A3 \. G5 k7 P  x3 S
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;, y' v' W; E8 E, g; R3 q' B" M
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;- V4 C7 Z& W3 a. R, U
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    # M! j0 v' q' O/ M: F5 r
  102.         NVIC_Init(&NVIC_InitStructure);# l. `, i. A# i0 ]
  103.         * R% P0 E; {( o! l
  104.         //接收中断
    & R/ e2 u) H5 P6 E
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    5 ~3 _. A' G/ g: `% ]) v5 ?1 S
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    + u8 y1 i2 R' K
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    5 m8 Q8 F; K6 Z+ a+ n9 B: ?" J( p
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    ) W! [. w9 n+ S" A- U
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    " |0 W& ~! g4 }: @4 Y
  110.         NVIC_Init(&NVIC_InitStructure);
    , n9 j( t- l; k) f7 Q$ x0 {+ ?7 G
  111.         SPI_TIModeCmd(SPI2,ENABLE);2 b# D; x7 _  v$ {
  112.         SPI_Cmd(SPI2, ENABLE);
    " v- u5 }0 [6 h7 J/ f7 t% a
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    " r& `* M' A) e  A; d
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);8 P. O6 i' C& p% ^. T+ y: O7 x

  115. ! m4 N: h" W$ M- q( f1 W
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);  E; w/ s3 I/ F
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    * w1 [  |3 r& X6 l+ q
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    / h, q! D) ]( y  c) B  Z, l
  119. ! ?* a/ ]. G3 j3 A" j! r) _
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    ( \2 e4 r; r8 X
  121.         {8 l. |5 t0 q5 R/ k( G
  122.           if(ii%8==0)9 \5 p! Q6 q3 D# C  h# w3 ~( V6 c
  123.                 {
    . Z" N$ N: n5 x. Q6 W
  124.                                 printf("\r\n");
    $ X. E' w# \6 L; h) n
  125.                 }
    . \8 \4 V" _' L# L( Y, A
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);1 j% c, H$ }* }7 V
  127.         }
    0 j) [7 C( H! i! [! |2 d6 j4 L
  128.         printf("111\r\n");) c7 e- M/ G1 G. |+ F/ J
  129. }
    : @: m9 o# i7 S

  130. ; i: m% u, I6 S4 t% ^
  131. ( E2 o% j7 l5 `/ i2 p
  132. void DMA1_Stream4_IRQHandler(void)* [: m% p: y; ^& [9 p
  133. {' x: R5 f8 ?1 u
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    $ C7 }& ~: a7 b3 m; v* @, j  b4 `1 y
  135.   {
    7 |* S3 }5 T+ n2 n6 u. g$ a. u) g6 W
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));
    5 V" v5 s. M- t9 p& m6 y# A
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);% w) }: w6 n) t3 u" ~+ q1 M
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);' y$ l$ O5 E4 w, Y* l# v; ]
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);$ c# L+ L+ h8 \% S: j
  140.   }5 y* c+ I9 l( U' E9 X& o( p
  141. }9 R; ~$ i6 m  a  G

  142. . R6 ?  P8 c2 C+ }7 J4 U
  143. void DMA1_Stream3_IRQHandler(void), ]. a4 \% R1 Q1 O1 Y( w5 S& w; Q
  144. {9 s& B" \. T. j7 ?
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)1 z+ s. s% w* p# B6 C3 ^/ O
  146.   {6 f/ i8 o, J/ ?1 a9 U2 {, t. D# B
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));9 v( r. ^& d2 R- d8 g) w! m  _; {
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
      D; k4 H$ h3 a# R8 ?( m! }# P
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    ) R# z& V' y/ a- D2 c" B! }5 N
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);
    # J6 U# ~3 S: q, S6 {
  151.   }$ w! P. z9 v# b' i* K
  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的波特率是不是必须为相同的,才能正确通信7 \1 ~1 D  W, E2 e& L9 ^6 s
以下是全部代码:7 {1 v( k' j) ]9 R0 u! V% a
#include&quot;stm32F4xx.h&quot;; @# d/ X2 Y0 G- C- B$ \  t0 q
void RCC_Configuration(void);9 T6 G, Z2 S+ s) ^2 `. Z" ~$ @+ f* d
void GPIO_Configuration(void);
; @' c% y+ m, b3 q$ Z7 s) f# U* Wvoid SPI_Configuration(void);% G* \9 U5 s3 N8 S  `$ s
void Delay(int nCount);
1 v. P. D( m2 `+ G- N1 V' {int main(void)
( S, M! y3 [6 C7 c+ i  O7 a{  RCC_Configuration();% i8 u, i! D0 R% q6 }) Q; {, i
  GPIO_Configuration();
  B# z$ y' w" ?4 c" A  SPI_Configuration();* w' ~7 |. T; J; ]2 \7 z# s- O
 while(1)
4 E6 U; q- m# |8 K$ ~ { int data=0;
( N) c/ H) z- U+ V  f' c  SPI_SendData(SPI1,0x55);+ j* p/ d2 _4 G
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 9 o3 y5 K: t: ~# ^! R6 P( L
  data=SPI_ReceiveData(SPI2);2 Z/ Q! G8 A9 i4 T4 W: Q
  if(data==0x55)& Q% R7 f; T& @' H: D% `8 h/ U
     {  while(1)! x% A# b# W3 Q7 d5 R' M
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);( K0 a- o: p" }0 t/ }" e
                Delay(0xfffff);
+ Y# i) w0 N; C5 T1 Q2 m                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
/ n* O' p, C+ f$ ^                Delay(0xfffff);
1 V: @$ b" u+ A# c7 R* Y  |# B   # i7 ^9 b$ E* F/ b6 D
             };4 U% q# Y& d$ o, {
     }
; J' x: h3 ]  O- h2 P     else while(1)
, P1 p: M/ X3 Q$ z1 G0 ~$ j            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
/ N* T1 Y. A- G. q% e               //Delay(0xfffff);
# p0 i5 L: l" z5 A* L: s               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
- L7 ]7 u( S- S  {1 G7 F8 ?2 b0 [. w               //Delay(0xfffff);0 l& m+ p8 p; T
   - Y5 i/ D, [! }" M; D1 Q
            };' W; p; `' [) G2 b2 Q- {. m$ m
 }! I* B" i2 l% R
}
# a, d, ~7 G3 e( V( r8 ]! @void RCC_Configuration()0 K0 H& u9 o. u% d
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
+ M$ W( d* o5 p2 }5 L3 t0 a  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
% E7 L: H' p, H. S  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
0 g. T- q: }- s8 d}
$ t3 r7 Q% C+ ]6 W, G+ h, bvoid GPIO_Configuration()( n3 t- S) _6 N
{  GPIO_InitTypeDef GPIO_InitStructure;4 [9 G& ]7 \6 T1 t7 F: t
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;  {; ~( \3 c0 x; P4 D* H
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
5 P* H) C& T- A& H* o+ e  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;$ G6 C: N! f8 Y' {7 E, ?
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;+ r! {% o5 }6 i  S' e; |* `% I7 y
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
2 [+ k; }  h8 B! i* b  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
+ ], r: J6 y# Y5 @$ U  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
8 G8 j' A" O) W$ l% k  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
6 I& H5 n6 ^* l( `- j  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
6 ~( k% l+ K. b8 p  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;# j0 J& _0 J3 U
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;4 ~; P0 z/ O' b  }3 n6 m# \
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);2 [( L' Q; S8 v5 b) X
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;6 H$ o+ J# n$ }" ?
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);# k( q; @' |* z# x
}6 T6 Q0 ^1 f, e1 t+ i. z$ b1 T
void SPI_Configuration()
  _, |( K( p- I2 U' {{  SPI_InitTypeDef SPI_InitStructure;) n" Z6 {# K( |" C$ f
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);+ B$ y3 k5 U5 S, U+ ?; j+ z
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
8 P; {+ [/ `" Z) N) w  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);/ V+ q' r& Y' f: c  F- N0 Y2 M
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);( f* \# n7 b( p7 b$ [  t/ `1 C, _0 d
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);' @- @! f. q( g3 W; |
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
/ g4 |! T% H/ x. _- ?; M+ |# @  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
5 d9 v; Q$ Z$ L  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;5 j4 |2 Y2 \" j, b% s/ k8 j
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;+ U  F, b; P1 A( H2 x$ V6 j
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
% s$ b2 M/ L" N* }  G4 |' E  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  E+ J7 O) n& a) I& O' ~3 q( E, T  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
* K* h) b% E4 f  i5 |1 Z6 o   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;/ p  X- f' [" A8 b. i  ^/ V
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
/ E& R9 p) P% T! a, t' R  SPI_Init(SPI1, &amp;SPI_InitStructure);
) f$ }0 _) |3 w1 x) `' E  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;% g. Y9 L" {- [" [9 Y
   SPI_Init(SPI2, &amp;SPI_InitStructure);8 r9 ]) e4 l4 ^
   SPI_Cmd(SPI1,ENABLE);8 L5 N* h( y1 K, b: x
   SPI_Cmd(SPI2,ENABLE); 
$ G, b# n2 E) }# v4 @& I# _}
# e+ m+ @4 {) O% avoid Delay(int nCount)
8 k5 M, F2 e# M% a- z{ int c1=nCount;
  Z* y/ L, u1 S int c2=nCount;
: O( I: R* j' B for(;c1&gt;0;c1--)
' V8 E9 a- @# u. a  {& m0 S  j( T, o) P, {2 e3 F
  for(;c2&gt;0;c2--);
& x6 h, B& P# p, Q% S1 F };
  Q$ n0 ^* D" m3 C5 |  g  n1 A}: P5 N; A1 H& |7 D
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:- a6 I3 ?+ N4 _. [. `2 L  b# J
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信: T& N* A7 E- D: z) }+ }
以下是全部代码:
2 Z3 c) s$ Z6 D6 Z#include&quot;stm32F4xx.h&quot;
( ~( C! {( e+ o# Q: ^5 Wvoid RCC_Configuration(void);( o7 M! c7 V( j( u8 J, d
void GPIO_Configuration(void);
4 d$ \6 G, o* F- D% x) |void SPI_Configuration(void);; l% s. a: b8 ~1 O0 a5 D0 K  d/ b' I
void Delay(int nCount);* h$ H8 v2 Y. k! d/ j' V% {
int main(void)
. O  x0 R; h0 v# i- s) b" M! _{  RCC_Configuration();" u/ P# T! O6 a8 a9 f
  GPIO_Configuration();
5 z" |2 m5 F' _  SPI_Configuration();& d; n# l( @8 k& d4 x: u# N
 while(1)
' f6 y' N. S% e6 B+ e { int data=0;
/ b6 r2 X( v5 r0 ~. `, F0 ^  SPI_SendData(SPI1,0x55);7 o2 r  N$ n/ v0 Q0 F
  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); ) X  Z  L. y( u
  data=SPI_ReceiveData(SPI2);
4 c* r6 Y; o: S4 K. J' i$ N  if(data==0x55)( J/ Z5 w% B# w0 s6 I/ y
     {  while(1)4 j6 @. P; l# D" N
             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);) |; e2 Q' Q' f4 n6 Z5 d
                Delay(0xfffff);3 B8 G4 a4 _$ ~1 F1 S- ?) M6 |7 T$ S
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);+ [" D1 _& \  q
                Delay(0xfffff);8 D- e1 D( O6 g' U/ F
   4 W1 o. }! ^0 A
             };
4 @* D5 D* d. ~2 V' R' k" A$ ?     }& j$ h$ F& Y. b1 r
     else while(1)
/ D9 Y; x5 m! x' `  D- \1 T            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);2 X+ w1 P5 U2 k& z, i
               //Delay(0xfffff);) g) L& _) o% b
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
" M4 M2 w7 v5 D1 t% u5 p2 H+ D               //Delay(0xfffff);5 G/ X! p% m6 `, |
  
% B: V8 n  O) Y5 u% K6 c            };
6 L/ o& @4 k* k. R; G+ i3 L1 T: N }
& L# j7 \- z! y% b# M5 B" \}
; a) M7 l# p1 O" b) @void RCC_Configuration()
; @- {) j. F% ?+ ^7 J- [+ m{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);6 U9 f5 p1 Q8 B7 q; q0 c. J+ q. n
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);+ J' @& u0 C# \+ n7 o
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   2 {( K4 V, n/ T& S% N7 h
}
5 D, d; Q) }% Zvoid GPIO_Configuration()
* v$ Z, ~! e- N6 y7 n{  GPIO_InitTypeDef GPIO_InitStructure;
2 C$ I3 a1 O; g$ S& T. U  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;7 c$ k& g  ?- Q2 ]- `4 B4 `# H6 B9 i& J
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;( r) X+ @9 @& K# _
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
8 N$ T& H' ?9 E" f  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
: }1 u& D/ X& A; B( c& s; Q, t  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;7 A8 Z4 m2 l3 K3 ~3 o
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);% _+ d1 p. I4 Y* x
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
2 M9 q# a* d  l+ W7 ]  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;; [- C; N; ?. w. t% y- B) I" X
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
$ ^3 [6 |8 V4 ^! v3 b  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
& W* O) B/ P* y7 C1 I# O  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;' z% I, F  r0 C
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);9 g* F0 q5 x3 Z/ ~
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;9 n- @" v6 I$ k
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
# F2 D+ z, U% T}
* v& Z4 B9 P9 x& b" e( `; m; Svoid SPI_Configuration()$ k/ ^3 e/ R! Z
{  SPI_InitTypeDef SPI_InitStructure;! O: N! ^! Y2 z* Z7 n9 ?5 f
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
0 R# l& }$ r$ u' e  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);( z! z9 b1 F) f* _% V2 u% |9 I
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);) G2 Z3 d. K5 b* |
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
* B4 G+ B, R+ n3 w$ ]  K' |7 Y  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
8 [6 a& {. K" t5 q4 d' d  I# K- r  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
( j# T* n" ~" i' w; K  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
2 o1 W4 b2 b* H( E* y, f4 L) Q  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
+ Y: I( i6 Q  d" E8 z# Y  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
! n( M  L6 c( U) B6 H% x5 d, E4 x  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;( O& G# U. @, k. h8 r& p
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;0 e% h- c" F2 ?
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;5 i. N' S9 u) n% v" ]9 ^4 Q& W
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
& O% S; v) X6 S  r) g   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;0 q3 W; e1 V* W: x. b- o
  SPI_Init(SPI1, &amp;SPI_InitStructure);- J, C8 Q% a6 k# W0 r% T  a7 j
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;" X7 L5 n2 @8 a, |+ V) D5 x
   SPI_Init(SPI2, &amp;SPI_InitStructure);
4 u% H5 F+ t- U6 |" T4 x   SPI_Cmd(SPI1,ENABLE);
9 ~) V1 V! E  N: f+ ?% e4 q: o2 C   SPI_Cmd(SPI2,ENABLE); 9 z2 U4 a, n; S5 s  Z4 v
}, T6 U- I+ j; o2 e
void Delay(int nCount)# Q. @0 e$ \+ ^; D6 y$ Q$ K8 }2 E
{ int c1=nCount;$ l" {, f/ r3 J: s3 v8 Q: b
 int c2=nCount;- z' v7 g9 j8 D  X# h6 h: j
 for(;c1&gt;0;c1--)
6 R1 C7 Y9 y- V' _+ t  {
3 k2 v$ E; i' A: B! ]) u  for(;c2&gt;0;c2--);2 h/ A; c3 P3 X' M) X
 };2 L. ^* N  x8 h$ r/ \
}
  z" ?; w% \- y0 m先谢谢了~~! X9 b7 _7 {9 q$ W" k
 ' z5 m, z6 @% z7 |' i' a
  r. J' @9 k7 E- @$ [, M8 K
楼上的问题,看我帖子给出的提示哦~
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发表:7 V4 p& z+ @; r
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。% D4 O+ N, |4 C- ]8 R/ b( M% Y3 I
 
+ V' Q/ U  @  D8 l+ R
; P. H8 a& W6 C$ y( W1 U; B多谢支持!!
abner88 回答时间:2014-3-9 13:43:20

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

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

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

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

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

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

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

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

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

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

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

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

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

  2 v+ H! Z7 A4 j- J5 y& s0 e# G8 d
鬼魅一样的Hard Fault
+ G& N$ W8 Y: o8 B2 ]. Q- L* L5 w 
% W8 Z8 y; `$ m该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
, s. S0 x6 |# W" ^0 c ! g& p1 d! t5 w3 m; e5 s2 C! x" F
咋解决?
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 手机版