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

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

[复制链接]
沐紫 发布时间:2014-1-23 14:58
>>实战经验列表
# a% g- J8 q* E# t+ o, e' d9 j/ \% ]: K

, l( Y* |! F; c# [( y社区资料下载栏目开通【ST MCU实战经验】版块,将在这个板块中,针对工程师的应用问题,ST做了详细的解答。进入ST MCU实战经验,可直接下载文档以及程序。也欢迎大家回帖交流。" [& b; J9 m# `7 R! }; H
4 @+ d9 q2 ]; s& z9 i
提示:点击各主题,进入帖子,可下载ST工程师解答详请( `& q0 K7 e; L6 z# d& G
5 i7 d9 b! l8 b8 P
6 |: ^1 H9 c# F! F- }2 e7 D
一、通信接口9 Z) M3 Y9 u7 L  a  ?
; G( n6 \2 k$ Z" W% h- \8 c
1. STM32F2x7_Ethernet(FreeRTOS)驱动更新' b# c- g1 a% [; g

2 K5 q/ }1 y/ u" Q/ a2 `2. SPI 接口发片选信号导致死机
& h5 R5 ~9 k! U. M. ]
* q4 j+ ]; T4 ~/ W! q3. USART1不能设定600BPS的波特率
$ o- k, f) f; p. M- a2 R1 [* }
5 f+ d2 K5 r8 x/ m4. I2C 接口进入 Busy 状态不能退出
2 K$ z- }9 m8 Z) D ; w4 g% T' t1 E' f9 b
5. 对 Flash操作导致 USARTU接收丢数据8 R! h) h6 x4 N. s. x- R* P
6 H3 a6 i9 N9 {/ X. Q! [
6. USB接口易损坏( V( N5 U6 A2 G- a( c, B8 `
7 D9 R5 E% i- o/ i
7. UART发送数据丢失最后一个字节0 b5 X+ x% Y, Z( w4 r
: C0 m" ?, s' F: _1 D$ A; }7 M
8. 使用 CCM 导致以太网通信失败4 H+ b+ s7 J+ v6 w& G: e
  |$ E* f+ A1 P0 u  `
9. SPI3 接口没有信号送出
6 V- @$ Y4 e, U, ?
: X4 [( ]4 E+ M6 F: W5 K10. 时钟延展导致 I2C 通信不可靠
4 @) c" G  ^( S8 {6 X/ C ( r2 a% ~/ v4 d2 V
11. M0的USART波特率自动识别问题
/ U( b. S4 d* S# w+ h
: c! o" j* |2 q  |, r4 J12. WK15 OTG做U盘主机兼容性提高
; G8 m  `5 Y* |1 w* q# E4 m2 `9 t7 i/ V
/ ]6 ^) N( }* g+ h13. 以太网电路设计注意事项5 M2 k9 N/ ]: Q1 S1 v( a
3 S" _+ `$ |' w+ a! y; T. {" t3 b
14. OUG主机库在BULK传输上对NAK的处理
! }" g) r" L/ E8 n2 a  b8 v4 c1 q : X* z1 A1 b, t! y2 ]
15. 串口断帧检测
; ]& o: ?" p3 c/ Y 3 S' g- E: h% a* G' W) d$ q0 n
16. VCP例程用于数据传输时丢失数据的处理, R* g* M8 l- C! r: w

8 i  L$ b, ]) S8 W/ ?) t+ H4 B17. STM8L051F3P6串口UART数据起始位判断的问题* f8 n# @, m& D/ v" |3 T0 a' a* A

9 I% d2 \) C3 T* E8 v" ?' [; c/ y18. STM8L152C6T6 硬件IIC,发送从地址后无ACK信号  @) \. p" D; p& k* B$ p
1 x; ~. S; B; a- n. L/ t! |
19. STM8中UART奇偶校验的使用方法
- `  w$ `" r* i1 S. P5 C
4 l. H& P) r4 f$ E% C$ `20. STM32以太网硬件设计——PHY
: c3 Z. h; f: W3 |* b9 N" r0 a1 \; ]& @/ Y+ J
21. 一个判断I2C总线通信异常原因的方法
/ \7 H# K% R5 W- }3 \, d
" n& b5 ?2 R2 {3 x3 l22. USB device库使用说明: c9 w0 @- ~: a+ I

" `( @+ t) ]" i9 ]5 j1 ^3 P23. STM32F103上USB的端点资源. k2 e9 ^/ Y( l$ L) Z" d; Z

7 `8 T, O6 a- b9 F" f+ p- r0 w24. 使用CubeMX生成TCPEchoServer程序
4 q* m1 W6 |/ W7 V# B' M$ B9 N6 e; k: f
1 }1 f& _1 s! u& ^4 U* M) m; R25. SPI接收数据移位
$ u/ B  V! q7 E+ U* A3 s
( G2 a+ s" k# u26. STM32F0中Guard Time的设置3 w8 y7 ^7 e$ J! _5 G; \
0 ~6 R1 U# [8 f
27. LwIP内存配置1 `  z: }/ w; [, b0 e  ?9 @
+ q" T. z! d4 L+ _$ s6 R8 @
28. STM32 USB Device的简易验证方法
7 C+ L3 t, P' e& e+ K9 m# a* t6 m- ]; h  p+ `
29. USART 中断方式接收无响应问题的一种情况及其处理方法* w1 c3 C5 \% q+ o6 U

3 F4 w6 ^: k; R9 V0 D6 c30. STM32 基于 Nucleo板 CAN总线的建立5 X1 U1 r1 l5 F% g9 O. Z
& @" O6 r- S8 W$ Y8 X
31. STM8 CAN总线的IdMask模式的讲解
! x$ @( D$ `: W  D) s
5 G! Q0 J0 I" n* ?" F* o' O7 H32. STM32F746ZG USB 驱动不正常 # M* ^* ?' V+ z' R
# C! o( b1 j' d' {8 H
33. MCU在STOP状态下通过UART唤醒分析 ) p1 T4 I7 w  u7 Y& D/ d/ j
/ o2 L; `/ q9 I  V! O) @
34. 通过STM32CubeMX生成HID双向通讯工程
3 B7 h  E" p3 Z7 l2 u" G; s; i( o6 x4 ?5 n
35. 串口工作在DMA模式下有时接收异常 1 i8 K" l7 k- t: J
& N, P: P! O. z
36. STM32 Bootloader中 DFU使用限制; A$ l9 z. W* }. I% i9 I7 `2 c
- I' h, N3 P1 Y9 `4 q
37. UART异常错误分析
1 e) r" N. }$ r$ j
4 S6 g8 x/ F3 d7 t* |* w. g$ V38. 基于Cube库无法检测CAN2的接收中断
" k# }, I* b; m$ g! W! @
$ K, F( Y/ u; |39. 基于STM32F7的网络时间同步客户端实现 2 I1 f7 s. @/ E7 O. V3 y* u& e

0 H5 f! ~5 o5 d, T  y+ B/ W40. HID与音频冲突问题 # h" V+ ?/ H$ ~8 d1 g# L6 V

5 ]5 ?( z2 T6 V' z+ j+ j8 F41. 在进行USB CDC类开发时,无法发送64整数倍的数据) \: [5 w4 n) L5 i& _
; H0 D7 v6 J; y7 C* u3 U) E& ~
42. 从零开始使用CubeMX创建以太网工程  b8 C( b  z; c% Z5 j

0 {7 f+ [6 A" |0 ]% ~43. STM32F4xxx的I2C总线挂起异常处理
2 `1 Q) E6 D% |6 z* y
" g* O2 Q; j: C( j8 s4 }2 w+ c44. LPUART唤醒STOP MODE下的MCU
( G% @1 Q3 f# M$ M0 m5 m
; q! U2 p$ }, m45. STM32系列 MCU模拟双盘符 U盘的应用6 z! _' {  ~% J

$ q1 b0 F) ]: b( O' z$ K/ _46. CEC输出的数据和数据长度始终不匹配: N( m1 ~6 y6 v. V0 \' s0 ^6 q
+ i$ ?' e) J) R' i$ V
47.STM8Lxxx I2C 程序第二次数据通信失败的问题分析0 c, B3 b4 ]: G5 L

5 N3 _" F4 B$ T! ~48.在进行 USB CDC类开发时, 无法发送64整数倍的数据(续); O; E3 t! T6 q
  y7 O* d4 ]; D
49. 增加UART接口应用时的异常分析4 V* X3 G+ V" N/ J8 ]/ e  H/ {

& k# Z6 v5 \0 G50.UART应用异常案例分析
1 C$ |2 M. y! I+ F  p, W, f4 W) |6 C$ c( A4 l5 \& V, V" V
51. I2C配置顺序引发的异常案例5 w+ y4 l. O$ q4 s& {) ]
' H. \- G5 b5 t3 n
52. STM32 USBD VBUS GPIO
+ ]1 B/ Z' x. O! G! g" m$ w% ]
& \( R4 Z/ ^( T" q- T1 M8 u  u53. USB传输数据时出现卡顿现象
+ L  W6 K* m, g2 q, m3 s5 O# r. o  s3 ?. X
54. STM32的高速USB信号质量测试实现
% @8 [1 v; N% N9 H& S
& X' L* b  }) w' F55. 基于STM32 I2S的音频应用开发介绍
" r. c7 H0 V4 Z6 k, }% Q; B2 J% f, q$ U  ?$ `8 i1 Y' p& o
56. HID_CDC复合设备在WIN10的识别问题  
; N6 U. m+ Q- }; O
  v' y! {2 \6 f% |) I57. STM32F767 的 USB 工作在 HOST 模式下的远程唤醒问题  
& J+ ^& Q# R+ \- x4 M' c! Z$ ?; i
58. 一个关于LPUART输出异常的问题分享    k) T6 M( Q; Z& u8 J
( Z8 Q( m6 T9 Z
59.通过 DfuSe 工具控制程序跳进 DFU 模式: R+ a6 `! J9 Q( E

* X' v' L# x) \' M$ ?# w60.UART IDLE中断使用-接收不定长串口数据 (2019·9·更新)
& x# L+ z, R1 O: m! v' V8 Q# z6 U4 n

3 n1 b: t/ i8 ]2 e7 Y7 m61.一个因初始化顺序而导致异常的话题 (2019.12.24)2 e: R! Q! z0 s9 g- Y/ z7 X& f
/ F- g* u$ p/ ~) X+ E$ W- z
62.MC SDK 5.x 中增加位置环 (2020.5.29)
/ ^, Y4 f6 Z0 ?/ M

3 s+ b' E* U; F9 }/ E63. 如何根据应用需求调整STM32L5的memory partition(2020.7.16); b; `4 \% K& Y1 R' ]) H( Q

4 l5 F/ |, \$ L8 T& a64. 使用STM32的MPU实现代码隔离和访问控制 (2020.7.16)
$ O- w, t; k. O6 X4 i: x9 i) [2 |; {; R* ^% w  O" }  [7 F
二、电源与复位
8 j: }( n* W, v$ p  } 6 t8 a& Q2 j  _$ t% y) H: G! w
1. Vbat管脚上的怪现象
7 h7 S. \! S: |: ]. t ! p* [+ _' b! L; i6 z- X
2. 上电缓慢导致复位不良- r' D  K# p# |6 {
6 l" ?, H. B8 T, Q) [. S) X( Z
3. 关闭电源还在运行% R% {0 ?" s7 d6 X$ a; Y1 |- B

. R! d, |# m; G3 t& z4. 使用STM32 实现锂电充电器
  X2 ?* o% A% p; W4 ^& {
, l7 `$ ]+ z$ u5. STM8L152 IDD电流测量
( Z6 W  m: b- [' i$ x3 j9 B$ \
$ d) c3 D6 b( J) ^/ V) ]6. STM8连续复位问题& }3 K: [: c/ L4 T
4 e* W0 z) z& r$ F5 c
7. STM32F2电压调节器REGOFF与IRROFF引脚的使用7 c1 l+ \( I- W& \7 M% D) {
- P) q. C5 g: Z
8. 使用STM8L-Discovery验证STM8L在LSI+WAIT模式下的电流
0 A# Q+ k0 v5 k8 Q; y5 W! c3 f3 ?
9. STM32F7与STM32F4的复位序列比较
; G) \  O4 d$ f7 O7 `  ~* H
1 ^2 q) Z: l3 Z# J& y% @$ `% A: L10. STM32F107 复位标志问题
( c, z- X* |  o$ O" {, w4 |/ t! v  m7 _# D" |
11. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
6 Y7 K1 N# P/ J
8 ~" `& }: Q$ K, x* b 12. Nucleo_L053不上电也能运行
, d/ h2 ]+ ~: B, U
6 Z% a$ n6 O1 ]( f8 ]13. STM32L4中STOP2模式下的漏电流! n: Q. F7 v+ t3 r; n; ^3 {
' f6 u0 l/ e; Y8 M) u' h5 w  P
14. 在没有外置晶振时HSE_RDY异常置位- y) H* j) a  h( V& p) o
: w5 ~. O& t; C8 C# \: Q/ H" \
15. FLASH被异常改写   (2018.5更新)
, @1 P5 H) T$ S1 D3 f4 B1 A
. h9 ?" V4 ~: i8 |0 }16.与 PDR_ON 有关的一种异常现象及分析(2019·2·更新)
8 Z% R. c7 p& k, f0 |- h7 r% h4 D/ ?2 e) I" ^
17.一个 STM32 芯片异常复位之案例分析(2020·2.27)
6 j2 n) O3 M2 S- o0 g: @. ]/ _' k% ?& o% X$ v0 Z
三、IAP和Bootloader
& D% J) F2 U2 H2 o- } ! C  V0 f8 l% H
1. Boot Loader与上位机通信不稳定! q! }' s5 ?% n! v' L5 V

! N: d' g$ c( [# D& |" t7 N2. IAP+APP 模式下不能启动 RTOS
3 S; v/ D7 W% x , }. i7 W, b$ F9 o9 A
3. 从 IAP Loader 向 App 跳转不可靠4 ^6 N' l( B( I1 P4 _  j

+ ~- z6 w& ^/ h! g4. STM32 MCU IAP例程跳转到APP代码简要分析% S: r! }) e5 h* Z# _' K- M4 y
6 a  E  w. ^# \5 o
5. STM32F091从自举程序向应用程序跳转的问题与解决. X- m. F- S) k3 t, `6 K
5 y9 |4 q- L6 L$ J8 g: c. B- W! O
6. STM32F09x不使用BOOT脚实现System Bootloader升级代码
. a+ t. `; G% a; Y7 T' F4 \) @2 G
7. STM32F0启动模式相关问题探讨3 M0 V  h4 X+ k, N9 w* [: i9 y

* z+ W% c4 z: k3 ~2 A8.STM32F091空片使用System Bootloader下载代码
6 P8 f, @$ p' g6 [! i8 U" _) E( r: z* W& E3 ~* a+ y
9.STM8L  IAP 应用程序中编程指导# `( ~& z. `5 k7 [

8 C$ f' S, [! t) I6 w10. 如何通过STM32的串口实现简易脱机编程器
. G0 r$ ]: O  X2 h- f2 o. ?" K  l# S- ~( f
11. 一种从用户代码调用系统存储器中Bootloader 的方法  ) G" w4 C: c) N

4 f* v. W* l- M3 E12. 利用 USB DFU实现 IAP功能
6 e" F- |5 f% Q# N$ o$ G8 w' Z7 B
5 K' E3 z' y4 o13. STM32 Bootloader中 DFU使用限制) \/ B3 P+ y6 ~, a
1 d) ]: g' `% q9 d6 @
14. STM32L011x和STM32L021x启动模式注意事项9 Y; ^3 S* n; @! G( T

" o5 v7 j$ A2 Q( @( n15. STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项
  h6 s% `% |4 m3 {0 P
- t6 _- L3 b0 X, R: y/ y% h6 Q. ^0 g16. 无法使用内置 Bootloader 的 DFU 方式进行固件升级 8 j9 Y7 B5 k0 ]7 n- E) K
; ?7 S7 B  I2 [+ a; E5 a9 _
17. 如何使用STM32NUCLEO 板来测试串口Bootloader/ f  W, I2 W( s/ R

" h7 H: v1 a, r& n18. 在STM32L011上通过I2C接口实现IAP/ m# g1 l( z  J* i
% ~) n4 o2 J) v$ @4 p7 p) i
19. 在IAR中实现通过将程序在SRAM中调试的方法
( w% s% Y; O; n7 U5 D# Q0 R+ h; `& l6 H. v8 I1 P. g  ^( h
20. STM32F769AI 同时使能FMC 和QSPI 带来的引脚冲突问题
$ A* H( D& o) E  D% j; D+ v  e0 Z+ i& G$ k. y/ Y6 a9 N3 n' ~
21. USB DFU IAP 例程移植的两个话题
1 @# ^7 A$ z- w, J# P0 n
5 s3 E+ ^% R/ S1 _/ |' G0 o; ]22. STM32F769双bank启动
2 e; M8 y+ M8 {7 q( [4 D
4 D3 J4 Z7 D  _/ C) ^  c23. DFU加载 工具 DfuSeCommand的使用: p3 v6 d0 R9 E9 k8 ^" h( ]2 ^
' t$ @* A/ \. y1 R( x
24. STM32F0 使用 DFU 升级后 Leave DFU Mode 不能运行用户代码    ) o% J. [0 D. K, @
6 L6 |6 s, {; Z; n
25.STM32F767的USB工作在HOST模式下的远程唤醒问题  (2018.12月更新)
* V" H. X. N8 b0 l, Q% G
8 M9 _+ Z. `- y5 B: m3 L26.STM32 Bootloader异常复位案例(2019.4)6 |1 _2 _- [* y2 w
# e( g% O; P7 Y8 l  N' ?
四、存储器
# t( H8 ]6 J$ @* P7 U( q0 n5 }  O
7 M8 u3 |6 h3 O  E1. 对 Flash操作导致 USARTU接收丢数据
, t( w& T% j  ]' k# d 1 W, [; b  O6 f4 L3 b, q5 Y
2. 使用外部 SRAM 导致死机
+ i1 b( x5 `0 p' H" I ( k, ~5 |& E1 x
3. SRAM 中的数据丢失& z- }/ n8 a. i+ _! K
) y6 h. z' ]7 _( h6 j
4. 干扰环境下 Flash 数据丢失4 J. y! ]$ k% Y1 y& _) ~
; A% g9 B6 e  [
5. 使用 CCM 导致以太网通信失败
( l0 F- V  U; y * W0 u- D8 x' f9 ~& I( I( K% R$ Y
6. STM32F429使用外扩SDRAM运行程序的方法
5 P' j/ w0 i. [1 r. [8 v9 L
( D: z$ V3 j2 u) @1 H# q) j7. 使用STVP实现对STM32L1系列EEPROM预置数据
  P* N+ n5 ?: @0 R% C 0 A+ @  u0 m- n* k' `% m& Z
8. FreeRTOS RAM使用情况及优化方法
  s0 [+ W& ?- B* B; I& N2 [7 t% Y( Q& _" q) K% _0 f: N1 c$ S: W
9. 在IAR 6.5下如何将数据存放至flash中
7 n! m1 K" w; S6 A+ \
( J0 B- A% N6 W1 Z10. IAR下如何让程序在RAM中运行. o! Q0 p  |, J* k5 l, S' R
! A5 \; l7 g( Y1 f2 J
11. RAM上电后初始值问题+ V1 \* @. `$ b; ?6 M4 k
; ?7 N; u( }. C% J( [
12. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
1 h0 w6 F5 ~! \
4 k+ ^; B! L" O/ N+ |# _13. LwIP内存配置9 S1 q, Z+ r  o! X0 t

* d: H9 ^$ C! Q; z  u14. STM32F2高低温死机问题2 Z  D: x9 [% [  ~- C% `/ ^
$ k; _( V4 C1 D  J/ U% U+ j
15. 使用STM32F427的CCM RAM时遇到的问题* [% z, `* y5 P4 _! X) s9 P5 A
2 @1 }7 j9 ]5 E1 h2 Z" ~3 M
16. 利用QuadSPI外扩串行NOR Flash的实现  
' O2 B# X' i7 O3 _9 G0 k9 U
* t/ E8 O/ J- c+ _$ C17. STM32擦除内部FLASH时间过长导致IWDG复位     ( {2 h! B- Z; h* Q
8 k$ s- O1 a8 ]5 Z8 Z& i+ |0 p

5 a2 ^4 j( b' A+ A6 w; E18. 基于STM32CubeMX开发U盘访问应用  (2019·6·18更新)3 v6 A! J. ]6 w4 Z4 D8 [

( A) N) ~9 L+ E: b7 }: z% d五、模拟外设
# B" r) v% B. F: \ # U2 [; \' \$ b5 D! e( W& D$ u
1. ADC对小信号的转换结果为零
  u/ G, ?) N; }& r* p
8 |/ I- v1 x" X2. ADC键盘读不准0 R6 P/ ?  e) V, W3 o2 p; g! O9 d

; o& [& e/ i+ |, ?5 }3. 扫描模式下 ADC 发生通道间串扰
* f: _0 b! d/ v( Q6 y ' V8 Q- f7 d+ N4 ~. A( M* _, B
4. DAC无法输出0V的问题分析解决$ k6 _$ t" ]+ A1 L7 v$ o2 H

( k% p2 D9 _0 x- V5. DAC无法输出满量程电压的分析解决
! L  z2 i0 d9 u& ]: A3 ~- \) K
; V& C  d# z1 Y) z" W6. STM32F30x 的ADC 采样的傅立叶变换
5 R0 n! e, [" b/ h7 Q4 x) `7 K' T% u' Z) R& i# Z. g
7. STM32 F1系列 DAC的示例详解
9 d: p+ S* H* r& `  E2 |" |# o5 b% a( w0 W+ S. C: K/ m6 S$ i/ P
8. ADC 连续模式采样浮空引脚问题% S! f; z8 I$ \0 G0 n

4 a, m% X: d: H9. PWM硬件间隔触发ADC
: Z0 s$ {0 I9 N' Q+ c3 B
/ P' l4 N- a& Z& E% N) I. z10. STM32F30x 禁止ADC 已关闭情况下再次关闭ADC
0 J0 z; q( r  M1 b3 q9 i: x* ^8 \8 l+ @* h
11. STM32L4 系列中ADC 通道配置上的区别3 s) {: p1 u! h

' A5 O& ^! Y/ X; {& n* }- C12. STM32 ADC模拟看门狗及其应用, n' _. `8 X' z) \1 S/ Y

, H& A- m% _- ~& c6 R' `13. STM32L053 comp2 比较电压无效问题 $ m, H; d6 A# N5 C( K% ~( x4 ^

( T& V  B, q: W% _/ d14. 运算放大器OPAMP在STM32L4上的应用
1 i- \" [7 _1 q4 g) W7 y- h6 e0 @* e7 M/ r/ U! G! T
15. STM32 OTA例程之ESP8266使用
4 g+ I5 C+ `3 }7 e. P* J, s# {1 t# W; I# y, K' w6 w
16.  STM32多个ADC模块同时采样转换的应用示例 (2019·7·24)
2 f% {! ?; R# @! p# t
$ K6 V/ c9 l+ `9 [$ j! `六、计数外设' F" S( \& X1 s7 T5 N2 |5 ?
. x! r  P; d3 g+ h2 @$ F. R
1. Watch Dog 失效! g  F/ O1 \& f* k+ T2 x+ }
- O0 [9 @5 p; V* p- ^
2. RTC计秒不均匀
8 ]' i! g$ Y  R# H+ ~" H1 D
  ~+ `$ }5 m( A: r# \3. 软件启动模式导致 IWatchDog 失效: |, n$ v. A: P6 s

: n! |# ~$ T% ]+ }! S! ~. ~, k4. STM32F030R8 定时器移植问题( `, C7 j7 q: y* \8 ]" {5 x6 X+ N
& S: U5 z0 _8 b5 q' K" D
5. STM32F0使用RTC Tamper的几个注意事项
3 y  D! ~( h; A3 H( ~5 U  [' D2 ?' o; ?2 _
6. STM32L053可控PWM脉冲方法之DMA2 ?( _# j# X9 O5 e( N% g
. U4 J) f: A7 v* g- s
7. CounterMode,OCMode与OCPolarity关系: ?' y3 n& `' d' ^7 E

$ n  T' O: z  q% h$ ?! a8. STM32L053可控PWM脉冲方法之DMA! w! I  [+ `6 D. Z! a: z1 J0 \
# {  j7 Q$ z% T" p6 q
9. STM32F1通用定时器示例详解—TimeBase! l2 a- T" o: H1 h. n2 S; V- n

/ e" D! s' T" a10. STM32F1通用定时器示例详解--TIM15_ComplementarySignals: U! K/ ~+ h2 F4 q8 i

# }' C  F# I4 F5 U11. STM32F334 应用于LLC + SR 的高精度 Timer 波形产生$ g+ m% G. ^$ V2 Q; }5 l2 H

+ n9 h% c7 W$ R12. HRTIMER的多种Fault事件联动机制
& p* h4 ~8 _, e) w& ]6 L ) |0 M8 U) J, Z3 q2 g. V- F- U
13. STM32通用定时器 示例详解 —One Pulse* U) J* G: D0 ]$ B
( A; X9 y. Z2 Q/ }5 L" T
14. 如何用LSE校准STM32F4内部RC振荡器: S/ d% B) a/ ^" @& z4 E+ G

5 m* _# i& A$ J7 _+ L7 E' s15. 一种使用Timer测试HSI实际值的方法! p0 k/ t8 i7 |( ?# I7 K

/ r* O$ H! |" ]1 Q: a16. FreeRTOS定时器精度研究2 t1 _0 Y7 _5 i0 H# M2 B0 G
( l1 E& ^" h  H9 H" l2 i0 I' [
17. HRTIMER产生多相相移信号
  `! V4 M7 d: c2 Q1 N9 T
0 C& v% ~& t& u, }: ?; n; O. ~/ e18. 窗口看门狗启动时异常复位问题
9 x) T" C1 W% X' P- d
% s) o  C6 }- U) g! b" n9 ]19. PWM硬件间隔触发ADC% I' m+ J: F: i# ]: V, O( Q
, D( R% [5 s( [, K0 X
20. STM32F030低温下RTC不工作
- }4 T& t3 f: I( @7 e8 V& D; o: y" l% ^: }* D. j2 U0 ^
21. 教你一手 | 基于 STM32Cube 库的 Timer 捕获应用   
7 I2 I: Z5 y+ D! D, R( H0 f- J: j: U, X3 w; \5 ~) d
22.STM32F334 应用于LLC + SR 的高精度 Timer 波形产生 (2018·9·29)
6 e4 p- ^) V) Z( a1 F7 F2 w& c! r+ s  a8 I
23. 基于STM32定时器实现定制波形的示例 (2019·7·25) : W" \) t% ?/ r4 G' V
) w# O7 K7 J$ w  G
24.STM32定时器触发SPI逐字收发之应用示例(2019.12.24)
6 L" X) h$ F( M6 z
8 N- g( _/ x7 ?1 n+ ]9 x+ d
25.MC SDK 5.x 中增加位置环 (2020.3.31)
# K" j' z6 y/ T! |4 r. r
9 h' \' g' D- T
26.STM32高精度定时器PWM输出话题 (2020.4.29), |- F) I7 ^* i) ^5 R+ \
% `2 g" r( G$ M& _  p

; t1 U4 `( P' j* v# K7 C27. 基于高级定时器的全桥移相PWM发波方案(2020.5.12)' {* v9 O* Q7 _1 t" K
: r! i7 `5 X: x4 K: i
七、内核& @! v5 A# U: q" Y3 s* J
9 u/ O% ~9 R, E* q
1. 使用指针函数产生Hard Faul% G) ~8 m7 U- S
- b0 o: u& ^% {8 W/ f4 R' {
2. 调试器不能通过JTAG连接器件- H: Z" q& x3 r2 u6 c0 @9 f
6 M$ A* O4 V* s
3. 鬼魅一样的Hard Fault
& _0 L1 z: {& E# b, {. R# y 9 s6 c5 E1 i9 v3 {( K5 g6 C1 `
4. 进入了已屏蔽的中断[' P* z* S; X, Y2 J

' H6 x, s$ x7 u' G  y. b' K5. 浮点 DSP 运算效率不高9 A* @2 ~- B0 e8 j$ Y
6 K. T9 b$ Q" t; `8 Z
6. STM32上RTOS的中断管理
( l1 S1 c3 a% m8 \& j/ }: {  }& {) x; P$ p
7. STM32F7与STM32F4的复位序列比较; R- V+ ~+ J8 n3 h% M. [* ~
$ D2 S7 L: b  l4 y
8. STM32F30x 的ADC 采样的傅立叶变换
/ w0 A/ p( b: J8 p
$ F& l  b9 |8 |1 t, r* l9. EXTI重复配置两次导致误触发中断的问题
' p! A0 K2 ?$ K7 e2 l  A! C! g$ E, S# l% F- F5 t  H
10. STM32F3xx/STM32F4xx使用浮点开方指令
  f/ o2 B' K/ }4 }7 G, m" y* N0 Y9 G& u4 x: O2 \" \
11. RMW(Read-Modify-Write)对 STM32F7xx内核运行速度的影响3 t8 A6 L# x% x; e, x! y0 ]: y5 h
$ T/ i2 |( [9 p+ o% e4 `: [! j
12. STM32F7 MPU Cache浅析  5 v# ?$ U6 _) I% C7 ?

6 q8 @; [  D3 C4 [( C( C13. STM8使用24MHz外部晶振无法正常运行  (2018.3更新)" J( p3 E7 c5 U1 O

3 X) l# C. _! \: }2 d' V14. STM32F0 不同代码区跳转时总失败…这些操作你..  (2018.6更新)" F* Y4 F7 S4 y$ I1 T# t2 g) ~2 Q

6 j2 F  e/ c, G( `& w( w- ^2 J
八、系统外设2 t' }! `4 l% C, _" O

- A; G% |" }2 D/ X3 \! V- U2 \; @. ]1. PCB 漏电引起 LSE 停振6 J6 s" O' D+ h, X

9 i4 r1 R( _1 E4 C; s2. 时钟失效后CPU还会正常运行
' O$ }4 _5 [( [0 [8 n" C3 j9 H9 {# Y: e & q3 u+ p8 x; M+ \- K& Y- R, s
3. STM32F2中DMA的FIFO模式7 \- N" R" a" R# E2 z. [4 ~

6 P" b9 j: Z8 q4. STM32L053的GPIO翻转速度的测试+ m* L5 B8 D, `. _4 q- f5 S
; B. h# \5 l9 |* }8 }/ s4 g$ P
5. STM32F4xx PCROP应用' S  j, [# I( ^5 a3 t/ F. p; K

# ?7 J0 M& G3 d& x6 G6. STM32L053的GPIO翻转速度的测试
- [  f5 N; K$ [( x- Q1 U: n8 s: t& e; D: Q3 J4 u
7. 如何在IAR中配置CRC参数
1 l. k! m; l; S1 @/ ^! Q) L# I4 j2 l% W
8. PCROP区域函数无法被调用的问题与解决
& h# ]5 Q3 Z, A/ x' K# v
4 g/ X$ O5 a. Z6 n9 ~- g- A& [9. 关于AN4065中STM32F0 IAP升级后的外部中断不响应问题
. \) k$ R& F0 ]: l9 A% l! H, L4 z; _, S# b
10. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计
5 N% N% `" I. V- S
$ n5 M) b$ f' s11. 如何用LSE校准STM32F4内部RC振荡器
% E+ O! Z0 ]3 Z: F8 m1 ^
. u/ D3 J# b2 D. _9 n12. EXTI重复配置两次导致误触发中断的问题  
: Y: ?8 l$ o, E) n# R1 t, S4 F) s' I  B# i
13. 时钟安全系统的应用(LES篇)  
, T( ?# ?$ ^2 z& x7 ?( T  O  T

4 W) J4 m# {, D$ k
14. 利用DFSDM开发PDM麦克风应用介绍  
- |+ v! H# w0 ]
* I. }6 h  H( w2 W7 H, w( z
15. STM32H7的FMC外设在DCACHE使能时运行不正常 # Q, I8 Q7 c* r) k! A( h: B# B
3 E+ e5 P- u' |# k. u& w" o) u
16. STM32H7 DMA 传输异常案例分析   (2019·3·19更新)' K6 [. g3 `4 C3 V+ @, j/ H/ y! J
  y6 {1 S1 w/ C- w" [

; y5 e# S& I  Y九、标签和收发器- k. Q7 X6 P2 U$ c' v5 E

* w( c& t; W2 p2 m1. CR95HF的初始化步骤# ^: M2 R$ \0 y" y: f) C3 T. d
8 I' Y5 z- i. s* R

7 `6 \3 a. ^/ J0 B0 \: C, C
4 {5 ?2 u; B* l. m2 m十、生态系统5 A: k9 N2 [7 K) x1 w) I, j
% _6 F/ T: Y5 M  L9 a2 G: R+ H
1. STemWin_Library_V1.1.1中STM324x9I-EVAL的RTOS工程显示不正常问题7 |( D+ i* b( T, ^7 A
0 _$ U3 b% A" E$ T/ J
2. MDK Logic Analyzer 功能在STM32中的实现问题
9 ^' U( }  z$ b3 T8 v ) B$ N7 `: a3 o# h
3. 在IAR6.5下如何将数据存放至flast中
/ L; k  q: e9 p9 J# Z
! {9 p7 t* X+ l5 g. s2 s. C4. FatSL移植笔记
. ^( Z  S+ ]* V8 T; j' d
, n' L5 @0 j* N5. Keil中使用STM32F4xx硬件浮点单元
/ O" k- `6 @" Z2 Y9 f# C
" _$ O* J8 \5 w. G" J# S% M1 j" c6. 如何生成库文件(MDK和IAR)
3 e/ t6 H( X* z$ C; M $ ]2 G( x, \, k/ u1 W; a. W, r
7. Nand Flash文件系统解决方案9 W& X- \6 K- k- n  Q! o
# J! a6 a: [; f. H3 V5 m; g: q& Q
8. STVD在调试时弹出“Cannot access configuration database”的解决
9 E' B7 P9 r  D0 S
2 q7 w9 a0 l9 N  c9. RTOS低功耗特性的设计原理和实现2 s5 m" ?" }6 g, k% b& K  e
& O3 `5 I1 W, J( F
10. IAR下使用J-Trace进行指令跟踪
% `7 x  f8 S2 R$ q* X; Y9 D+ z" L+ r4 U4 F% J  v! v+ h# s
11. STM32上RTOS的中断管理
& W; m+ h) A0 I; q
2 c" I3 k6 }; H" X' z2 m7 C12. IAR下如何让程序在RAM中运行
1 }3 Z1 T* Q/ C6 ]; \4 k6 B
5 h! C% Q4 m5 z  J; s5 e! a13. 如何在IAR中配置CRC参数
6 |5 w( i7 b0 M: B
& T: e1 h; ^" o$ `/ r& c14. 基于STM32F411 Nucleo板的Broadcom Wi-Fi开发套件的快速开始手册
- M  X8 }' q, v* V' K8 V6 ~& w- G5 O1 u% I7 w
15. 使用mbed进行STM32开发及STM32F0的时钟问题
: ?4 y2 q4 F* z7 _( d( h" n- D+ k2 U; r- V$ M$ ]8 t: Y" u4 B* C' ~
16. 使用STM32CubeMX实现USB虚拟串口的环回测试功能( ^! X3 p' M' r8 [6 o8 U8 ?
9 v# q6 Q! ]6 k4 k3 Z  `7 ?. D% e
17. 多任务系统中的不可重函数使用注意事项8 [* H' r6 ]7 e5 F9 ^# q# u9 Q

- x1 u" c. g8 ?- [- _1 g18. STM32 utility的hot plug功能
; R$ B$ d2 u- W- b. {7 f/ ?6 z# U1 l0 S/ ]" b
19. 如何将CoreMark程序移植到STM32上
/ E2 R! J7 ~, P9 ?9 P" Y6 B
6 G7 l) o4 y. S! ^0 y7 T2 e6 s# m+ Q3 Q20. FreeRTOS定时器精度研究+ n* _8 e4 ?1 h9 T0 \" W- d7 L
/ |- y+ }$ T# d1 I- |
21. 如何使用Eclipse和GCC搭建STM32环境# }$ r# f1 J5 N3 t' b

! Z" \0 m( i8 y, X; q/ S6 }  g22. 如何建立一个基于GIT的STM32库8 ^6 G( x' S6 v0 U4 w. @+ Y
8 y. |6 [' S8 C. G1 j& Y! c8 _7 }
23. 从零开始使用CubeMX创建以太网工程$ t$ Q4 I/ q& T1 D; i4 R7 j* T3 u

5 A7 g& e9 n) \7 p: v! E' w3 b24.从STM32Cube库向标准外设库移植FatFs文件系统6 T  X& ^' s9 {8 |  A% ?

! @' H# k/ `; Q; f9 @* X* c( n25. 基于 STemWin的屏幕旋转
" {% X6 E: k2 ~0 T
7 ?4 y$ l, w  c1 h26. 编译软件 Hex文件烧写 2 _. n4 `1 x+ z" G( o5 ?5 _( U
! x% B' i% D( \% a& x/ c
27. 使用B-L475E-IOT01A探索套件连接AWS IOT平台
: X" g; ?8 j0 N6 {5 Z3 W# m6 I4 Q$ ]/ u! P: n- D
28. USB CDC类入门培训
% J9 B$ z5 Q/ V6 K3 G4 D% G: V3 \5 p  y0 g  O8 B2 x2 H; b! s
29. USB DFU培训
: r6 |7 f1 q8 F5 a3 ^. L" y7 a; L. x/ Y7 Q$ s" J! X
30. 用于量产烧录的拼接Bin文件操作
+ @" H; T/ r# _+ W! Z
; r) R; P0 @6 I1 \% V& r3 E9 |31. STM32免费开发环境该用谁9 h8 L, q, o3 F( V( H( A7 X# T

5 Q9 A/ N% a  n% `0 }# w4 J, ^32. 免费全功能STM32_TrueSTUDIO_9.0  (2018.3更新). O0 i  @- R4 I
8 _8 X+ a& ~* f7 F
33. 基于STM32L4 IoT探索套件开发AliOS Things  (2018.5更新): a& i9 e, O- A1 K

  w. }7 g+ J! V/ [34. TrueSTUDIO出现 Program “gcc” not found in PATH的解决  
& f. d& f: s* D% J; H9 t
& i) L: d+ Z# Z35. STM32 FOTA 例程之 cJSON使用   
  g! P& I1 ?- e! N* X3 }8 i+ C, z" x; I1 u6 G
36. STM32F769DK 云端固件升级例程使用说明
+ b, ~# R2 P* y, a' \/ d; V

  l7 ^( s4 I5 @6 V9 k, I37. STM32 FOTA 例程之 Paho MQTTClient embeddedC 使用 4 N' U) E9 S( @3 M1 q

: w" D; _- e; `; a) r38. 基于 STM32 的阿里云物联网平台方案
5 @7 c- z% k. Q( B1 i! L0 z+ y, g7 Q) M) Y
39.AliOS 任务上下文切换原理分析  
$ m3 x2 b8 z* H- H8 H# R% h% e  T; K, i
40.STM32F334 上的 ADC 管脚和 DAC 管脚 复用问题  - N$ u' ]: _" T* J( i* h# Y1 C
; F2 p' p8 _# D
41. STM32F769DK 云端固件升级例程软件开发文档  
& C; K& o7 \- _4 G, p
' E, P/ l) I( h* i! M3 i) a2 P4 G- T  x7 R
42. STM32CubeL4 固件库V1.13.0版的RTC唤醒问题 (2019·6·18更新)& t* ?5 ]) P  G9 P

/ f0 @9 ?* W) k6 U& [& L43.使用USB虚拟网线(USB Ethernet gadget)直连STM32MP1和Windows PC(2019.9.19)5 y) g! j, m4 x# S* H# j
. H( w5 m8 r* H" ?9 M4 X  H/ I2 K
44.零基础快速入手STM32MP1 (2019.9.19)" m0 [- l. K+ Q/ B/ a  r

) ?7 N( _/ i3 F8 ~1 o2 T, c+ c45.STM32L1xx与 STM32L1xx_A的差别 (2020.4.29)3 {# P  S2 D4 C! ]* c  C$ y
+ F1 j, z) l9 B4 u
十一、调试
3 T6 w$ s" S/ a0 Y7 o! N
" x' H8 y# ]# f. L- R, |& Y1. 关于STM8S SWIM Error[30006]的分析
* o- `, R' _5 m' h. {  Y
9 v: E4 X2 _" ^4 r2. STVD在调试时弹出“Cannot access configuration database”的解决) U) c3 b$ B5 [, {

  R+ y4 }0 |$ C; ^. s# `3. IAR下使用J-Trace进行指令跟踪
5 T7 q, w( t; \7 H7 J( i + `. M; a' T9 M$ B+ \8 v$ M4 W6 E
4. 菊花链 JTAG STM32. q; U( O9 z5 J
( c' t) K$ X! ]% H9 `
5. STM32F411CEUx 能下载程序但不能执行
3 W( ^  X6 E% K# E) {  j
+ m' ~" S4 f0 c4 p4 U6. STM32F103C8T6 程序上电跑飞8 @% U9 q1 J# X& b" s. I

  D! B: N  k/ W1 O$ V' D/ `7. 使用STM32 ST-LINK Utility 设置读保护后不能运行) J2 E" L  i0 K6 Z% w

% i$ E& n9 Z  T8. VBUS引脚一段时间后管脚无法正常工作的分析和解决方法  
2 V, U+ x" K1 n. ]" u$ e$ R6 f, y8 V5 n) _0 Z: c  [! ?
9. SWIM协议的GPIO口模拟. a$ k, K* J' k- r& N
$ A3 s. P7 N" _. |, e
10. STM32F091空片使用ST-LINK烧写后复位不能运行用2 c; [2 G/ T9 Z! L+ e+ F, F5 P
8 L. _' `# T' n0 X- Y  C
11. STM32L011对空片进行编程后程序运行问题 (2019·9·12更新)3 s/ z4 O7 j* u8 x/ n8 m
+ A0 l0 C9 D- }+ K4 N
12.如何在IAR和KEIL中计算CRC值 (2019.1.2.24)
/ P: f( ]. t9 P) W1 o; `  j2 o
  N8 A7 d4 Y' S# Z6 `% g& H1 t13. X_Cube_ClassB代码移植 (2019.12.24)$ T) I8 d( w8 c0 z+ e, Y
8 n# J$ w6 @& }# V' N0 V4 |

* z+ k: H) R* q/ G$ G1 ~14.Keil中烧写STM32F750内部Flash方法 (2019.12.24)
% L" g& f1 T9 g9 O. f: a! W2 g9 z6 s- h/ @! {; R
十二、人机调试4 c. B! R+ E5 h
5 U! w/ q$ m6 b% A. T* u( Y; g1 N
1. 一步步使用STemWin在STM32上开发一个简单的应用
0 a& S1 Q( W7 b$ s* w; c( ?5 l* V( H" ]* W
2. Stem Win 驱动移植-FLASH&PSRAM(MCP)接口驱动设计# C$ B9 P" l4 b0 A0 Y' A0 J- m% J( ]

2 j5 y/ D$ r+ F) x3. GUI方案中ALPHA通道处理介绍! q3 u- g; n; P: r, w& t
+ Q7 t/ K. }  r( \
4. 基于FMC8080接口8位LCD的STemWin的移植
# B6 x) i6 {5 ]. P$ I: v8 B7 }
' [+ ~* |3 X2 }$ v* Q5 x3 G5 z5. TouchGFX中Callback模板实现原理 (2019·9·12更新)
& o: R) F) M6 r7 @. F0 u! v4 M7 X$ c8 H
6. TouchGFX快速创建滑动应用例程 (2019·9·12更新)0 K  C' v% F) m
; g: ?' O3 w4 D  \  c. l% ^' w
7、TouchGFX 简单界面设计_按键控制光圈移动(2020.2.27)
6 ]; E+ y! ^( ^9 g5 }7 |0 M5 _4 _' g. H+ T1 R
8、STM32L5中如何关闭trustzone (2020.5.12)
9 i& B; l% {6 j1 l% N, n9 j; j# @' \5 e% D; X( @5 b* o
十三、马达
: n& G0 o! ~$ i2 Q; X) K6 F$ {) c
1. 电机控制同步电角度测试说明- X9 `. q) J* |6 y: `+ ^
7 ^+ A' F" ~; \2 D! G4 L/ v  {
. r. l; q( O$ _$ U

  M9 W& o% `2 W" y2 U十四、安全
6 P/ F! k2 x8 [

$ y( U/ }8 X& h6 K8 A1. 一步一步使用STM32安全启动与固件更新(2018.3更新)
/ \' b, x2 h2 }3 }' J  i' r6 U4 y: w

3 o% c6 M- H- Z, W十五、其他
# M) e3 Z! x4 v
% B* @9 K5 \3 t5 Z7 A, x
1. 跳不出的 while 循环9 P$ k# }6 ~/ b+ [# S5 K

. B2 \5 N: ^5 A0 x, v2. 外部IC连接NRST导致MCU内部复位信号失效的问题
1 K" q( @9 z: C/ C* _0 b
  t! E0 c/ s+ h. L% D: }3. 潮湿环境下不工作
) n1 i* P# a. w3 X 3 c* {% u8 T1 r+ p6 n
4. PCB 漏电引起 LSE 停振% D: Q9 t0 W$ v2 z! }4 j

9 v; |7 y/ X+ m4 ]/ ?: c5. STM8L152 IDD电流测量
9 a: k. T5 j/ A" f- |' s6 v( y* f4 m   m, d9 M. y. f' \" b! `, s. B
6. 使用STM32实现锂电池充电器% x  l1 s( ~! E% f$ y
1 L" A( Z: q( p( J# A9 D' y
7. STM32_STM8硬件平台基本检查; X. Q5 ]; B. e" m+ d; s) V
  J# M, r& s! |0 i! g" O' q+ i
8. 验证STM32F401在STOP模式下的电流
" C. o6 _! s7 w2 H
- Y0 y" a4 w( w* M# \& P9. P-NUCLEO-IHM001 电机开发板串口调试指南( o6 y' ^& A% {( D; s% v
, Z3 i9 L4 ^+ y1 g
10. 一种计算CPU使用率的方法及其实现原理1 s" F+ V& Q, B8 j3 K5 e7 R

- O/ ?: G; {% m" c* q: e2 Y3 s11. STM32 RTC不更新原因分析
' I/ p3 v$ S* J& [4 ?
0 S$ N8 ]6 X, y# a/ ?12. 关于ST库函数的代码性能对比
3 @( y8 U" x4 T# U6 e6 w  q4 p. J0 a2 n" Q2 A4 H: x, Y
13. 在IAR中实现通过将程序在SRAM中调试的方法
" I7 u) l) Y0 X' q+ R; N3 g
% P* [& s9 {  Z: B. T7 z; o9 f14. M95xxx EEPROM写保护配置
! h" ?; p+ X/ F' M2 h8 c
: Z/ p, p0 C4 C15. 4SRxx的GPO的属性) z  c) Z$ I  ^9 F8 W) O# N- J$ h
2 U% s: r3 d% h: G( f3 u
16. CR95HF的初始化步骤
% `" _* P; y) s4 \2 E* }
. u6 J. I* [  c0 }, `17. 电机控制同步电角度测试说明  
" a: k0 M! o0 X- p# J
" u* g$ p& y1 K18. STM32+BLE通过 Notification与 Android应用程序通信的例程
: J/ R# T) m% ]9 M  v# J( V$ J+ j$ x1 x. f2 |' j1 s
19. M95xxx EEPROM介绍
8 e* }! K5 o5 @# B% V: r% g' B9 C$ T) [8 \3 c
20. STM32 DFSDM测量温度应用
0 ~5 Y! h( i$ `# M( r1 n" _/ D7 _- R2 d# h( D% F% F
21.代码实现PCROP清除, C+ \) n# s  }7 v- {% f
& G6 I0 R$ I7 P# B
22. 理解与应用MPU的特权与用户模式7 p9 j  }) C* h( k- g' q
( I+ u0 i- T0 N  r/ a
23. 用于电机控制单电阻采样PWM变形信号产生
& [) H4 m8 G! H7 g* @7 B  Y" q5 i
5 ]6 u- [+ ?( k0 w5 b% R24. STM32L低功耗模式唤醒时间测量4 C& x) r; [. l/ }
8 K% W# K6 A: [( ^5 B& Q( _( u5 p
25. X_CUBE_SPN7程序电机启动抖动问题
; x2 a" i. }0 {7 K. c) {; j0 v( _; |
26. 发现STM32防火墙的安全配置0 H, i( T6 P5 U/ u. r, W* i
0 J# M2 m- N6 i
27. ST FOC4.3库关于STM32F30x系列ICS采样代码的修改6 m- [( V9 E/ W6 m3 F: x0 a
! L; M/ r. ~! e3 |. G# K$ o* X
28. 如何用STVP 命令行模式对STM8进行批量烧写(2019·9·12更新)
$ o9 T9 U/ E" J$ r1 |% J9 X% N, `4 |) l8 e* v' m3 b: ]
温馨提示:
! C+ ^6 i2 l: D3 b! v6 \# Q7 U& l
如果您在使用ST产品过程中出现问题,欢迎在社区发新帖提问。版主和工程师网友会热心帮助您。

% p5 Y$ o" d2 n) `5 O4 W! N8 D: U/ ?7 o$ E3 B6 T: o
/ |/ d: _  E1 H' Q1 [' q8 I$ o
/ Z" d! D7 U) ?. a
: x# u1 F6 U9 ^3 c) K( H

5 [2 D* D9 o. N* E! p: K: S6 j- x" k# Y' @/ A" t
; F; x+ }/ g& U( L& P; {
4 G7 [% k, t& ^$ q' v/ P* ]
" k. `# |$ L" A; ^; l- F5 P

1 K: R7 k0 [" a# Y, n

评分

参与人数 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
好详细,多谢分享
& D0 M0 E2 F* Q
5768340 回答时间:2018-1-13 14:42:54
HI  
5 r2 ~& @+ f9 E9 q0 Q   有个问题纠结很久了。使用的STM32F205RE MCU SPI2 进行DMA 传输,数据量大的时候接收的数据会乱,直接将MISO 和 MOSI 短接测试的,代码如下:: d5 Y+ S; u; r, }4 ^! D$ o7 R9 N( Z
   期望接收到的全部为0x55 ,实际出来的是前面数据正常,后面的数据就乱了。
  1. /*****************************************
    $ ^# R1 _5 ~% D
  2. 函数名称:Cdfinger_Bspspi_init
    ( ]- Y/ N; N! c
  3. 函数作用:spi初始化函数# ^6 x6 v% z- {( I* d
  4. 备注:
    ) l( \: v( T* b3 }
  5. ******************************************/- L& Q: v) R+ ?$ C/ q' Y
  6. void Cdfinger_Bspspi_init(void)6 @' k8 z, ?! |7 {, `' x
  7. {
    ; N9 M% W: T( ?3 U! m1 E8 j; ~' M
  8.         GPIO_InitTypeDef GPIO_InitStructure;: |7 G% w! {$ b- g, k
  9.         SPI_InitTypeDef  SPI_InitStructure;
    ; M" ~1 j; [/ B' u/ V
  10.         DMA_InitTypeDef  DMA_InitStructure;
    ' u& u& h- v7 x$ X+ [% r3 y, Y, J
  11.         NVIC_InitTypeDef NVIC_InitStructure;2 C( V5 ?1 _$ _1 T6 D  B/ h
  12.   
    4 d+ l9 @1 k& o6 _( c# b2 Z( \
  13.         int ii =0;
    % `9 Q5 m7 F; b: o
  14.         5 \8 L, q3 \5 n) n7 w0 J4 A
  15.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);- U6 V0 d9 @$ n/ U, G3 ]: m' C
  16.         /*!< Enable SPI2 clocks */3 Y/ x) }0 d" Y9 v7 u  C* P
  17.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);9 y2 v+ C2 z; X% K  [# n4 W, J) i
  18.         /*!< Enable GPIO clocks */
    ) m* ~5 [0 @* B0 }' O" }
  19.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);4 O4 @+ a/ S+ i1 T6 Z6 z$ [+ B
  20.         /*!< Connect SPI pins to AF5 */
    " V: `  C7 `. v* T2 |  D$ Y
  21.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
    1 h9 }% C) K( ~$ F9 \: {
  22.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
    # g) L+ N8 ~5 y0 L2 B
  23.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
    3 S1 {( r: S$ A5 s, w
  24. 2 Q5 W4 ]6 i, u0 X2 m
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;; n: B, w$ ?! {: R# t( O
  26.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    ) r" u0 o$ z% |/ }$ W
  27.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    # f' @% F9 L1 c& `, R2 t. W
  28.         GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;
    0 c9 }  s% Y& H- p( O# m$ J
  29.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;' v5 T, i& V' @; `5 U
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);, [2 e) j- X6 s

  31. % A; k/ X1 L& g( e7 r& X+ m
  32.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;0 @% w/ Y) R% n* @4 Y/ V! R
  33.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;8 s. ]0 ]0 x7 U1 D& V
  34.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    + O& Y# E& F' e5 P6 e! ^5 s
  35.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      s* @& _* ^# O7 Y8 o$ d7 I
  36.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;
    : q: y6 g" [0 Z" M" _
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    / Y% T8 J3 J% X
  38.         Cdfinger_BspCs_HIGH();
    - t' `: O, [* `- n
  39.         //Cdfinger_Bspdelay_ms(1);4 u" K" k0 {4 k$ e1 B$ f! F
  40.   //Cdfinger_BspCs_LOW();2 L/ H& s2 v+ E9 c2 b3 k# m7 A; ~
  41.         SPI_Cmd(SPI2,DISABLE);2 P. m4 E  t+ M$ y
  42.         SPI_DeInit(SPI2);$ V: V  u# t9 Y/ q  J6 n% a
  43.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;8 v! Z% G8 d$ I6 d4 t6 ?8 w5 L
  44.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;6 X5 u* m$ ~/ L
  45.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    7 @9 j8 y, L( s! x0 Q- q/ E$ ?
  46.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    ' C+ E) T2 U4 W- E- o4 Q6 X+ c
  47.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    * F( e1 Z  l, E; K" g
  48.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//;, Z, M! y: @1 Z7 f9 n1 N; f
  49.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
    - ]  j: \6 D6 o6 g& t% r8 E, q; i
  50.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;6 n) F  ^1 O& W, U
  51.         SPI_InitStructure.SPI_CRCPolynomial = 7;
    . {2 S; r. b: `, B% X2 [
  52.         SPI_Init(SPI2, &SPI_InitStructure);) T9 g) W1 e3 d$ o) a4 d

  53. ' q& J6 s2 L) i) u- O
  54.   memset(&cdfingerimgtxbuf[0],0x55,COMMUNICATIONLEN);
    8 Y5 }2 D& r+ T, U: N% @# c" e
  55.         /* DMA1 Stream0 channel4 spi tx configuration **************************************/
    4 s% \3 K* h2 b" t0 |/ J. c
  56.         DMA_DeInit(DMA1_Stream4);
    4 y) g. j! a9 H& r" k9 n
  57.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;5 q) @0 Y/ T8 Z6 o8 g
  58.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);# f2 \/ i8 s  j+ i8 F  x2 z8 e1 P" o
  59.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgtxbuf[0];" N3 w- U/ B3 ^9 F
  60.         DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    3 a( F5 F' n8 g
  61.         DMA_InitStructure.DMA_BufferSize = COMMUNICATIONLEN;
    % ?7 _! D0 I5 w4 q8 D* @
  62.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//;
      @- [: \, l8 W
  63.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    , y" p+ |* j4 n+ y1 ?- `
  64.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;, Y0 ?2 j6 a; g8 ^8 ]
  65.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;2 E. z  y, e3 @/ H" }
  66.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ;! E8 A" R4 L) [, [  l. b
  67.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;//DMA_Priority_High;1 _+ p* D% Z/ v: Y, N5 f
  68.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//;//DMA_FIFOMode_Enable;
    : E2 `1 K+ U# h7 u. r% y
  69.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;/ [" W, v5 {9 T8 l
  70.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    ' G2 {+ [/ x; ^+ W
  71.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;& Y* Q% g, X, W4 o0 \3 {: {. N
  72.         DMA_Init(DMA1_Stream4, &DMA_InitStructure);
    % S8 Y1 q4 q' k, x% C6 v5 v
  73.   $ ~4 e, u# Q# t4 U
  74.         /* DMA1 Stream0 channel3 spi rx configuration **************************************/$ S* W2 j, F" Y( e& `6 X
  75.         DMA_DeInit(DMA1_Stream3);
    " X  F6 _* \8 {, j
  76.         DMA_InitStructure.DMA_Channel = DMA_Channel_0;1 U$ ~" ^( C0 h9 u
  77.         DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI2->DR);# Q6 b2 {/ G1 t9 c- P
  78.         DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&cdfingerimgrxbuf[0];//(uint32_t)&cdfingerimgrxbuf[0];
    : p/ H' C- @1 b$ n0 q4 m- A. @. @
  79.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;) X: w, w3 w0 U9 h, l4 L( s
  80.         DMA_InitStructure.DMA_BufferSize =COMMUNICATIONLEN;# ]" k, A& K& H$ [/ F
  81.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    , R; s2 Y$ k- N  ?" I& h
  82.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    9 a4 i3 v/ w7 C/ U
  83.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;! f* X+ I* z$ V. T/ m6 X6 U. Q7 O
  84.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
    ! Z; c( y2 L" E. p! _4 C+ M- ~
  85.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA_Mode_Circular;0 ~8 `5 \" R! {; p0 C5 v9 x' s+ s1 C2 T
  86.         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//DMA_Priority_Medium;
    3 k! Z' V/ }1 G% ?1 ^$ b- W( F& ~2 s' S
  87.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;//DMA_FIFOMode_Disable;7 c+ t5 ]9 H0 ^, A
  88.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    * _0 g4 j) _6 _' {3 k
  89.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    : u4 X  j) ^# I. d- S
  90.         DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    4 X: Q8 u6 r4 }, K7 C0 z
  91.         DMA_Init(DMA1_Stream3, &DMA_InitStructure);8 e) b" E) G3 o, l
  92.         //Cdfinger_BspCs_HIGH();  B9 `7 B) E9 k7 K
  93.        
    * e9 V) U  G6 `2 D
  94. 4 D/ R  m& A6 i4 T4 J& Z3 k2 O
  95. # g# U: C1 w  Z0 v
  96.         //发送中断) `0 m& R% U" Z+ v+ P8 S
  97.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    9 _, E  f9 |  ?4 Q# S
  98.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;     
    * U' {/ D) ?. Q2 D# L* O3 R
  99.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    - Q- t: a- I# {- A* n) ]) c
  100.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
    6 C/ L9 e/ d2 b, W- z: n
  101.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;1 J8 y6 ]# D" ]5 K3 z9 Y
  102.         NVIC_Init(&NVIC_InitStructure);
    + p+ F9 u9 S7 n0 P+ J! \! y0 B. @, _
  103.        
    ) s! F9 X& f4 Y3 X3 [6 `- [2 A
  104.         //接收中断
    5 m$ a0 m) \; Q
  105.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    ) ]( @" @: O! A3 j% }7 \
  106.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;     
    6 ?& \# D0 Z) \- h0 N
  107.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;. [- ?; W/ C' D( D6 V5 E: o+ n: T. F7 ^
  108.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x04;9 e: _, r& q/ Y! S
  109.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;. o) Q. d( s* K( t% E) U
  110.         NVIC_Init(&NVIC_InitStructure);' |) i# s+ Y6 Y8 o  G4 m
  111.         SPI_TIModeCmd(SPI2,ENABLE);, J4 n- a3 W, N
  112.         SPI_Cmd(SPI2, ENABLE);
    + W" ?' }/ s: Q! G+ ~% \
  113.         DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);  K* e* c$ g. A! }
  114.         DMA_ITConfig(DMA1_Stream3,DMA_IT_TC,ENABLE);
    2 Y% _% N9 Z+ p! N2 g7 J0 f; t
  115. - _: @) z/ {" ~3 o& C( K
  116.   DMA_Cmd(DMA1_Stream3, ENABLE);
    ' K; f& J; t! H  ^* [/ ?
  117.         DMA_Cmd(DMA1_Stream4, ENABLE);/ S5 j% j+ ]5 q0 B; Z
  118.         SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx|SPI_I2S_DMAReq_Rx, ENABLE);8 O7 i6 j( Q" M6 ]( N8 |7 r0 N" T

  119. * L4 G- N1 A0 f
  120.         for(ii=0;ii<COMMUNICATIONLEN;ii++)6 C- [( W5 h( M" N7 u  [+ |
  121.         {. ~, A7 F! T! C/ k' f  z& ~
  122.           if(ii%8==0)
    * B- F  \4 `1 E; m) C* S+ y, |0 G
  123.                 {# Q7 B6 f* _% J+ A! L) K% P& W0 t
  124.                                 printf("\r\n");4 Q9 S! m. s( F4 o( N
  125.                 }: d. L& e' E; r
  126.                 printf("  0x%x",cdfingerimgrxbuf[ii]);) v: q- H  O2 f) E! w
  127.         }
    3 c/ _8 C( S7 V) |$ Q2 U6 M/ C1 |7 \
  128.         printf("111\r\n");
      Q! Y/ Z  v6 `1 Y6 Y; Y" z% y# p
  129. }6 x  {" ?' M1 {2 L# o& f5 {
  130.   i- w3 c; l; f% B  A+ i

  131.   h7 @; d5 o" X/ z" M7 w
  132. void DMA1_Stream4_IRQHandler(void)
    3 C; r2 d# Y1 J% k* W' A
  133. {
    1 n+ T8 k$ j$ @% g( F+ ^, `/ v
  134.   if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4) != RESET)
    ) s* E# a: o" ~' _/ D
  135.   {
    , c: o8 F3 E* `3 ?! |& S
  136.           printf("DMA1_Stream4_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream4));& f) ~( b; _$ m  o7 l) S+ N
  137.     DMA_Cmd(DMA1_Stream4, DISABLE);
    ! b; U$ D; V/ C) u  k
  138.                 DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);' f. c1 T8 v6 w- w$ Y
  139.           DMA_ClearFlag(DMA1_Stream4,DMA_IT_TCIF4);: E& b7 a6 ?8 \( I' w4 j
  140.   }9 J) L: q' c" S' `( e
  141. }
    2 O& e1 c8 s/ m+ F- Q

  142. 6 G1 G9 |& e$ x! P* p4 h# U# l
  143. void DMA1_Stream3_IRQHandler(void)' f, U' C# p$ Q( w' F
  144. {& x3 u6 A/ |3 _. x" ~
  145.   if(DMA_GetITStatus(DMA1_Stream3,DMA_IT_TCIF3) != RESET)
    + z; C. n, Q- G1 n; t* Q
  146.   {
    * f* M4 d4 n( ~" W
  147.           printf("DMA1_Stream3_IRQHandler = %d \r\n",DMA_GetCurrDataCounter(DMA1_Stream3));
    , \' l( u, B" u' [; }
  148.     DMA_Cmd(DMA1_Stream3, DISABLE);
    6 J+ Y3 H$ V- h# z' W9 h8 X6 r
  149.                 DMA_ClearITPendingBit(DMA1_Stream3,DMA_IT_TCIF3);
    5 V( ^1 h$ T' O7 `* Y* e* L
  150.           DMA_ClearFlag(DMA1_Stream3,DMA_IT_TCIF3);$ N) f+ n) ?0 e+ ~  u& H2 W, z0 i
  151.   }4 K( ^; m6 o2 _' E
  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的波特率是不是必须为相同的,才能正确通信: c7 I! @- t' N" P, x/ O% J2 _
以下是全部代码:
$ ~& U  M7 T4 f7 t# Z#include&quot;stm32F4xx.h&quot;! ?. \. J! C( C
void RCC_Configuration(void);; ^2 _* t0 Z8 U3 @3 }+ I5 o
void GPIO_Configuration(void);6 S( a" d- T# f" G! V
void SPI_Configuration(void);: d" }" u- v0 E# b+ s/ G% r) A
void Delay(int nCount);4 X8 |5 T3 G9 o& v2 [
int main(void)( i0 K. D* w6 `" y$ j  x( Q
{  RCC_Configuration();
8 u2 O; E- M1 `. {  a" y- _  GPIO_Configuration();. ?  k: z. P& ?7 D8 K# x6 r( }
  SPI_Configuration();: p. p+ G" C+ B. C4 }6 c! u; G
 while(1)( s1 w. R- d& ?$ [5 v: e. W8 [3 r2 G9 y
 { int data=0;
9 _6 v" o3 \2 t$ z% t( P* B" q  SPI_SendData(SPI1,0x55);
- V: Q8 A/ V% q$ J6 u. {  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); % f# [1 D1 Y% h  A- T
  data=SPI_ReceiveData(SPI2);3 F+ V: P% v: P$ n8 l: q
  if(data==0x55)' w" W/ c4 J6 p' M. k2 a
     {  while(1)
- P  o. Q; U/ ^+ P! o1 ^' o2 W9 y: \             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);6 e' q2 B3 q8 R2 ?3 @
                Delay(0xfffff);  V4 C! u1 e4 w/ F
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
1 z/ D. R- [# J4 \7 L& g                Delay(0xfffff);3 `4 Q# O) c+ F: d) o% U4 I
   $ _# o+ m& r# y; T6 w  p$ z
             };! p8 _# k5 k: b& F& j
     }
* X: d" G, q5 b4 r) i0 t     else while(1)
/ n% _! N- ~  H            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);4 R, y6 _8 }/ ?% d, [4 v0 |
               //Delay(0xfffff);
- g6 X& e& a0 x: Z' F               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);
6 h1 x3 v1 }" z: _! |' T$ i- ^               //Delay(0xfffff);) f" H/ z* J- ?6 }
  
" R0 V3 J- u; w; }            };1 c9 E3 W  z4 I
 }
  ]! ^5 M* s, O* i4 d) ?/ j}9 c1 _5 Q. z8 C2 e
void RCC_Configuration()% j4 S: F/ G1 A2 S$ I6 X2 y3 u
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
7 H& r' N8 B! G0 ~7 Y* j0 ?1 t  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
+ |3 l1 A6 {: ]" k/ s  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
9 c( k" c% P3 W}0 o9 b# Q5 Y1 x" I+ L) B
void GPIO_Configuration()# `6 w( J1 P  \1 L
{  GPIO_InitTypeDef GPIO_InitStructure;" l) f+ J3 L9 y' s
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
% p" \" K: o+ K3 ~9 C  E" @  D! N' G  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
, X7 P' Y) q/ \# P6 v% R+ M  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
- ^7 ?+ D) r/ H% {* T9 e  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;8 z/ N( R/ w. G
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;& L$ }  ^3 O! R) Q
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);& t' w  M( H. U& f5 e+ _4 d; P
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
, U+ d2 j) |, a5 L7 S: _  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;# k  Y) f  ?$ S% c+ q3 l7 p- {- \$ f
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;: r! U* f- a, Z5 A9 a3 H
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;  H3 _8 P/ w  f
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
: n9 s: f& ^2 b5 f  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);: k' o4 y' V) N5 u5 W& D( }% ~# P
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;' J6 }7 a" e3 r  m3 s
  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);
  _: o6 e- T& |, z  ~$ s}
# ^( K8 t0 K$ Ivoid SPI_Configuration()
: F2 l5 Z% q& O' K8 p3 A0 f" I{  SPI_InitTypeDef SPI_InitStructure;2 K) d) }4 G" N/ ]& X% N
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);1 v1 c6 g" Z# m- `# i/ A4 O1 M
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);7 O* J) Y( V% O+ I/ R9 A
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
( m" s: `5 {+ K5 q: v$ l. I   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
1 k& p$ L+ l3 M" e; L  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);% S8 U: i( l8 y" R. [
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
! m4 N8 ~4 r* y% }1 p, W, \2 `  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
* y3 D) v9 A$ m- x6 J/ |  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;& U' y  t0 u  y! B
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;8 j3 b3 t: _6 R: h& j8 V; U  t
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;0 m5 j6 d' u- w+ S
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
" H  Q. {( r3 X  ^' H  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
4 @2 \' r+ N8 {/ j1 B/ T1 j- j   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  s  e6 N. Y* t* d! t   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
* p& J! l% y' a0 ?# W8 k  SPI_Init(SPI1, &amp;SPI_InitStructure);
3 _: C8 e& M( k; d8 u5 K+ v. D  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;( Q1 G/ h- j* i
   SPI_Init(SPI2, &amp;SPI_InitStructure);) R; M4 b  q" T2 c
   SPI_Cmd(SPI1,ENABLE);+ d' j# v+ \: g) r  G% i
   SPI_Cmd(SPI2,ENABLE); 
* g5 _8 T0 _6 E+ R* Y}9 g* P/ d2 X- V) b* |
void Delay(int nCount)
" M: e. P9 J& Y' ~4 s{ int c1=nCount;% t; I& w& s( f6 @
 int c2=nCount;
# M% B+ j4 `% S1 h" F9 [ for(;c1&gt;0;c1--)0 F; k! ^: D! z$ |% t0 f7 P/ @
  {
- r( t$ l4 X. w  for(;c2&gt;0;c2--);( C2 v1 k. B3 R( g& H4 z4 ~
 };% I! F0 G& H/ G8 s) m
}
5 ~4 ~- G8 k5 `先谢谢了~~
沐紫 回答时间:2014-1-23 15:22:54

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

回复第 2 楼 于2014-01-23 15:10:56发表:
0 t4 C; K$ e; A& s+ ^4 b楼主,我想问一下,STM32F4 SPI1和SPI2自通信问题,SPI1为主模式,SPI2为从模式,可是我在设置波特率时,必须按二分频,SPI2才收得到SPI1发来的数据,如果设置为其他分频情况,将卡在while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET); 这句上,还有就是SPI1和SPI2的波特率是不是必须为相同的,才能正确通信
% S3 W/ g* q6 \) w" w) ^以下是全部代码:
$ Z) Z2 m8 c) u#include&quot;stm32F4xx.h&quot;
! b( q3 ?# I" t6 c  L) X# Avoid RCC_Configuration(void);
! r0 e, u5 M! y4 ?6 lvoid GPIO_Configuration(void);' e+ L7 B8 u% A' k- m  s8 f5 B5 L
void SPI_Configuration(void);
. _+ i1 @& j- }8 o; Kvoid Delay(int nCount);
9 w8 g: S, g5 n) B/ Fint main(void)' {6 [' b0 F/ x2 Z8 k' m9 A
{  RCC_Configuration();
0 c# O6 y% B& Z. T2 U* J  GPIO_Configuration();2 [1 r4 p) j1 w' x- Z: G; t2 Z
  SPI_Configuration();5 e! E# c- X) w* i! |1 [
 while(1)$ a  P1 C% V+ g7 k  H; [0 A. t
 { int data=0;
5 k5 g, U/ E, _1 p, G4 t( D8 S  SPI_SendData(SPI1,0x55);
0 e( V+ l# J% ~, ?5 R/ x8 K  while(SPI_GetFlagStatus(SPI2,SPI_FLAG_RXNE)==RESET);
* H( ]$ E7 Y% j- n/ {5 ^+ e  data=SPI_ReceiveData(SPI2);/ ~# V3 [+ x" V" O3 Y
  if(data==0x55)
) T3 t5 q  s7 S! E     {  while(1)
- Q% E7 O& X' e3 R             {   GPIO_SetBits(GPIOA,GPIO_Pin_4);
% g. ]+ l. M$ \2 o8 r) c: o& K                Delay(0xfffff);
. }" q, U% T+ h1 r8 i                GPIO_ResetBits(GPIOA,GPIO_Pin_4);' Z+ A. v2 R/ i. B
                Delay(0xfffff);
2 q% V, |% e* O% j. ?( R  
, a' H, J: b. k* }* g5 r2 c             };, P+ @: Y  k* ~5 V( Q" L5 L; v
     }; |, ~% ^* `: {
     else while(1): p. R8 N$ I% F5 K
            {   GPIO_SetBits(GPIOA,GPIO_Pin_4);/ `) K7 s# H" H# b6 C# D
               //Delay(0xfffff);0 A7 ~' Q5 S: z: K, x7 @
               //GPIO_ResetBits(GPIOA,GPIO_Pin_5);: b) o. i7 Y0 @
               //Delay(0xfffff);
/ B8 Q# I6 d# T+ d2 t  
& g) R* O, `% [. w6 R            };
$ F2 P! b# i; k5 d3 H* t! J' ? }
8 Y. l5 U/ n8 }5 [' u" [}
; y9 [; s% R$ U0 U4 t5 P8 Vvoid RCC_Configuration()( m* X* s* E7 f) T
{  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);4 ?/ ]' B8 Z* ?- j+ b
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);% y) O0 x! B. m" Z
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB, ENABLE);  
: k; |+ m/ h3 l0 m9 E- Z}
  m+ F+ K) o% T- Qvoid GPIO_Configuration()
$ b& m8 U+ p1 s{  GPIO_InitTypeDef GPIO_InitStructure;
% ~8 y8 Q; n/ W9 K8 t  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;5 y% }; _4 |8 G0 h3 `
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;  d4 B4 y3 X: a
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;: }! k, r1 @( q
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;6 {( _8 \0 t) ]
  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;( K0 {6 n; w# W, L3 D1 \3 n
  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);
  r4 f( `, E8 U3 |9 ~  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
+ _# P7 e- o/ R3 r3 E! a5 s  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;9 n+ ~) v0 j/ l; ?( j8 f2 A. c3 }8 G
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;- j5 O# X) y+ t& b: ~
  GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
' y6 F  i; H8 a# o  GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
$ A5 G' ~& q9 |0 q3 X# Z  GPIO_Init(GPIOA,&amp;GPIO_InitStructure);* p5 K; @* e  ]5 S8 a" z2 v5 Q
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  L$ B+ `% p* D" d# K  GPIO_Init(GPIOB,&amp;GPIO_InitStructure);* o5 J' B# g3 W/ _
}* K, @0 ?3 x3 I# u5 q" a7 l
void SPI_Configuration()
3 d' M( V; b: o3 X{  SPI_InitTypeDef SPI_InitStructure;! A; _2 |; q7 d0 F& ]
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);* Y& E- T8 M5 B) H- m% H
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);: }& g+ i2 E; E
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
9 V3 s1 L8 F" ]/ ~& U. ]8 _   GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
/ f$ T( X. w- _& |1 K% [  GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
# M3 Z/ m4 Y4 {0 g4 K2 \  GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);
9 t, m' B* B+ e1 W4 c; ~) R  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
: I" R: ~0 L7 m9 j  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
. i  E! U' e- @8 i5 ?6 ?3 t  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
- K" l) n' }) ^# a0 W; y! h+ ?  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
( Y, ]3 u8 f/ [9 z  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;* i+ B3 N; }" }/ {6 e  C7 C( ^
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
1 u7 l$ n0 |4 `$ j6 K   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
) ]. \$ V7 C8 v, Q( ^" w4 V, }   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;4 C& s/ A( q/ n
  SPI_Init(SPI1, &amp;SPI_InitStructure);# G7 e' C( J5 ^) J5 \
  SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;: o$ B1 B6 I) Y% a; B( ~8 m
   SPI_Init(SPI2, &amp;SPI_InitStructure);
( L$ r: s. K8 s) D   SPI_Cmd(SPI1,ENABLE);1 e! l) Q2 @, o  G8 j) v" y
   SPI_Cmd(SPI2,ENABLE); 
# z- f( C. T3 x+ Y}& w! Z& y6 v* w  @" B$ h
void Delay(int nCount)4 M- r8 w4 B- O2 q  @( F8 R
{ int c1=nCount;. X4 k; \9 C) N7 j& @' W6 I
 int c2=nCount;
! E9 n* @* g- c for(;c1&gt;0;c1--)& ^) T8 o* O5 {& ?% g7 [
  {6 R0 z1 ^; g4 q
  for(;c2&gt;0;c2--);. M3 W/ [9 c* k: {) {/ I# t
 };+ N+ K1 E# j$ ]6 l( j0 F9 v; L; Z- i
}, U2 n7 W* n9 Z: ]) ~4 n0 b7 c
先谢谢了~~
! k9 g" R" p" z * `4 r6 V6 x+ H6 z- ?/ T/ e

/ [: j: b- j" F楼上的问题,看我帖子给出的提示哦~
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发表:
5 _7 M* W, \7 \9 h 多谢,真好的板块,学嵌入式的好地方啊,来对了,哈哈。
$ D9 [$ `2 L  }, o+ W3 [: ~( x 
- @9 s5 I5 S3 X) M, s" b
; M! H1 E* E+ o  j多谢支持!!
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 运算效率不高

  
- S# n% {# H" @鬼魅一样的Hard Fault$ j8 P0 I7 w7 ?9 O
 
" `$ g& X5 O, C7 Q  b2 G2 ~该问题由某客户提出,发生在 STM32F101C8T6 器件上。据其工程师讲述:其某型号产品的设计中用到了 STM32F101C8T6 器件。在软件调试过程中,遇到了一个棘手的问题:程序会莫名其妙的跳到 Hard Fault 中断。在程序中,产生该中断的位置不固定,忽而在这里,忽而在那里。发生的时间不确定,有时候程序运了很长时间才遇到,有时候开始运行后没一会就发生了。产生该问题的原因不明,不知如何进行排查。
) q& ?3 x& [; k 
" L9 h+ w, `4 T9 o4 }' x0 I. V: \. H咋解决?
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版