有STM32開發(fā)者用到STM32F429芯片開發(fā)產(chǎn)品,并用到其中的CAN外設(shè)。在CAN應(yīng)用過程中有個專門針對收發(fā)出錯情況進行次數(shù)統(tǒng)計的兩個計數(shù)器,其值通過錯誤狀態(tài)寄存器CAN_ESR中的REC[7:0]和TEC[7:0]兩個字段來體現(xiàn),CAN硬件會根據(jù)錯誤數(shù)據(jù)大小做適當響應(yīng)或處理。
根據(jù)寄存器描述得知,TEC[7:0]和REC[7:0]的值在這個寄存器里面是只讀的。而此時的STM32用戶有個強烈的需求,就是期望能適時地對這兩個出錯記錄字段做清零。他自己也嘗試編寫一些代碼想讓二者清零,均以失敗告終,便郵件咨詢有無解決辦法。
我們在閱讀CAN_ESR寄存器內(nèi)容時倒有個發(fā)現(xiàn),即該寄存器的復(fù)位值是0x00000000。
也就是說,芯片每次復(fù)位后其值一定是0,自然那兩個出錯計數(shù)器的值也是0。可客戶明確表明,不接受通過對芯片級復(fù)位的方式來實現(xiàn)對二者清零。
那怎么辦呢?對整個芯片復(fù)位不接受,直接寫又不起作用。還有別的辦法嗎?
其實,STM32芯片除了各種芯片級的復(fù)位外,還有專門針對各個外設(shè)模塊的復(fù)位。也就是說,既然這樣我們可以考慮僅針對CAN外設(shè)做復(fù)位而達到目的??蛻粢步邮苓@個做法。
以STM32F4芯片為例,下面寄存器就是負責(zé)對部分APB1外設(shè)進行復(fù)位操作的控制寄存器。
其中,CAN1/CAN2外設(shè)就是被其中的兩個控制位所管控。
我們對相應(yīng)控制位置1或清零達到對外設(shè)模塊強制復(fù)位或做復(fù)位釋放的操作。我們不妨以這里的CAN1為例,相應(yīng)的Cube庫函數(shù)代碼如下:
__HAL_RCC_CAN1_FORCE_RESET(); //對CAN1外設(shè)實施強制復(fù)位
__HAL_RCC_CAN1_RELEASE_RESET();//釋放對CAN1外設(shè)的強制復(fù)位
這里提醒并強調(diào)下,針對外設(shè)的強制復(fù)位和復(fù)位釋放指令原則上要成對使用。如果做了強制復(fù)位而不釋放的話,后面的配置不保證有效。
后來,客戶按照上面推薦的方法操作后,可靠有效,符合心意。我在這里將該案例分享出來,說不定哪天你能派上用場。畢竟書到用時方恨少嘛。
審核編輯:湯梓紅
-
mcu
+關(guān)注
關(guān)注
146文章
17349瀏覽量
352756 -
寄存器
+關(guān)注
關(guān)注
31文章
5368瀏覽量
121244 -
CAN
+關(guān)注
關(guān)注
57文章
2772瀏覽量
464452 -
STM32
+關(guān)注
關(guān)注
2272文章
10925瀏覽量
357732 -
STM32F429
+關(guān)注
關(guān)注
0文章
40瀏覽量
10802
原文標題:巧用外設(shè)復(fù)位修改只讀寄存器
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思
ARM寄存器詳解
FPGA 調(diào)試 – 外設(shè)寄存器視圖
![FPGA 調(diào)試 – <b class='flag-5'>外設(shè)</b><b class='flag-5'>寄存器</b>視圖](https://file1.elecfans.com//web2/M00/A6/36/wKgZomUMPE2ABRlSAAAeOb0u_DQ551.png)
51單片機復(fù)位電路及復(fù)位后寄存器的狀態(tài)
GPIO寄存器
![GPIO<b class='flag-5'>寄存器</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
配置STM32寄存器控制GPIO點亮LED
![配置STM32<b class='flag-5'>寄存器</b>控制GPIO點亮LED](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
修改寄存器默認值的方法
修改寄存器默認值的方法有哪些
![<b class='flag-5'>修改寄存器</b>默認值的方法有哪些](https://file.elecfans.com/web2/M00/8B/99/poYBAGPXf9SAXvaqAAAzeeBcR9Y202.jpg)
寄存器的作用以及復(fù)位
![<b class='flag-5'>寄存器</b>的作用以及<b class='flag-5'>復(fù)位</b>](https://file.elecfans.com/web2/M00/8C/23/pYYBAGPXivKAIbCdAAAj-LzX9qU237.jpg)
如何用外設(shè)復(fù)位修改只讀寄存器
![如何用<b class='flag-5'>外設(shè)</b><b class='flag-5'>復(fù)位</b><b class='flag-5'>修改</b><b class='flag-5'>只讀</b><b class='flag-5'>寄存器</b>](https://file1.elecfans.com/web2/M00/8A/76/wKgaomSSsHyASLQOAALiZ_Ye0nM892.jpg)
干貨滿滿:ARM的內(nèi)核寄存器講解
![干貨滿滿:ARM的內(nèi)核<b class='flag-5'>寄存器</b>講解](https://file1.elecfans.com/web2/M00/CA/D8/wKgZomYfTWaADqILAAAqhpMXVCI925.png)
評論