有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ù)位而不釋放的話,后面的配置不保證有效。
后來,客戶按照上面推薦的方法操作后,可靠有效,符合心意。我在這里將該案例分享出來,說不定哪天你能派上用場。畢竟書到用時方恨少嘛。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
相關(guān)推薦
寄存器,寄存器是什么意思
寄存器定義 寄存器是中央處理器內(nèi)的組成部分。寄存器是有限存貯容量
發(fā)表于 03-08 14:26
?2.2w次閱讀
數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思
數(shù)據(jù)寄存器數(shù)據(jù)寄存器包括累加器AX、基址寄存器BX、計數(shù)
發(fā)表于 03-08 14:38
?1.3w次閱讀
ARM有37個寄存器,其中31個通用寄存器,6個狀態(tài)寄存器。
這里尤其要注意區(qū)別的是ARM自身寄存器和它的一些外設(shè)的
發(fā)表于 07-10 10:04
?2967次閱讀
作為設(shè)計者,在 FPGA 設(shè)計中您可以訪問眾多外設(shè)器件的內(nèi)部 寄存器 。一旦將FPGA設(shè)計下載到目標器件中并且代碼已經(jīng)運行在相應(yīng)處理器上,與這些寄存器進行交互的典型方法是通過嵌入
發(fā)表于 05-15 11:49
?3395次閱讀
主要介紹STM32寄存器——外設(shè)驅(qū)動,圖文詳情,非常合適看
發(fā)表于 02-22 15:46
?0次下載
DSP2407片內(nèi)外設(shè)寄存器定義,有需要的下來看看
發(fā)表于 05-06 15:29
?25次下載
這是一個有關(guān)于51單片機復(fù)位電路的介紹以及復(fù)位后寄存器狀態(tài)的講解,有助于我們更好的了解復(fù)位電路。
發(fā)表于 05-09 14:16
?2次下載
一篇很簡單,有必要了解的文章 - STM32復(fù)位來源(寄存器版)
發(fā)表于 03-14 14:13
?1.1w次閱讀
,一般高16位保留BSRR寄存器32位分為低16位BSRRL和高16位BSRRH,BSRRL配置一組IO口的16個IO口的狀態(tài)(1),BSRRH配置復(fù)位狀態(tài)(0)。每組GPIO端口的寄存器包括:4個32位配置
發(fā)表于 12-08 17:06
?5次下載
【8-15】端口配置寄存器 32位IDR 數(shù)據(jù)寄存器 32位 輸入ODR 數(shù)據(jù)寄存器 32位 輸出BSRR 置位/復(fù)位寄存器 32位BRR
發(fā)表于 01-13 16:15
?3次下載
寄存器默認值,也叫復(fù)位值,是當reset或者set有效時寄存器輸出的值。對于一個DFF來說,如下圖,當reset為0時,Q輸出0;當set為0時,Q輸出為1(外部使用時保證reset與set不同時為0)。
發(fā)表于 09-28 14:13
?1489次閱讀
寄存器默認值,也叫復(fù)位值,是當reset或者set有效時寄存器輸出的值。對于一個DFF來說,如下圖,當reset為0時,Q輸出0;當set為0時,Q輸出為1(外部使用時保證reset與set不同時為0)。
發(fā)表于 01-30 16:30
?2437次閱讀
寄存器的作用**
1)時序邏輯存儲數(shù)據(jù)。例如,一個計數(shù)器,每個周期要加1,那它就要使用寄存器實現(xiàn)。純組合邏輯是實現(xiàn)不了的。
發(fā)表于 01-30 17:17
?7108次閱讀
有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]兩個字段
發(fā)表于 04-28 13:59
?817次閱讀
內(nèi)核寄存器與外設(shè)寄存器: 內(nèi)核寄存器與外設(shè)寄存器是完全不同的概念。內(nèi)核
發(fā)表于 04-17 11:47
?4042次閱讀
評論