有STM32開發者用到STM32F429芯片開發產品,并用到其中的CAN外設。在CAN應用過程中有個專門針對收發出錯情況進行次數統計的兩個計數器,其值通過錯誤狀態寄存器CAN_ESR中的REC[7:0]和TEC[7:0]兩個字段來體現,CAN硬件會根據錯誤數據大小做適當響應或處理。
根據寄存器描述得知,TEC[7:0]和REC[7:0]的值在這個寄存器里面是只讀的。而此時的STM32用戶有個強烈的需求,就是期望能適時地對這兩個出錯記錄字段做清零。他自己也嘗試編寫一些代碼想讓二者清零,均以失敗告終,便郵件咨詢有無解決辦法。
我們在閱讀CAN_ESR寄存器內容時倒有個發現,即該寄存器的復位值是0x00000000。
也就是說,芯片每次復位后其值一定是0,自然那兩個出錯計數器的值也是0。可客戶明確表明,不接受通過對芯片級復位的方式來實現對二者清零。
那怎么辦呢?對整個芯片復位不接受,直接寫又不起作用。還有別的辦法嗎?
其實,STM32芯片除了各種芯片級的復位外,還有專門針對各個外設模塊的復位。也就是說,既然這樣我們可以考慮僅針對CAN外設做復位而達到目的??蛻粢步邮苓@個做法。
以STM32F4芯片為例,下面寄存器就是負責對部分APB1外設進行復位操作的控制寄存器。
其中,CAN1/CAN2外設就是被其中的兩個控制位所管控。
我們對相應控制位置1或清零達到對外設模塊強制復位或做復位釋放的操作。我們不妨以這里的CAN1為例,相應的Cube庫函數代碼如下:
__HAL_RCC_CAN1_FORCE_RESET(); //對CAN1外設實施強制復位
__HAL_RCC_CAN1_RELEASE_RESET();//釋放對CAN1外設的強制復位
這里提醒并強調下,針對外設的強制復位和復位釋放指令原則上要成對使用。如果做了強制復位而不釋放的話,后面的配置不保證有效。
后來,客戶按照上面推薦的方法操作后,可靠有效,符合心意。我在這里將該案例分享出來,說不定哪天你能派上用場。畢竟書到用時方恨少嘛。
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17316瀏覽量
352248 -
寄存器
+關注
關注
31文章
5363瀏覽量
120949 -
CAN
+關注
關注
57文章
2766瀏覽量
464168 -
STM32
+關注
關注
2270文章
10923瀏覽量
357090 -
STM32F429
+關注
關注
0文章
40瀏覽量
10758
原文標題:巧用外設復位修改只讀寄存器
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論