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

STM32奇怪问题处理及驱动库 BUG 汇总(持续更新中)

[复制链接]
STMCU-管管 发布时间:2020-11-16 14:43
STM32奇怪问题处理及驱动库 BUG 汇总(持续更新中)
2 ^$ X% U( b3 t( L) G
% D$ a; C1 t+ L# p% u: [
在使用 STM32 的 MCU 开发过程中,难免遇到各种各样的奇葩问题。或许是开发环境的问题,或许是 MCU 使用的问题,也或许是驱动库的 BUG 等等。这些问题可能不局限于某一种具体型号的 MCU,特此把遇到的问题记录一下!
( j! H3 g( b) v0 W' ^/ X! m  ^* X- Y
8 q; e/ e0 b1 x: `! y; m2 h5 ^
注意,如果没有特殊说明,默认的开发环境为 Win10 Pro 20H2 ,Keil uVision5 5.32!
7 @; @! @. P3 o* ^  e! d& s
2 |6 @$ P5 ~$ d4 ~) n1 {
9 N3 r# i; M8 `* F, V
在 KEIL 调试时部分寄存器不显示数据
* ?; h6 [' A/ J# N; _# @0 v/ c现象
% f$ N5 F0 _2 f0 r; l该问题是我在使用 STM32F103 调试时发现的。进入调试状态,观察某些外设的寄存器,发现有些寄存器不显示配置的值,而是始终显示 0。如下图:
: S6 [' D: b: R% I; d
11.png
问题
+ S6 T4 ^8 M5 ?$ Z2 u5 y% B为了验证该问题,我同时也尝试了 Keil uVision4 4.74,也是如此!但是在其他系列的 MCU(例如 STM32F2x) 中并没有发现该问题!
3 M( u$ ]$ v& a2 l4 K* D8 F2 ]% M8 m  F" M; F: A2 O" U1 N

9 s, u: z5 v5 f原因
) O7 g7 F/ c; l: s' k由于该问题仅仅出现在了 STM32F10 系列的 MCU中,所有严重怀疑是 Keil 和 该系列 MCU 配合不是很好导致的。但是一直没有找到具体原因!
) d  H4 K& k1 E- `) ]4 e2 d- n* Y/ H  p6 ~% F
有种感觉(或许就是),STM32F1 系列明显没有后续系列(例如 STM32F2x)用起来方便!
. r* p, F! H* `! x( x+ ~+ D) m1 [

' Y" A* |& f! c+ L解决方法% a1 Z) w4 {' j& G' N
通过修改 KEIL 的配置,可以使用其他方式来查看寄存器的值。需要注意的是,原来的寄存器还是显示异常的。具体如下图:
/ x  g* O- U, H8 c3 I) u$ e
12.png
! i( a/ y; J, ^. d: q6 A& _
  A* y- f8 M# ^0 E! [
STM32F103 某些 IO 初始化后的参数配置不生效$ F/ l. M! u* K: i8 t: _
现象. r' H$ m! x  O& }- x3 q1 t6 ?' p
该问是我在使用 MCU 是 STM32F103RC,驱动库为 LL 库 的时候发现的。具体情况如下图:; V+ t' g8 P8 B: d4 H! [- Q
13.png

  u5 N  d  |# D# W: e/ F: S

5 A; C& B/ G+ s& E; {原因9 l  m0 G0 C" R) v2 E, O
经过调试,这里是函数 LL_GPIO_Init 中的 BUG,在设置其他参数时,会把以上已经设置过的值异常更改!具体如下图:
) G( S3 O$ |9 R' m& t/ z" J
经过测试,使用标准外设库不会有此问题!HAL 库暂未验证!* ~+ O: b0 y+ h$ D: G
0 j* p! r& \# E. @( `8 x$ z& b) C
解决方法
+ U6 l# X$ K0 h; r& F6 a知道了原因解决就轻而易举了。为了防止更改驱动库带来的后续麻烦,我选择的是在初始化之后重新配置一下 Speed 这个参数。具体如下:
# Z$ ]- ~! s. _
  1. /* 时钟 */
    ( s  U# X3 B) s3 b. c& y$ Q; _: N5 E
  2. USART1_GPIO_CLK_ENABLE();' q5 d5 X8 H9 R# z+ b9 ^
  3. /* 引脚 */+ Q9 W- d: L$ h# K, y/ ^7 F
  4. LL_GPIO_Struct.Pin = USART1_TX_PIN;7 R0 _! r1 R3 Z0 ]
  5. LL_GPIO_Init(USART1_TX_GPIOx, &LL_GPIO_Struct);4 f* ~% Z, J3 Q( {8 h: O
  6. /* !!!处理 LL库 的一个 BUG,导致 上面的参数 LL_GPIO_Struct.Speed 无法被正确设置!!! */, X$ M) k* k+ B
  7. /* !!!具体可调试 LL_GPIO_Init 中 的设置模式函数 LL_GPIO_SetPinMode!!! */
    6 W& J- M$ M& Z" C) e' h, A. X; ]3 o" }
  8. LL_GPIO_SetPinSpeed(USART1_TX_GPIOx, USART1_TX_PIN, LL_GPIO_SPEED_FREQ_HIGH);3 z0 a& p! {/ N5 ]# L1 K1 y
  9. LL_GPIO_Struct.Mode = LL_GPIO_MODE_FLOATING;/ K7 q# X  T: x: Z7 I
  10. LL_GPIO_Struct.Pin = USART1_RX_PIN;; W* X' c$ I- g+ p
  11. LL_GPIO_Init(USART1_TX_GPIOx, &LL_GPIO_Struct);
复制代码

! R1 u+ G# m: x# \4 j, S5 a. p! y) x, j+ Y7 k- U" z" S

9 P1 U' b" T5 a, H
9 z$ D* o, N5 S
; n8 U# C4 u' j
9 z: C' P* u7 P( `3 E; X5 u& u
14.png
收藏 1 评论0 发布时间:2020-11-16 14:43

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版