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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
. R+ n2 X; p5 U  o+ o1 L* l. s- w: H8 E; t0 T/ h- Q/ P: Q! \' \
$ }) V1 Q  i# ~: R" Y6 k2 D
社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。
! V: W- v. Q" a; l* H3 V3 g - D+ u+ x! S0 P' o% [8 F9 V$ U
提示:点击各主题,进入帖子,可下载ST工程师解答详请
; {- J) c7 C$ j# u  o" J
) B6 ^) B4 E, l, S+ m4 E9 ^. W: g' D
一、通信接口9 x5 S" ?7 `8 d9 \' ]

* m& a- `: h; y* Y4 z1. STM32F2x7_Ethernet(FreeRTOS)驱动更新
$ T, \9 B/ D" G' w4 h . S; ?& Q/ ~; h: {7 h
2. SPI 接口发片选信号导致死机4 w1 u- W3 U* k7 w$ W. Z$ I
0 s# M' ]% \5 d" R  ~; M& u
3. USART1不能设定600BPS的波特率
$ \+ N. h, t) D 9 ~  R, p$ I& j0 N
4. I2C 接口进入 Busy 状态不能退出
( a5 x' ~6 U; j* X% x) ^ 2 q6 I) A( A( G# Q/ {
5. 对 Flash操作导致 USARTU接收丢数据7 o3 Q6 ^5 @( Y8 F. U% F
& V! y! s/ J  K0 N& [
6. USB接口易损坏
0 s' S3 I4 [8 w- t% H1 D& v' U   p* e& o: P) T4 i5 T) \
7. UART发送数据丢失最后一个字节" u2 C& D$ D0 R

% o4 q4 g# y' u- w' v8. 使用 CCM 导致以太网通信失败( q  L5 f4 }5 d% Q# z; P
2 w% n0 @( N) ]. w$ U" _" f
9. SPI3 接口没有信号送出
/ i$ r6 q& N7 n! U/ O 8 z) @# |/ X6 t+ d2 n3 [
10. 时钟延展导致 I2C 通信不可靠" M6 A1 T% V$ o, D
2 z0 M" C. T8 Y! ^# y- @* E
11. M0的USART波特率自动识别问题% Y8 Z& \' I) Z* f
% J7 n$ f5 Q( M" R  b2 n7 P2 x
12. WK15 OTG做U盘主机兼容性提高. Q6 M  a# |% _/ B
. a0 _" k9 Q' N  v' F7 x
13. 以太网电路设计注意事项# V( v9 X, `- O

' |' m( q0 e; u7 j- U14. OUG主机库在BULK传输上对NAK的处理
7 J0 J  e& C- d, ?7 N9 | 0 y/ r/ P/ @9 L# ]1 p/ T
15. 串口断帧检测4 ]9 I8 c5 ^3 M- s, w0 A4 M
6 B) q# f, |$ q  O9 k2 x
16. VCP例程用于数据传输时丢失数据的处理9 x- u/ y& r  O6 }
& r# q" u) X! ~6 u" |8 D) [
17. STM8L051F3P6串口UART数据起始位判断的问题" z# `, ?3 C* b1 ?

" z' g$ S) Z4 i' G9 S- |) W  _( r: L18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号; B7 g# j0 `8 h* ]

4 i4 B" s- k- V6 U3 I6 \19. STM8中UART奇偶校验的使用方法: L5 V: Z3 ?. h! m$ P
# U1 F+ C/ ]3 J7 a: Z
20. STM32以太网硬件设计——PHY
. y- Q2 K6 R' B3 L4 V
% q, c( }9 o" m# a21. 一个判断I2C总线通信异常原因的方法( `( M4 x5 y: B5 i' t; J

6 L' Q( h1 M( E/ k22. USB device库使用说明
5 i5 K* y- h! b
3 z3 P+ T9 F3 l, w& x$ t23. STM32F103上USB的端点资源' u* a3 y/ F: Q$ E( H
8 c; _$ |+ m/ |, j* o1 V5 g$ f- v
24. 使用CubeMX生成TCPEchoServer程序6 H( m7 c1 t0 p6 G: t

7 Y; j4 W3 e$ T% F9 u25. SPI接收数据移位+ Y  K& n4 f. N' ]. V( M5 C+ t
0 L% M' {9 s; I6 \
26. STM32F0中Guard Time的设置6 ]$ t6 |* c6 T3 N* |4 `2 J7 w# Y

' a2 v* r, R/ Q2 f. K27. LwIP内存配置
3 g! W1 l! j/ N. x; ?6 @1 P1 y2 n, a& q8 w% U
28. STM32 USB Device的简易验证方法+ n; |4 o& h9 f5 C3 q  d2 a
, Q* B) j; {+ [( ^
29. USART 中断方式接收无响应问题的一种情况及其处理方法0 }) s( x' i9 u: F5 f6 F+ _4 s* T2 H; ]
- [; Y$ a8 ]# @
30. STM32 基于 Nucleo板 CAN总线的建立
4 @1 K" e: C+ ~7 ~$ e
0 F6 ?9 A+ v  J/ o& B# ^31. STM8 CAN总线的IdMask模式的讲解
, o9 M: l$ S* |1 E  M
( b, E* M( `  o! ~$ e! D32. STM32F746ZG USB 驱动不正常
" a& m' R9 T3 \! k6 v' H1 H' Z8 M. j0 Z9 f% V% l2 A
33. MCU在STOP状态下通过UART唤醒分析 / c; K, V; w+ y8 N3 p
& n+ `; `& a# v7 S; W
34. 通过STM32CubeMX生成HID双向通讯工程 ; G! ?" R7 B9 e  v$ H
5 k/ z5 R6 {: o9 u9 Q: X; v
35. 串口工作在DMA模式下有时接收异常 . t, {+ r! {$ E" i8 ?
. x6 k. g2 Q" V% [4 K6 s: s5 t! a
36. STM32 Bootloader中 DFU使用限制
2 N+ K$ J* _: E4 h6 Z& ^2 O5 D4 o( l4 i, j# N
37. UART异常错误分析
5 q) n0 V2 x1 o% Q& y1 p) x7 a: G0 x5 u2 R2 F
38. 基于Cube库无法检测CAN2的接收中断
* y4 w" R! i5 O' \7 f. }4 I; {6 f' O  b
39. 基于STM32F7的网络时间同步客户端实现 % v0 u' k' b; H4 [4 }

3 p) F* V5 G  C4 C( ?/ }. y1 a40. HID与音频冲突问题
: Z$ C) M7 n. I% K- Q/ o# d
2 [4 ^; y7 g* W41. 在进行USB CDC类开发时,无法发送64整数倍的数据  N' B" A4 O  p0 ~* y* z$ ?
# {: j0 I: D1 Z3 ^/ _! j2 z
42. 从零开始使用CubeMX创建以太网工程
4 C) q9 W* P6 i& ]4 w( O$ |" Q. N/ C* I. V% U/ D
43. STM32F4xxx的I2C总线挂起异常处理7 ~& Y/ y: q& f+ f$ N

- n- l+ M1 T5 z. [9 B- P; }7 H44. LPUART唤醒STOP MODE下的MCU
7 w9 M" O# t5 C- G& {& j: U. v* h9 D+ q) {* u  y9 t7 o
45. STM32系列 MCU模拟双盘符 U盘的应用
* |& C, ?; }; g) ]* k
* _1 Z8 @9 O- E$ P. X6 P6 H46. CEC输出的数据和数据长度始终不匹配
& O% I4 G4 s! J, s7 r, r0 m2 R" v* k
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析
. U* D& f% E' R! {2 e2 O1 M
( v, Z+ W' j/ m48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续)- w+ R+ \; v0 |' d
1 F, \. T) b# d
49. 增加UART接口应用时的异常分析2 y2 ~) \5 ?8 p" K
, `3 ^  ^3 ]% s, P
50.UART应用异常案例分析
% }& C# L& x& |+ s$ s6 l
  r$ @+ L, k1 }51. I2C配置顺序引发的异常案例# `- v" F3 q  U2 }# o) G3 u
; b2 {7 {3 o" @3 x6 F3 ~* f
52. STM32 USBD VBUS GPIO( `5 @* L! B3 O9 i9 i& C& F0 A5 L

. x0 }  j7 V! j6 U, C# H53. USB传输数据时出现卡顿现象: K0 J  P3 m, V0 G0 v* e# i
# Z, Z: f( k* w. S0 I
54. STM32的高速USB信号质量测试实现4 Q- i+ x/ H# z; g( T3 W" t6 k

9 m" S$ @0 E/ x; B55. 基于STM32 I2S的音频应用开发介绍% ^: N& s; O/ H3 T$ G* D* |
2 m8 N+ g( d8 N% k, f
56. HID_CDC复合设备在WIN10的识别问题  
0 d, S+ D) D" w+ g7 L0 e6 w5 n8 r7 l7 ?
57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  * w; v' n9 a4 j! k7 L% C/ u
8 c/ m0 |9 k0 M; h8 Q
58. 一个关于LPUART输出异常的问题分享  
6 \6 U/ F. O7 U; I! |6 z1 c$ g
- M, u! k: r: W. V
59.通过 DfuSe 工具控制程序跳进 DFU 模式
' y; ^% X# N# a# p7 X

0 B" i5 |4 q7 }: D/ d( ]$ R60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)3 q7 o2 z# A7 c6 F/ Z8 |6 e

8 c" o8 I5 S# @) t/ P) Z4 r61.一个因初始化顺序而导致异常的话题 (2019.12.24)
- v" G  Y5 b- H7 p5 y$ Y  Y8 d! v

" t3 M" v1 k# L62.MC SDK 5.x 中增加位置环 (2020.5.29)
0 k$ b5 L9 E6 D% S

/ Z" _6 A, Q/ T/ B( e63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16)
) u- c2 ]3 E3 k
, T; z# p- H5 \! h' T: m/ _* \64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)7 q( p7 a. W/ v& x+ }5 N
2 K" {  Q$ N+ r, e8 K
二、电源与复位
, X; q9 @7 x4 s) z . z" t+ Z: O' N9 p1 Y
1. Vbat管脚上的怪现象. D/ T1 ?. i9 Y  A% G

' ~  d0 E  X" C+ ^+ g3 o& o2. 上电缓慢导致复位不良/ M- T! f- ]% G" v$ _" B
' x, O$ O0 o. ?! v0 B
3. 关闭电源还在运行$ O5 ~/ Z4 U4 V; J1 c7 b9 R  x( [

; H! b' Y; d1 {# v7 y9 S" I4. 使用STM32 实现锂电充电器: d! i$ q- |5 H+ R0 p4 P* R' |
5 R( y" e! w* \, T$ w1 k2 [
5. STM8L152 IDD电流测量4 {" t' D4 m3 q1 z

, {4 r# [- ]1 M3 C& C6. STM8连续复位问题. \. G1 b) i, O0 z5 j* g% D

1 e+ ^+ r8 Y# W0 w9 I# g- F7. STM32F2电压调节器REGOFF与IRROFF引脚的使用$ H: M* T' [) }8 D
, _) d8 P8 b& u1 \8 k: M- n0 Q
8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流" d8 b+ I. I( ]
; Q$ g  H2 D) L. s
9. STM32F7与STM32F4的复位序列比较
; ?, T- f- p+ ^$ Y! F# L) e/ x8 g; Y: f, L' k
10. STM32F107 复位标志问题 2 Q- `' w/ k9 ?' u0 Y
, o$ K; s0 Z$ \2 `) w* W' J9 ]1 h
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  3 H( T: q/ ~  ^& E

1 U. s! o2 J9 U5 B( j& J$ W2 w 12. Nucleo_L053不上电也能运行
3 v, _, _" ^# R. V! |3 M1 V* s5 o# E$ t: L
13. STM32L4中STOP2模式下的漏电流. a9 w( z, ?2 ?/ H9 V" P
$ O& D9 y3 |" d4 ~& q
14. 在没有外置晶振时HSE_RDY异常置位
% Z4 y- j1 g# k8 A+ \! N  }
; [% O1 X+ }; j5 D# S9 I' W15. FLASH被异常改写   (2018.5更新)
! ]3 i0 \8 w* i% J5 b  Y& s+ J* y
' r0 `  a3 F$ a# z16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)2 R% ?! n% u3 @
3 R8 P- l# G! ^: n* L' ?' f* l
17.一个 STM32 芯片异常复位之案例分析(2020·2.27): M4 U# I8 n' U5 F, ?; `* I
6 j/ x0 F6 S. b  P7 x! e7 p
三、IAP和Bootloader- I. ?7 l' k  y7 N( U# T9 ?

( g0 C$ h5 v. i* z7 w& }$ O1. Boot Loader与上位机通信不稳定
6 r/ y" d, L; A4 L( ]
3 [3 ~2 E  ~9 x2. IAP+APP 模式下不能启动 RTOS4 |# i7 T# Y- b3 `  J
3 i/ F4 F9 S* X' Z  q
3. 从 IAP Loader 向 App 跳转不可靠
& t5 \# s3 F- M, X. x
- }, Z$ `) S5 G! H5 ]4. STM32 MCU IAP例程跳转到APP代码简要分析9 O& V- |2 S2 W; d, p
, L) y6 T/ Z) ]
5. STM32F091从自举程序向应用程序跳转的问题与解决, D8 T2 U* V( U; v+ U
1 D5 l* h$ A3 ^- y
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
, P8 Y  L+ Q# K. A7 J; {6 Y0 c# q
7. STM32F0启动模式相关问题探讨. X# m' |% l5 J) x* z5 Z" d  y
* G  E% J% Y2 b( `; O
8.STM32F091空片使用System Bootloader下载代码2 I1 E4 @. t) }9 ~- @9 [
+ b, f  c, |+ b& D
9.STM8L  IAP 应用程序中编程指导
, S; H* R9 u) @& O/ p$ T9 ^/ v
% ]+ Z2 p2 E. X6 o$ `1 t10. 如何通过STM32的串口实现简易脱机编程器3 L+ ?  H2 [9 n# p2 C! P" @
  o) I& U/ w# d: V
11. 一种从用户代码调用系统存储器中Bootloader 的方法  
4 q" g" |5 I- M0 i
3 P' G: K+ H8 ^! b8 G; v12. 利用 USB DFU实现 IAP功能
( d9 @1 a. `) D* O  q# g
% F9 E% u4 G( ]# s2 H3 |13. STM32 Bootloader中 DFU使用限制
8 i4 I" D: s& y. L7 @) h9 ?
, U3 y8 h6 S3 ]( z" u14. STM32L011x和STM32L021x启动模式注意事项
- ]# ]- Y, S7 b' }, R% Z
: A0 m$ f7 f) {2 h! x  h  E9 S15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
% C2 I# X& D* `& J" d! J
6 e5 J1 s9 R6 D6 J5 B. ?, P9 @. Z16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级
, A; i) [  ?- c1 _) d  `( S0 h. J5 `8 b' r% c3 q% ~0 _% Z1 W: h
17. 如何使用STM32NUCLEO 板来测试串口Bootloader. Y+ @' v# k5 i

  t  U* }5 t! G6 N7 R18. 在STM32L011上通过I2C接口实现IAP) l, x3 Z+ W* n7 f* k: T

2 H: Z3 [  @% w# F19. 在IAR中实现通过将程序在SRAM中调试的方法+ x) f/ L1 W$ Q, J1 r) |
4 n" _5 U6 M/ h- h% p6 L
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
1 n7 G8 F3 `" X4 e0 \* |9 g( P$ v
21. USB DFU IAP 例程移植的两个话题
" i7 |! Y: @  y4 y2 I" J8 g- K- L/ n- n8 N3 B- n5 ^
22. STM32F769双bank启动
# h9 P- F; L( a3 y
: ~+ h: Y. Q" e" r23. DFU加载 工具 DfuSeCommand的使用
( r% I. P7 e8 h: S0 l
+ H! H/ i4 t9 @( P* s24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码   
7 y" }" f, P1 U+ m
& r+ ~% b. c% l0 g" o* [# x" R+ j8 a1 P5 R25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)
2 N# S' ?7 Z% A2 C$ U
- Y1 `7 x& s2 U9 Q26.STM32 Bootloader异常复位案例(2019.4)
2 `" x2 B. r, o5 m) x8 K
  L5 _! y! C. T5 x
四、存储器
3 t  f/ j; x8 u: o7 M# V
, N# u0 O) c  s0 X2 M) n1. 对 Flash操作导致 USARTU接收丢数据
! U- x' z7 N& n# Z* N& z0 O 8 k2 f* G* o' t- b
2. 使用外部 SRAM 导致死机
3 \& U: B$ s9 m% }0 u* ?& S+ T7 b  Z. s9 m
7 ?4 f2 R5 m7 s3. SRAM 中的数据丢失
3 ~2 b& g0 W1 r. P2 o 1 {5 E0 S% S6 z4 A8 a, c0 P
4. 干扰环境下 Flash 数据丢失* w2 k, z( e. M" N* i( B
9 q8 i8 _1 d0 i8 w& v1 \$ F
5. 使用 CCM 导致以太网通信失败' I% L/ H7 c. Q! _& z

: f" \: g- r9 A/ d$ x6. STM32F429使用外扩SDRAM运行程序的方法
; K; x# r  }' l & q7 c4 J5 p% I- i6 [
7. 使用STVP实现对STM32L1系列EEPROM预置数据
. Y) W3 [7 n  G7 H+ f
4 q; Q- S( G+ z  A0 J  C' N8. FreeRTOS RAM使用情况及优化方法
+ b) O7 Q+ D6 u2 g+ N: f" y8 t, r$ Y, @0 |
9. 在IAR 6.5下如何将数据存放至flash中
4 J! _+ a% v- D9 r7 N" q3 _: @' ~3 {4 a$ C. v4 g) W
10. IAR下如何让程序在RAM中运行. ?- k; m8 H* a9 M7 \7 T

' t; e) ~+ H6 _  K11. RAM上电后初始值问题
" [; V7 r& ~: r* E5 _; d7 \- l8 u. ~) G. \# F; M$ {3 s+ H, y1 q
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计" ?& s: M3 ?% |  N

- G( P5 n  Z6 O& W9 p/ q  G0 W13. LwIP内存配置0 R" K( ^# x) X$ [  ]
+ d- {2 i* n4 i) D4 c. l" E
14. STM32F2高低温死机问题
: ^7 h) i! E- E0 k
6 P: o' j: y6 b1 e15. 使用STM32F427的CCM RAM时遇到的问题
/ X: ?6 U3 W: O, y5 e# r8 ^% Q7 O7 E4 ~; p; ?! s' O* M
16. 利用QuadSPI外扩串行NOR Flash的实现  
: G2 s% k, ]2 A& c, H8 N4 h( ]6 O! Q
17. STM32擦除内部FLASH时间过长导致IWDG复位     
" g1 g/ {/ ^& f7 b* r2 e7 Y) R  h6 ]( N
! o( G6 k1 \+ ^8 ], N
18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)
  G* f% S8 i3 q* F& Z
, V) P7 F! o, z$ Q. x* s6 v7 O五、模拟外设
& s/ P: d3 Y, b. [4 T' ]. Q) l 5 T4 n2 F3 {; u  y
1. ADC对小信号的转换结果为零
4 X! a# j5 j" o; O 7 S, ?, H* Z2 h) p' U" }
2. ADC键盘读不准
- Q0 U! U( l! r
" P3 u8 c6 ~! k! j6 |6 |3. 扫描模式下 ADC 发生通道间串扰
6 G6 W! t" G5 M, i5 B( T ' t' w# G8 T/ w# Y5 F1 R& v
4. DAC无法输出0V的问题分析解决
# b8 G. M( u3 f+ L2 R, q9 t - u( B" k0 \- a0 `! I3 H
5. DAC无法输出满量程电压的分析解决9 l, s+ `$ ]& I  u! i
+ ~1 h2 D, E1 z0 L1 c& E
6. STM32F30x 的ADC 采样的傅立叶变换: e6 h8 w5 U6 C# C

0 z" g6 a+ g0 N) N" ~$ e. B' w7. STM32 F1系列 DAC的示例详解
; _6 R6 f# R$ f6 C% `
3 I, W3 n: \! T. N8 j8. ADC 连续模式采样浮空引脚问题. S$ H! B4 K" W: ]2 r( P
9 ~; @# ^/ H; ]
9. PWM硬件间隔触发ADC
5 \5 l) M/ u( i! M, |
+ T$ {3 o/ O4 h( u10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC
1 I: x  h. v( l' @
' s  g1 c; w/ ~  u2 o11. STM32L4 系列中ADC 通道配置上的区别
, ~7 b5 v" j/ F9 S2 `4 e6 D8 m- Z+ }8 ~5 M
12. STM32 ADC模拟看门狗及其应用
) [# _. T( u" Y. Z% ~
: t" Y5 x; X: D4 ]13. STM32L053 comp2 比较电压无效问题 $ V' l: G* W( ^
* _: c  h5 r& |
14. 运算放大器OPAMP在STM32L4上的应用
( h1 ~, u, @/ g8 d8 v6 }# f* m9 E/ K" @: Q- v: _! u
15. STM32 OTA例程之ESP8266使用 " S' G) N" e5 N& T/ K* B, |

2 f# R9 l. m& Z1 |8 m" Q16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)7 k, o/ S1 Q) i, J

7 c/ a( S8 g9 q- }: E' ]六、计数外设/ T: s1 o4 ]9 R& `

2 V* R, e  t$ B: \- T1. Watch Dog 失效+ c) z! V6 z: t% u, f

. g. _2 ~8 o# [( |  _9 ^2. RTC计秒不均匀
  M5 J/ t+ M9 o" [. x4 ?0 _ / K! `' V! X7 S. Y  ^
3. 软件启动模式导致 IWatchDog 失效
, ]% V' n7 Q2 C" s1 h: x8 y0 w
" Y4 [" G1 y; k" ]* ]8 `# h4. STM32F030R8 定时器移植问题
+ k0 j' K2 G. |' [
- @+ N* _3 c2 y" W& t6 O5. STM32F0使用RTC Tamper的几个注意事项; B8 }- I# h  m$ q" w1 G) ]
" K! ~5 o. t* E
6. STM32L053可控PWM脉冲方法之DMA; B4 ^3 b5 x. |( M% G2 k6 y6 G# ]

9 a+ P1 Q9 h8 P3 _$ l7. CounterMode,OCMode与OCPolarity关系
1 K6 A/ g- ^  q; R9 v$ d- D' |7 J% y/ V- F$ I
8. STM32L053可控PWM脉冲方法之DMA. l& o" Q- G  h. K0 I( H

* q$ W: H' P# |% r9. STM32F1通用定时器示例详解—TimeBase0 J6 n+ Z) h( i" M+ C+ d
6 i( i) G& G+ Z& F
10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals* E  h2 H2 l# {0 _

: W) N+ C& J* z0 V7 E11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生
: i3 l) P8 ?) q7 v; n6 c
( f1 f& k4 x7 F12. HRTIMER的多种Fault事件联动机制
2 D( t0 H( R& r0 \* [; [ + u1 L4 V/ ?3 A$ D+ ^+ U
13. STM32通用定时器 示例详解 —One Pulse
) e- T; A# ~! f( c9 I
# R& n" @$ ^# M. t5 p% E: {- m+ A14. 如何用LSE校准STM32F4内部RC振荡器$ w/ s) n& {5 c0 g$ ?8 @

. d+ r/ B# j/ K8 |15. 一种使用Timer测试HSI实际值的方法
5 x4 m$ ^2 Q3 i" V2 X6 R. w
( {7 S, @- N5 n16. FreeRTOS定时器精度研究
5 @) {' B. d$ _& `) n& J% q2 g+ J( z/ R2 H9 n2 R: p
17. HRTIMER产生多相相移信号
0 L' q+ H% h4 |2 s+ V5 B, b( `% C% O. j
18. 窗口看门狗启动时异常复位问题
9 P6 @" b4 M  \8 `+ W) C! v' Y9 Z/ \2 B5 F2 p$ J9 {
19. PWM硬件间隔触发ADC
4 o& f+ V# P& x7 h) [: s+ P& H/ R2 ]2 E6 S( b
20. STM32F030低温下RTC不工作* }$ T2 a7 P& }9 E! s

& L5 S: b& c$ T2 R/ M+ {! `21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   % A6 M8 |9 e* l1 p
' n: N3 p2 I# k- U! V
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
  G5 Q9 P. X, Q
. B1 f+ {% l; m0 m6 T. z0 f23. 基于STM32定时器实现定制波形的示例 (2019·7·25)
% l4 h, e6 w, {; `  e, n
! _2 C+ a0 N/ F9 y' k, I/ ^24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
+ ~3 F- u1 X) h  b( [  N* h7 z
% |7 ?2 F6 s2 N: ~
25.MC SDK 5.x 中增加位置环 (2020.3.31)
% t+ {5 d0 e  x$ H, x- C
8 h0 X+ o0 t# H4 L3 y
26.STM32高精度定时器PWM输出话题 (2020.4.29)
6 V; n1 j1 b9 V$ O& I7 |1 u# q0 n+ G& Z
8 c: u% |' A& l, J% N
( e% ~# U2 J& C
27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)" ^* t0 U8 R" j+ r) B3 [. o4 N4 ]

, n+ x. j6 V4 G( D% o七、内核
4 K& D1 N" u. V' b. } 0 ?" [) n% i" V5 i, ]
1. 使用指针函数产生Hard Faul
0 ~& e7 f/ z4 y+ |5 \2 ]
0 @9 J% E$ C5 F$ g& s7 |2. 调试器不能通过JTAG连接器件
% G7 L6 I) p) H6 {& ~ 2 [# |. w% ]* B! T- q& U2 L
3. 鬼魅一样的Hard Fault  G( l; C% d% ~8 W" ~3 I+ U* ^5 i4 O
& H* F" U9 O* o8 `
4. 进入了已屏蔽的中断[2 B4 I6 S5 H; `5 L; C- t

( d# N! ?4 f2 c- _5. 浮点 DSP 运算效率不高
- c( G9 z. C3 Y/ A: {  U( U; ?' c, S/ O( o4 M  I$ Q1 j+ ~1 M
6. STM32上RTOS的中断管理
5 k. |" S$ ?6 H8 L4 ]( R
/ \- K1 |# `! `) B7. STM32F7与STM32F4的复位序列比较. A: ~" r6 V) r& Y

7 h# d4 ?5 p3 D) @9 v7 x/ L8. STM32F30x 的ADC 采样的傅立叶变换8 A; w6 q3 N% j

8 u4 e9 p" f- D9 P+ i# p# y* e: z, {9. EXTI重复配置两次导致误触发中断的问题8 O8 b# o# r7 p% H( D
) E  U% G' j( [  L9 }5 ^  c6 [
10. STM32F3xx/STM32F4xx使用浮点开方指令
8 r) l5 l4 a& y5 H# m/ [( H; r) R2 \8 R+ D* h$ k
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响/ L$ K) O/ I! [  u* ]! J

- l( U0 S. `( l 12. STM32F7 MPU Cache浅析  & O* K) [! ]9 d

: A4 D% P) O, Z% L, A13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)
; |* _* r% a' q. M5 ~  V

2 ^( K  `$ \  B$ w14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)
, e8 a/ }2 b2 J; l8 T: |; J3 _

' t. m; C! `  Y/ f( C. C# Q7 D1 ~& b' f7 }1 I# v2 n  L: u# @
八、系统外设
4 Q5 ]( C8 x# u' {% P( n# u8 _
6 f# B! U# V+ X. U: `  a1. PCB 漏电引起 LSE 停振
4 s0 O* O5 [: H( k# M  g% f
9 ]; v7 `! r! H) Q" G6 R2. 时钟失效后CPU还会正常运行
* t2 k4 y4 \7 V: p3 L- ]5 U, y
+ ]+ P0 t% ], j' n3. STM32F2中DMA的FIFO模式
$ u  {; S* ~# ^: z% D) p% ^! J5 U- S* O1 [, j
4. STM32L053的GPIO翻转速度的测试
9 O! Z% B! N3 E4 u: i' G3 |' A! H) ?7 U4 W1 `
5. STM32F4xx PCROP应用1 y/ m) `% Y' Q" T

; M4 a- e, V) k2 b0 z/ Y% [: O6. STM32L053的GPIO翻转速度的测试
5 M. f" Y7 l0 ?. H: A+ L. r
; N  _% Q: b0 M& A0 P7. 如何在IAR中配置CRC参数
' P  R1 D0 n5 L) F. l# P( F$ t1 C4 u0 \4 P& M: Q
8. PCROP区域函数无法被调用的问题与解决5 E. V8 F8 \. W" u  F
. }3 M% f' A# L
9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题$ i. U- l6 Z7 H1 U8 s- |" T2 H3 E
, O: F. ^; r% h" z
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
1 M9 ], D/ j. w* t8 f
- M& U- j% t; N1 X& v11. 如何用LSE校准STM32F4内部RC振荡器
5 N* N; C- p- z  y$ D
7 A% M$ q# @' w% q* o7 x$ Q12. EXTI重复配置两次导致误触发中断的问题  
0 L# I) }1 n% T7 o( o1 m# E
1 B5 P0 r! ]* @6 c5 I6 s4 z- K6 Y13. 时钟安全系统的应用(LES篇)  
; ?3 I" o+ u# n4 W. d! o( j

: }9 ?* g& t  t5 x
14. 利用DFSDM开发PDM麦克风应用介绍  / ]. B) G4 x5 c  d/ P
, i7 l. H- h: H) h2 c4 Z7 u
15. STM32H7的FMC外设在DCACHE使能时运行不正常
  P. R# R! }! w7 e0 m+ D! v0 v1 @
3 [2 w7 e. Z  B* N* u- [16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)
! I. J; |7 ?/ {& f% K+ u
8 S! c1 G7 B' U' P1 ^( R
, m' u4 o" w5 l; w3 R+ _九、标签和收发器
8 i7 D8 V( i$ b0 |
4 f/ Z9 {7 \! D  j1. CR95HF的初始化步骤
4 G, C/ D1 N. u4 r  O
8 C6 H; V, C6 |2 O/ E0 p
1 s( L9 L/ G/ N7 A8 s
1 N7 ~) w7 o6 y1 u. i十、生态系统
  L% [/ [+ S/ O8 b$ k. w/ ?; \ 0 q. i- v3 v: m$ [  c; G
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题
, p& h' o7 [" N) [! p
: P$ J- x! e6 Q3 L2. MDK Logic Analyzer 功能在STM32中的实现问题3 o$ G" ]2 ]* j( H9 q

" [# Q. m. s9 n. D. r3. 在IAR6.5下如何将数据存放至flast中, h/ Z' ~, a( S9 D% P$ H3 u
/ t! @& g: F; s0 H" s
4. FatSL移植笔记
# I! k; c$ e7 J6 z1 v
) ~3 z4 H( V/ {5. Keil中使用STM32F4xx硬件浮点单元9 |2 ]0 A* }! k  B
4 M/ A% f$ d+ j! u
6. 如何生成库文件(MDK和IAR)1 y( q) V6 g( R8 ]/ e3 d$ Z/ E( }
& _9 D5 Y1 m$ d4 L
7. Nand Flash文件系统解决方案) x  r& ^2 p* I7 p. R# n
9 H3 [1 {2 @; f  @" f$ Z& p0 [/ T
8. STVD在调试时弹出“Cannot access configuration database”的解决5 \, c  c) [1 @5 Q1 ]. j- m- d+ r

9 i' ~% x' b3 `$ y+ R9. RTOS低功耗特性的设计原理和实现
9 U+ b( Z9 p/ j, i, q2 S
, T! l6 K( X  `6 Y. P10. IAR下使用J-Trace进行指令跟踪6 \7 }' R' D) b& F# \
  d; U! {9 J8 \) q% ?+ Q8 A
11. STM32上RTOS的中断管理; c) L+ A" ?  p( L" C

! o) Z1 h1 C6 q8 ^12. IAR下如何让程序在RAM中运行
. {8 D, v7 a2 I7 _2 q! \* l( x, H
" J$ k5 X! h( i: ^: D13. 如何在IAR中配置CRC参数
6 t$ K5 O2 J% R7 X. i# A/ n2 G
' n5 q6 N. O4 D1 |14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册; e3 y" e5 H) t

4 x  C5 A: |& M6 H! A" `15. 使用mbed进行STM32开发及STM32F0的时钟问题
& i8 Y  N# h' U0 j9 j8 H3 q  T
0 J: d! ]4 s2 W16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能
5 t& q& |; J- I  S * R. I# x; i2 `8 E; ?; ]' L4 \
17. 多任务系统中的不可重函数使用注意事项4 z9 y; l% b) I" u

6 G4 L* v3 C* Q1 p4 r; A18. STM32 utility的hot plug功能8 v$ p- {) L* j5 T  D! N8 _

" k( |8 p% Q* r: M# d+ b8 @19. 如何将CoreMark程序移植到STM32上
* I- O  \5 _8 V" n- h
, \# l) t6 {: f20. FreeRTOS定时器精度研究
( x/ a6 B& A, q% O. e. d: w: J+ x7 s) J9 n0 L* k
21. 如何使用Eclipse和GCC搭建STM32环境
7 K- p/ P* u6 P8 S8 @8 H( _% E* Q! u* n6 a, J! j
22. 如何建立一个基于GIT的STM32库0 @' G1 h1 N. y( w

0 ^$ d  K2 F4 [5 I23. 从零开始使用CubeMX创建以太网工程. C  X8 v7 c) H% n
* q" l/ J+ {7 o
24.从STM32Cube库向标准外设库移植FatFs文件系统
% C. M) u- L; Q% B  `
4 Z6 A1 m1 e2 u+ b, B+ Q# J/ V25. 基于 STemWin的屏幕旋转! g+ R$ h$ v5 N) K2 T# @
. \. u8 N  B7 y8 @' J) m
26. 编译软件 Hex文件烧写 5 d9 k+ |. w. o9 J' X" g

5 `8 l# Z2 k& G3 f. \+ `) K27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台 . u* ]3 ?6 E7 H, ?: q" k- n+ b# Y

) q  q. c6 _' e. U28. USB CDC类入门培训
0 y) I6 M. i: [# V  o7 Z
5 [) J. K2 }0 Q/ q+ `/ F2 @29. USB DFU培训 8 L- Y2 y  ~6 e* }

6 X% u5 x! L- r: M) [2 R8 T! j30. 用于量产烧录的拼接Bin文件操作% s/ z% I  ]  ~. c- v

6 i6 ~0 x7 m( h  R31. STM32免费开发环境该用谁
2 ?& k. t+ H* O) |) R
  O7 U0 f" q) m32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新)" Q7 _* y. K" D4 @1 L% d8 J' [
) j' v. {6 `  T) B$ A3 `' ]
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新); z& |& ]5 @# t# a5 v

% J6 m: g/ v$ f1 ^* T7 S34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
4 h; X+ [! G) a1 j& K6 T+ E, s
7 Y. [; w2 |' S  Z3 ?35. STM32 FOTA 例程之 cJSON使用   + Q' [, D1 `4 l  R1 J0 {

' F0 j+ J5 _3 }2 j8 }1 ~1 a* y0 A36. STM32F769DK 云端固件升级例程使用说明 5 U# k3 `( {  Y6 k; g
8 Y; ]  N% n) r, N2 S) J+ M2 ^
37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用
! H( i; c6 j8 N6 B7 ]
! }* c+ c+ `* M7 C7 `9 K38. 基于 STM32 的阿里云物联网平台方案 9 S$ k7 M! K3 C+ ^" _

$ W0 L9 @) u* F. U3 q4 x5 |0 D39.AliOS 任务上下文切换原理分析  
  P; i$ ?7 _' [5 K) x: L
" ~) d9 Y  m1 F40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  
$ k7 v# p/ L* N7 U1 e7 R4 J% v$ X
" H4 K9 i; O9 l; V# t* c2 a0 E41. STM32F769DK 云端固件升级例程软件开发文档  0 \% a' D/ N! N  V3 Y1 {$ E& M
5 }$ x, a& |+ z9 H
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)
* x( j' @1 ^/ @! y, V7 ^
% o, b& q- e" [43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)3 k& B# P( ]/ b- z( W

9 l# R0 I( |( M  H$ v44.零基础快速入手STM32MP1 (2019.9.19)( ]$ f! ?! y1 L! S8 u# L; b7 w
& z# Z$ _4 `, [# x6 T
45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)/ b/ @1 }2 Z- o( r/ B$ o
1 m3 p( n3 W7 L5 g
十一、调试
9 v+ \& z) H" P6 }
& q: g  b& ^" _- b, X' F% v1. 关于STM8S SWIM Error[30006]的分析/ h5 }. C" [5 f

( o1 @5 \! b$ W& K& Z5 f) O2. STVD在调试时弹出“Cannot access configuration database”的解决# W+ d1 z" h, W# y8 ?6 P: S
2 k& j, O; N( a# `
3. IAR下使用J-Trace进行指令跟踪
4 T+ w, B2 B4 }# ^! a ( V" I3 w7 U4 o6 m
4. 菊花链 JTAG STM32) V: n- {# t& R' z; x$ i1 Z1 z$ D) o; B. v

# V5 ?7 f# {. m6 X& u, U5. STM32F411CEUx 能下载程序但不能执行
: W5 i1 F  l; R3 D9 d1 f+ g9 ~2 K% x* F7 c
6. STM32F103C8T6 程序上电跑飞
5 ?$ o  E7 i' M# [4 B4 @( R3 d5 r
6 X' I+ Q+ C2 c0 ~0 w! R  K7. 使用STM32 ST-LINK Utility 设置读保护后不能运行
4 R; T6 P' w: J3 d7 _' `" w4 r1 c
8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
4 A7 y) s! f/ f1 l3 }- m0 B
+ Q4 W4 m% |0 L2 S& z9 r9. SWIM协议的GPIO口模拟
# Y& K& n# n4 T& A/ B8 d' y" D6 [: r  F% \% n! l3 T% [( i4 V; w7 C
10. STM32F091空片使用ST-LINK烧写后复位不能运行用
0 V# V& t, E4 `. p$ }9 K$ x. U( D0 ^1 B" _, i. \! o
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)
: y7 i1 i$ R! Z" s) R" l
/ f' p+ b) j, F12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24): Q5 ~; q! e( H0 |# H; z5 t
/ e. F- j! Y! ~9 Q! _$ v  g0 Z
13. X_Cube_ClassB代码移植 (2019.12.24)
7 b; T9 h% U; H6 V% ?3 b8 i, h2 r2 F. Q; B. _6 d7 k' _, S

6 l$ {& \+ z; Z2 o& G4 Q8 i! Y14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)
( g/ c: [% b. u& c5 X+ D6 ~% {: _1 w' U
十二、人机调试1 \$ S/ A, Y9 D+ ]1 z1 i- R. l% y
! v+ t4 m# L. }& k& M  H( w2 u* H8 b  R9 z
1. 一步步使用STemWin在STM32上开发一个简单的应用
* k- o  C% y$ P: {: l$ D  Y  U8 o1 `" B9 i
2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计* a  R' a0 a( k$ E2 c5 b

7 R6 d* x3 N( k1 d8 }3. GUI方案中ALPHA通道处理介绍6 `$ {( I+ [6 S1 j1 h. k) ^8 X

0 T; L3 ~3 L/ b5 k) v7 _, t7 [4. 基于FMC8080接口8位LCD的STemWin的移植% q( K* D7 Z7 }& D& u' }/ `7 N

& H0 E6 v, V) d  `) X+ V4 N5. TouchGFX中Callback模板实现原理 (2019·9·12更新)% r- v# X: |  ]3 f, g
; b9 K. P# \7 D! l
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)1 c$ U- T# }6 s! ~# `! n* ]% z0 v

4 l7 J, n; O5 H8 _7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)
: g6 l1 O+ v7 ^; P' {" P% [  Y2 W4 V$ E4 d4 o2 G  f6 C+ `
8、STM32L5中如何关闭trustzone (2020.5.12)
3 Z6 a6 _* U6 e7 B' u2 ]- T7 U! E& n$ A2 f! r/ [+ F5 R
十三、马达
8 \( U' v; u0 I, ?/ e$ c3 \
' n1 _5 x3 ]; ^* D
1. 电机控制同步电角度测试说明7 b" V! s9 P- V6 b
0 G' Z& c4 @, g7 `' d, A

; q$ h; N' E4 J$ |0 W( F) O) N- j
! l* I. w. h  X6 a# m1 m# U十四、安全- l( z7 P+ f( m! e0 g1 _: F
2 a/ M$ \2 g% T: E3 V* R( V
1. 一步一步使用STM32安全启动与固件更新(2018.3更新). S& A6 F. u- J$ n0 i

3 e9 N  L& Y% c5 J& Y
8 t, f1 I- f, G8 D* T' X: `2 Q) y十五、其他) A9 s6 y. M/ D. m9 L6 v; h# s( F
' f. h  D, M' W+ I  P
1. 跳不出的 while 循环1 n2 l6 ~* \; |/ @% _! x9 S, N
( j1 m/ V/ q, V& `
2. 外部IC连接NRST导致MCU内部复位信号失效的问题* C* }5 ]/ v9 w$ b" H# h' g

0 T1 w+ z% a0 K' ~3. 潮湿环境下不工作
5 M5 h, x  t! F7 k3 C3 V9 ~
# `9 h  G5 l# R" T+ s7 O0 w4. PCB 漏电引起 LSE 停振% g1 T! t1 z- ^$ z* m4 V& F

! M5 y: x$ ]/ e! s5. STM8L152 IDD电流测量* K0 @( L9 Y/ i& B: a

' P0 o% S) m6 F: e6. 使用STM32实现锂电池充电器% P! |3 g& U8 F! y+ }

4 ?( q7 Y# H% |; ^5 D" Z! n5 T7. STM32_STM8硬件平台基本检查' h4 w. k5 E0 T4 ?7 k

% T) {* [  g7 b% a, j8. 验证STM32F401在STOP模式下的电流
$ r/ l! {4 p. {+ a3 G# w6 e0 _% Y7 N9 B
9. P-NUCLEO-IHM001 电机开发板串口调试指南) G7 Z7 S7 e) f: E/ z# `

1 b$ r/ S, s5 A1 Q' i% o10. 一种计算CPU使用率的方法及其实现原理+ d* \5 ^. F2 V7 D+ R( I, ?& N6 z. V5 B2 i& J
8 D$ A, y9 g: M5 O( ]7 ^7 t! b
11. STM32 RTC不更新原因分析$ k5 C9 o+ @7 C$ S. T8 e8 ^
0 }$ ?0 U8 s2 N* B# T
12. 关于ST库函数的代码性能对比0 Y4 W) w1 i* R# e" r. s6 g

/ `, V; V& t. I6 h  n8 F13. 在IAR中实现通过将程序在SRAM中调试的方法
! [. w* _4 ^$ {5 m3 R! ~; F
, e! V9 E3 Z0 B14. M95xxx EEPROM写保护配置
. X) @( W+ X- k) F& S
6 i! V0 [3 ]3 I$ H  w4 F2 ?, r" Z15. 4SRxx的GPO的属性/ ^4 b! [* G6 J- Q) ?
6 I* o  x9 ^& O1 W1 v# U
16. CR95HF的初始化步骤
5 }' W. D5 Y- G% T* H9 T
7 x+ K8 n# C! {5 ~17. 电机控制同步电角度测试说明  0 D: N+ O6 |; ~6 U

6 k. \5 U8 S5 d; [1 ^18. STM32+BLE通过 Notification与 Android应用程序通信的例程
! p  e7 b6 d! A5 N  G  |. ]% L9 \& e" w/ ]
19. M95xxx EEPROM介绍
( B. d5 e# u* n/ I" |2 n7 z" S/ H2 h  x8 s; s, o
20. STM32 DFSDM测量温度应用 6 z( [1 T# f6 n$ X4 J

) N/ ?& l3 s; M# o& y5 ]- D21.代码实现PCROP清除
; u- b' z: e! \( ~1 m  x
1 k8 [8 y3 R8 `22. 理解与应用MPU的特权与用户模式) X: U- a9 j5 D% T4 x
( V/ U, P$ H$ g1 m+ z9 t, A
23. 用于电机控制单电阻采样PWM变形信号产生
  a. B: Q0 k; a# V% C% Y- B
8 b$ g6 E: D, ?) G24. STM32L低功耗模式唤醒时间测量
) `$ T- |/ y* x4 J/ i5 B" }# s) U2 ^  O7 C$ C: F
25. X_CUBE_SPN7程序电机启动抖动问题
& w. e$ e, s3 u! {% H/ O. {0 O# C; b8 H: L, x
26. 发现STM32防火墙的安全配置
0 r! C2 c+ s1 D5 b7 f% y
  i# E# c4 Z: v3 O' L& K8 Z27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改" Z/ M0 I/ }* S! Y
! W. }6 B; x( l4 f
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)3 W( m! O" _% y) Y  U8 d

- U8 m& ]0 J# e0 ~5 e3 W5 `
温馨提示:
. H) r3 _' `: C0 ~
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。

, y& j9 h! d3 {2 ?
: S( l) `! l8 Y- R$ e6 _* b. R, |/ _

6 }+ W5 M6 `0 j5 h
2 g& O/ E6 C, z6 p+ B& K1 s
' ?0 D2 y0 D7 A0 T; q3 ?4 ~$ T2 X4 K: r! m! X4 ?9 x
/ O/ `2 M; j3 M8 D) x  K
7 _2 a( H+ H! C9 {" I2 F8 Q3 v
4 y% X0 @1 F: L4 \# X2 X
+ Q$ @6 K" b' p9 y5 d

评分

参与人数 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
好详细,多谢分享% f& G0 Q$ \2 ~5 @
5768340 回答时间:2018-1-13 14:42:54
HI  , A, m1 G8 ]/ R% q9 ]' @& ?
   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:2 L% J6 d& {- ^
   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************; l/ k0 L; S5 u
  2. 函数名称:Cdfinger_Bspspi_init
    ! _9 m& T' C" Y, q
  3. 函数作用:spi初始化函数  q% c9 Y, V. I) X3 g* Y0 V
  4. 备注:8 P+ R: |6 P/ _
  5. ******************************************/1 ~7 @+ ]. [3 \$ _" y
  6. void Cdfinger_Bspspi_init(void)
    $ f: x" K& f( C/ t  n- t& P+ a
  7. {: O/ h3 I6 Z8 `" g8 A
  8.         GPIO_InitTypeDef GPIO_InitStructure;+ `" q5 k$ s" `# k
  9.         SPI_InitTypeDef  SPI_InitStructure;/ p+ ?# p; a# z2 ]: a% G. w/ k
  10.         DMA_InitTypeDef  DMA_InitStructure;
    9 o9 F0 O7 A. p  g- [! N
  11.         NVIC_InitTypeDef NVIC_InitStructure;
    7 m- O. F8 g; K. O$ v% `- a: C
  12.   
    1 k) [& y: T( t4 A: S9 S: S1 v  [
  13.         int ii =0;. w6 z% u% y8 u, ?1 K: I
  14.         # ]  q* W, B1 k3 V- J( p, a
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    9 d, K" m( h3 J
  16.         /*!< Enable SPI2 clocks */; O, \/ D) k4 i
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);" H7 P* L! k5 `
  18.         /*!< Enable GPIO clocks */
    $ Y3 E" O8 n9 _- o- R6 |' h/ G
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);2 ?+ P$ K" s. c5 e7 n( g* N( I
  20.         /*!< Connect SPI pins to AF5 */9 l6 C7 U' B- ~/ }6 ?/ k% P3 \
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);! `, K4 e" M' D$ U2 A3 n/ C
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
    2 r: s) A- A" f/ @0 S
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);4 m$ J) z, s# j8 N
  24. & [6 G; q0 y1 C* e9 d/ ~
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;- g8 z# @+ W" H+ e6 h0 H1 Z
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    5 c! U# @3 O4 |# B
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;( E5 T% l) K; o" v# B4 V* `
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;) @: ~# {3 i: r7 C2 \0 i* o+ m- u$ O
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;# a0 b8 e# V( T- W9 t- f
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);& J6 O" ]3 g. n% X  G/ i$ E: Y8 d

  31. / |; `1 E  {# {! w4 Y
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;1 J" K0 d0 o1 Q9 U. X
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;: r. p5 n7 }. d( @. z+ ?7 U
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    ! w; m& v8 j  F: G! `9 S
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;; s) S  m9 L1 S  m
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;1 w/ c1 B% O9 O) }4 U# M- x
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);. k4 X3 l/ D) `  B9 C9 B
  38.         Cdfinger_BspCs_HIGH();/ q! `* Y# q5 |8 T$ y5 \
  39.         //Cdfinger_Bspdelay_ms(1);1 t6 n: a2 x" C& |+ O( W! _" ~
  40.   //Cdfinger_BspCs_LOW();3 k8 A: q( B! S; W
  41.         SPI_Cmd(SPI2,DISABLE);
    % D0 M5 [3 D* A
  42.         SPI_DeInit(SPI2);
    3 Q: @' z2 U; Y0 U
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;6 i- R) v8 h# g7 P4 ?0 ~3 G6 j
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;6 }# C4 E7 {. C( |
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;. B# C* `* F+ s* s0 U
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;7 Y* C+ E. d/ P# M
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;  H* ~8 {& p) ?  s' N/ C& K
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;/ L& e+ a/ O0 L2 T0 S" ?
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;" [* S: m: h6 z
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    / Q; m4 [. ~+ l) m. ^
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;
    " c) E% x1 h- h- ~
  52.         SPI_Init(SPI2, &SPI_InitStructure);
    " m6 s6 K3 S2 @5 ~, l$ m# e5 W
  53. 6 f3 B/ V5 Q) z4 ^3 x
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);. }# t9 Y- T% J; E6 h( y
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/  E' Q$ F; q: x9 g! J3 _
  56.         DMA_DeInit(DMA1_Stream4);
    % _% Q9 F( T. s3 O
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    7 |  x, b: T# T
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);0 e5 p# x4 j& g" a6 [( ^& l
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];
    0 e! m' @, h) p3 R
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;0 N$ l# w. z3 }
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    1 F+ S$ m) |2 D7 L& H. U
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;) K: j7 H9 @! m/ ~1 ]. M  m- T/ Z2 A
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    9 ~+ `( V8 e& }" ?) w
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;3 V3 ~6 V/ h/ o
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;/ `1 ?9 W9 c- y: ?2 A" Z3 L
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;  O9 ]0 r- d1 t+ r3 s
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;
    # j- N3 P4 q  R5 N3 p" i1 |# J: M
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    - ]6 r8 S  R( v& C
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;8 O2 E: }, f& Z: i
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    2 o6 v: O) x7 \% I4 T6 L
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    0 a3 _5 ?9 \: p) M" q6 O
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    & v1 i) [# t( e
  73.   
    ' {. ?5 A; V0 L; F- l: G
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/$ l8 h3 C6 Y9 `3 F# ~
  75.         DMA_DeInit(DMA1_Stream3);
    , c: F& I4 X) F. a
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;
      o% u; f  S9 d; b
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);! c7 e0 t. `7 W8 Y
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    " k( ^- Y4 G% t0 I* U. L
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;- u9 D: f+ V% r
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;
    ' N' s* R3 N5 {( ]/ {, M
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  T1 h. M0 M  D! Y- {8 e5 W: [4 b
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;$ h2 d$ l  V1 S
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    ' B( f  T1 ?- x* ^. `0 K* l8 k; N
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;3 r. }' d" @/ \1 a
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;' {7 q7 c6 L3 _* I# V. h- }" b
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    ( R# C# g1 D' Q  Z  ~& P* t- R
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;
    + R3 F0 ?, N3 ^" c4 K+ k
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;) f+ D. Y% a' J5 \2 k3 B
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;" |+ w9 b" b! S2 d
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;9 F. U! f3 r7 G
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);
    4 T2 V2 V  ?. N1 V
  92.         //Cdfinger_BspCs_HIGH();
    % y3 A) \1 h2 \/ i
  93.        
    . }1 `7 `0 k  S- C

  94. $ I8 v; s' M6 W
  95. 0 m3 W$ z# V& R6 @
  96.         //发送中断0 y4 ]# t4 V  s. p) o: c
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);1 R  @8 N+ t; T. }- i- a6 E
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    5 G4 q7 z% }4 K1 _
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;- ~! J- }. |* x; k' \
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    7 t9 N: d- \2 R6 h
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;+ s+ B3 j( [8 v6 ^2 `
  102.         NVIC_Init(&NVIC_InitStructure);: F  K- n  M& E* N4 \/ o0 E) n
  103.        
    $ R* r1 M3 B1 l9 F* v/ n; M9 S
  104.         //接收中断  e* t0 e  D7 Y/ l  x1 r
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);: C2 a* y. |% c3 X
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    ) Z; G& r. I4 J  M) ^# c# K
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;! j$ C. `6 P" l
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;
    8 E$ W; \+ }- N' z) M( A9 t  P
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    , l" r: t; i8 B) i' P( W( A
  110.         NVIC_Init(&NVIC_InitStructure);) C: z* _0 N+ v% b
  111.         SPI_TIModeCmd(SPI2,ENABLE);
    8 m9 I& ^; D. D+ y6 Y( v
  112.         SPI_Cmd(SPI2, ENABLE);; G: q! Q" A" E+ X( p
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);
    ) _7 E& d; ]4 G5 Z7 D5 O6 w
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);/ z! M# ]( b) b% r& r7 a
  115. 5 Q! I% l; f5 [& J
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    2 k2 c1 H5 H3 s$ e
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);
    5 L. U" J5 C! T
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);
    - v  Y4 h* u- e: t- C  _* f# \
  119. 7 U) ?. o9 g2 t# O8 }1 w# @3 \
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)
    2 w& m( g& O8 J( d6 u: c
  121.         {1 _$ X# b4 r% }$ w
  122.           if(ii%8==0)- x4 k4 S5 i+ ^4 X# B
  123.                 {1 H8 Q/ e0 `: I: k
  124.                                 printf("\r\n");- y+ c" R. c+ u4 c
  125.                 }
    8 M0 A& K$ g' Y7 [8 l$ j
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);) G- C/ Q, a1 e+ ]0 J
  127.         }
    " ]+ }9 \( I- [( v1 J5 E  y" A* F% F
  128.         printf("111\r\n");4 P) c  |1 _2 }5 Q% o
  129. }3 A- G' |! r: Z9 K

  130. 0 l9 S7 X0 R9 M& `
  131. . ~7 V# {0 O9 K9 j  W
  132. void DMA1_Stream4_IRQHandler(void); p6 n4 c  ?, Y2 `3 ]
  133. {8 B" U( S) r+ F  F
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    7 z  Y  v) d( ~! z1 u
  135.   {, T) A6 C' f1 _' c2 P& V
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));9 W* F& n3 T  i: b
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);& t7 T* ~) D  [8 g/ s$ k
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
    " E* P0 |# G( i2 c
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);8 _7 K" I" e/ _( Z# l. x
  140.   }
    ! H& X1 K5 m  _3 f6 C
  141. }5 S5 c+ ~/ i! l! g, I$ V2 F
  142. 2 x. f+ B4 W$ N) ^% e
  143. void DMA1_Stream3_IRQHandler(void)$ b6 G4 N6 ^" ]2 y
  144. {
    1 L, s3 k, c  R# o* x' U; ~5 \5 H
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)2 D' |2 h. f+ A$ S, C5 B0 W
  146.   {
    0 h) y9 s4 |1 J9 ?
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));' R+ ~0 E8 B4 M6 V9 \
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    $ ^/ ~5 A; I7 B  t" F
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    . G; R3 Y4 O" ]  k: `
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);' l- E/ M4 e/ V1 O' u4 D( J
  151.   }% D% Z: ^. t2 |7 t. z, I
  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 S' f  J! n0 r/ d8 R, u, U以下是全部代码:" S4 `. H/ n2 }2 u
#include&quot;stm32F4xx.h&quot;$ B! L9 w) Z: x+ d% j
void RCC_Configuration(void);1 B  A" Y) W! G* S- R& y. r  t. F
void GPIO_Configuration(void);! J) ?) F7 w7 Z% N
void SPI_Configuration(void);" i# [  h8 u) |% o
void Delay(int nCount);  o+ L) ^) @9 [
int main(void)' P% D( l+ p4 H; ]0 O4 [2 }
{  RCC_Configuration();
9 a% _% G# O5 B5 a" D- y! ]  GPIO_Configuration();, H1 K) Y3 h; g" y
  SPI_Configuration();
1 O! W; [$ G# L8 X while(1)  o& \) t% A# E1 P1 a
 { int data=0;, _2 D) N2 H* n* {6 M# u
  SPI_SendData(SPI1,0x55);
; N. K; m. S" j/ T( c6 l  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
( d& A- t& n1 h# K  data=SPI_ReceiveData(SPI2);- S* M3 g  t- \( Q5 V
  if(data==0x55)
/ B, E* }  E# Y     {  while(1)
# a# ]; d% }0 e& e( F3 A9 ]             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
' u" i4 Z: @8 U5 G+ w: K                Delay(0xfffff);0 e$ S' D$ G# Y- G3 u
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
( \  l- T! o& B  N2 m                Delay(0xfffff);0 I: q" o6 y7 ~1 d$ k& e) J
   4 U( V7 o, V( e& o
             };
8 X% Z& U3 h& b     }
1 u6 w1 Z. ~7 |& K) V$ b     else while(1)
; w2 k2 j- N6 Q: C- C5 p            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
! J2 B$ ~' a) h: X9 R8 H               //Delay(0xfffff);% o  B5 B! v8 q; m! D- ]9 l. b
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);4 K4 \% f6 |2 T1 T; r# e( p
               //Delay(0xfffff);
- x  L# z5 o0 Y) n8 N# p" x1 y  
5 x0 J, ~; ?$ W9 X- B8 n            };
% d! B6 J( y7 N2 _ }. p, _+ j7 O+ x6 h# A& f( r3 s! M
}$ T& [; y. a. k: X, I3 y5 R  r
void RCC_Configuration()
$ P4 @$ }4 Q# q! c" h{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);  G) V9 u8 S) p
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
) U& Z9 }0 X( }" @: X) v1 Z: I6 U  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);   ; A* ]$ F8 J* w
}% X- x4 l7 Z# U' |9 q& {
void GPIO_Configuration()
; N& S5 `- ~$ W) U) m{  GPIO_InitTypeDef GPIO_InitStructure;* U; ~: N. O9 S) C6 [
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
, D5 |, r0 Q. `. Z  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
+ C( ^/ [! U6 o- ]  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
$ u1 W2 M' ]+ e$ k  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
' R) g, N& j! a" Y7 m0 @  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
/ H- i7 E+ K0 S& v  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
: F( K3 |; s3 r" O( L! o9 Z2 f  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;: b* d8 T! z( I* j/ a8 ~( s( x" a
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
9 o" K* R2 V9 s  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;+ K( N4 l# {, [) r
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;, d' w" \  @  a# T3 w: `* U
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
  ?8 S' C; l' a7 _8 D: ]  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
5 l1 Y# u- ~; L" ]. m  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;6 C! F1 M2 C, t1 Y
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
9 v+ H6 ~# j4 i+ T3 }/ P9 M}% K/ v2 s, r; v
void SPI_Configuration()
6 d' i/ r" I5 I1 ?6 _  V{  SPI_InitTypeDef SPI_InitStructure;; c2 K: g0 f7 k8 i1 z
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);( G* V, R- g: h
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
6 P) |; A- P" f3 }6 T; b4 F6 z/ W  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);5 a; U1 ]1 S% ]1 T9 G
   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
5 j- H5 q9 c; x$ ?6 M6 S  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);5 H' {' g( z$ @3 E/ N" E
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);% Q: W+ X) u+ j( P3 x
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;8 }3 R4 O5 z5 {
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  G8 W; I' N8 [  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;4 I, @- n* }$ e
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
4 w: A5 }9 |( G& W7 Z8 ?  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;3 m/ k2 ?: h/ B/ d9 h  p
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
! b* {; o5 r/ h" k9 X" _   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;& y2 h0 U; H4 ^: o
   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;- n+ I) S# a8 U7 x/ ^7 E
  SPI_Init(SPI1, &amp;SPI_InitStructure);: F2 @( g) u/ I: a/ f
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
# w3 i2 s3 z- |% z$ Q4 m   SPI_Init(SPI2, &amp;SPI_InitStructure);
) {9 R3 s- S$ N   SPI_Cmd(SPI1,ENABLE);& b9 s- b2 k! O
   SPI_Cmd(SPI2,ENABLE); 
0 }/ K0 ?! M: D}) u$ P3 G) [' r; W" S- |$ a
void Delay(int nCount)
/ `: `1 D8 V) x0 Q3 q2 j8 A6 Q{ int c1=nCount;- h$ d# N& c$ Y+ u, x; a4 ]$ \
 int c2=nCount;
4 o# O/ e2 u5 Q# u8 p  F for(;c1&gt;0;c1--)
5 X! ]: ^+ k* m' h4 V  {
6 ?, j1 x0 B+ y$ g6 U  for(;c2&gt;0;c2--);
8 [0 g# E7 }8 P3 Y0 ~ };
' q3 V: y( s7 s0 O) V$ J/ p}3 D( I8 a0 w/ r0 x; C+ [1 E* q
先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:4 w/ ?$ j5 J, e+ m6 M7 O
楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信4 ]/ @7 u- `* @& ^/ t
以下是全部代码:
$ @+ E  w% E5 p! X9 B$ X! K  D#include&quot;stm32F4xx.h&quot;9 S9 R2 P% m! Z) O+ Q
void RCC_Configuration(void);
! F3 w9 X% N: k! e+ _void GPIO_Configuration(void);
* O' M" b/ F9 e9 n* ~void SPI_Configuration(void);5 Z8 d6 w  u& m  k1 I
void Delay(int nCount);+ ~, e+ r9 M1 ]% V3 T. F* d
int main(void)+ [% d5 Z) h5 I) w$ A
{  RCC_Configuration();5 F: B% m1 H+ h8 T- E! ]
  GPIO_Configuration();
* i- K5 s) K+ \  R9 A- l  SPI_Configuration();! C5 D" s# O( Y
 while(1)
! Q; f+ F6 L  g0 H { int data=0;
: T8 j4 L6 H9 m  SPI_SendData(SPI1,0x55);
& ]* d& o4 N/ z" [3 G2 A# b: m  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
. m+ b' v: A, d9 e- y4 G2 n  data=SPI_ReceiveData(SPI2);
0 H7 i: J0 S1 L, \  _, x" B; X  if(data==0x55)
0 o4 X# a/ l) V     {  while(1)
8 @+ T# K- P2 t" x7 t; T9 \' i             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);  `, y0 f) l) O8 S
                Delay(0xfffff);$ T7 X9 B. k; t6 r, u7 Q! C6 _
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);; Y3 N' y$ L+ y0 v3 v
                Delay(0xfffff);% _( e% A" g! |' a
  
, H6 u1 J% @1 @6 e9 T' y             };
, k* H* |  L+ t2 @" a2 t     }, Y- O9 z5 M8 ^+ h
     else while(1). P- _. _( n9 _
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);# e% `* H: X7 H
               //Delay(0xfffff);, N: K$ m. w& d- S% ^
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);& n! _0 _7 Q4 p7 r6 k9 Z
               //Delay(0xfffff);
! W0 _8 `: q2 n: @5 W4 o+ P  
) i6 W9 C& D! U6 w7 N            };
! g: v2 e& a: d/ C& V }
4 n5 n% c7 z8 Z" N; ?}! N1 ?; [/ d# ?9 }
void RCC_Configuration()3 X/ [9 ^- e' g2 T/ g
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/ T/ B  ^9 `& u$ n* d
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
( W9 w% ^* l1 G0 N. N% I$ s  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
" x0 {& _7 C; d0 a0 X}( @5 M7 ?3 c6 {/ ]
void GPIO_Configuration()+ S4 k8 r* c+ \7 D
{  GPIO_InitTypeDef GPIO_InitStructure;
: s! Y$ m  ?) A' f  H/ x  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
+ ?3 P! ]: a0 M  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;; z2 `1 A' j+ }5 I6 a
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;. k8 z) K) D/ s# D) ]& Q! B# K3 z
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
" }7 Z, H' G0 m3 H. e% F  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
5 ~: p: t# X$ X% ^  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
# ^4 S7 L6 a9 Q  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;; V, j# i# i$ z/ j! h8 [
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;! [, l* j# T7 w3 ~  a) ^: _) X+ Z) B, o
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
6 N  o1 P/ |* M' g! `3 I0 b  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;$ N# C2 E, A+ t) S8 t2 r
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;2 R0 W* W$ G7 K4 A" D; X
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
7 b  _% T) K0 {& z5 \+ g6 C6 x7 X  i  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
% v0 J$ M' x0 c; m. N) F2 G  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
2 U3 r8 V" [3 X& L}# @# w  L8 o5 M# k2 s( A( _1 ~
void SPI_Configuration()+ d( x3 \' z# t% D# k
{  SPI_InitTypeDef SPI_InitStructure;
; O. g& C& E: \: C* i  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);- m& c) R. i. x/ q
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);: I+ }" N5 G; r8 x4 A0 _
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
5 x& O6 [& ]* P   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
" d  L7 I" k8 d6 f. [8 T+ N  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);, l- v1 i. `: O3 a) I
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
& b# w' k9 z5 N8 Q+ @! k  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  d3 p& {' i6 x, z0 Y% a7 Z$ A% J  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;- l" u. u5 U- r8 s
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;1 ^; r) Q+ A4 t9 ~5 k4 c
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;9 y6 a  i' B& t
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;2 \0 |" K; g+ G& w% I
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;! e- C  E6 ]) S2 ?5 L# n
   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
4 z: W! G/ r8 j3 P2 H0 h   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
8 F! c( D& |* D3 G4 \2 p8 P  SPI_Init(SPI1, &amp;SPI_InitStructure);; h! O7 P) m( Y5 O' W; l
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
7 V2 ~6 u, S& {& U' o6 @   SPI_Init(SPI2, &amp;SPI_InitStructure);/ A3 P8 f$ v# Y& W2 Y' o/ o1 K
   SPI_Cmd(SPI1,ENABLE);. _& l5 ]: \5 [# ~/ V9 w
   SPI_Cmd(SPI2,ENABLE); . {0 y+ \- j8 G6 r1 d. H
}: y4 D: c+ r. C
void Delay(int nCount)
' ]9 W% Q, F/ l: Z$ F( Q  g7 m* D{ int c1=nCount;
5 x6 x% M- p: \+ [6 k8 D int c2=nCount;
! m" y/ |& q5 }3 K7 L for(;c1&gt;0;c1--)
3 E, F( A1 p. T2 O  {) G7 m7 t8 |0 g  x3 ?8 Y5 O
  for(;c2&gt;0;c2--);/ i( U: I  j5 m. y; B- I
 };" F4 u" r. i+ N( v
}
, M5 c) I; O- C, T8 ]. d) ~先谢谢了~~
8 q( ~! K6 I3 w$ m4 p+ I, l2 d& B / D6 X  g2 G3 m( H

1 `3 P5 t+ @& h/ @' d$ m7 E+ [楼上的问题,看我帖子给出的提示哦~
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发表:( U2 C7 ^2 }  X& e
 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
, q3 Q! \% D0 J 
1 a6 o7 u6 B/ y8 U. Z' Z' q" W* z' a
多谢支持!!
abner88 回答时间:2014-3-9 13:43:20

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

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

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

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

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

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

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

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

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

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

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

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

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

  7 t# g) E0 s  s# c/ R4 z( L
鬼魅一样的Hard Fault
- l8 C5 L6 _3 Y3 y. Z" j % H+ y, _! O7 x. k& e. J5 i2 P2 h$ p
该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
" N# t6 m7 H$ ~8 a+ t4 a5 f 
" ]# t! E1 _4 U. o4 i咋解决?
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 手机版