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