STM32 之十五 奇怪问题处理及驱动库 BUG 汇总(持续更新中)
??在使用 STM32 的 MCU 開發過程中,難免遇到各種各樣的奇葩問題。或許是開發環境的問題,或許是 MCU 使用的問題,也或許是驅動庫的 BUG 等等。這些問題可能不局限于某一種具體型號的 MCU,特此把遇到的問題記錄一下!
注意,如果沒有特殊說明,默認的開發環境為 Win10 Pro 20H2 ,Keil uVision5 5.32!
在 KEIL 調試時部分寄存器不顯示數據
現象
??該問題是我在使用 STM32F103 調試時發現的。進入調試狀態,觀察某些外設的寄存器,發現有些寄存器不顯示配置的值,而是始終顯示 0。如下圖(RTC 寄存器):
??為了驗證該問題,我同時也嘗試了 Keil uVision4 4.74、IAR、SEGGER-ES,也是如此!但是在其他系列的 MCU(例如 STM32F2x) 中并沒有發現該問題!
原因
??由于該問題僅僅出現在了 STM32F10 系列的 MCU中,所有嚴重懷疑是 Keil 和 該系列 MCU 配合不是很好導致的。但是一直沒有找到具體原因!
有種感覺(或許就是),STM32F1 系列明顯沒有后續系列(例如 STM32F2x)用起來方便!
解決方法
??通過修改 KEIL 的配置,可以使用其他方式來查看寄存器的值。需要注意的是,原來的寄存器還是顯示異常的。至于其他開發環境,我也沒有具體研究如何解決。Keil 配置具體如下圖所示:
STM32F103 某些 IO 初始化后的參數配置不生效
現象
該問是我在使用 MCU 是 STM32F103RC,驅動庫為 LL 庫 的時候發現的。具體情況如下圖:
原因
經過調試,這里是函數 LL_GPIO_Init 中的 BUG,在設置其他參數時,會把以上已經設置過的值異常更改!具體如下圖:
經過測試,使用標準外設庫不會有此問題!HAL 庫暫未驗證!
解決方法
知道了原因解決就輕而易舉了。為了防止更改驅動庫帶來的后續麻煩,我選擇的是在初始化之后重新配置一下 Speed 這個參數。具體如下:
/* 時鐘 */ USART1_GPIO_CLK_ENABLE(); /* 引腳 */ LL_GPIO_Struct.Pin = USART1_TX_PIN; LL_GPIO_Init(USART1_TX_GPIOx, &LL_GPIO_Struct); /* !!!處理 LL庫 的一個 BUG,導致 上面的參數 LL_GPIO_Struct.Speed 無法被正確設置!!! */ /* !!!具體可調試 LL_GPIO_Init 中 的設置模式函數 LL_GPIO_SetPinMode!!! */ LL_GPIO_SetPinSpeed(USART1_TX_GPIOx, USART1_TX_PIN, LL_GPIO_SPEED_FREQ_HIGH); LL_GPIO_Struct.Mode = LL_GPIO_MODE_FLOATING; LL_GPIO_Struct.Pin = USART1_RX_PIN; LL_GPIO_Init(USART1_TX_GPIOx, &LL_GPIO_Struct);注意該問題在最新版本(1.8.3)的驅動庫中已被修復(但是這樣處理又引入了新的問題,具體見1.8.4版修復)!如下圖:
STM32F410 驅動中某些寄存器位沒有被定義
現象
最近在使用 STM32F410 時發現在 FLASH 部分的寄存器定義中與手冊描述不符,如下是其中一個地方:
此外,ST 官方并沒有實現 LL 庫的 FLASH 驅動,我們也只能自己實現一個!
原因
布吉島
解決方法
自己定義
持續更新中
現象
原因
解決方法
總結
以上是生活随笔為你收集整理的STM32 之十五 奇怪问题处理及驱动库 BUG 汇总(持续更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 之十四 System Mem
- 下一篇: LoRa 之一 旧版驱动(sx12xxD