RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

巧用外設(shè)復(fù)位修改只讀寄存器

茶話MCU ? 來(lái)源:茶話MCU ? 2023-04-28 13:59 ? 次閱讀

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)或處理。

8a160ae4-e582-11ed-ab56-dac502259ad0.png

根據(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。

8a437dc6-e582-11ed-ab56-dac502259ad0.png

也就是說(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ù)位操作的控制寄存器。

8a53279e-e582-11ed-ab56-dac502259ad0.png

其中,CAN1/CAN2外設(shè)就是被其中的兩個(gè)控制位所管控。

8a68335a-e582-11ed-ab56-dac502259ad0.png

我們對(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í)方恨少嘛。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17123

    瀏覽量

    350979
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120230
  • CAN
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    無(wú)法向外設(shè)寄存器寫(xiě)入數(shù)值是怎么回事?

    我使用的是 TCxxx 微控制。 我試圖更改 QSPI 寄存器中的值,但無(wú)法修改。 外設(shè)已在 CLC 寄存器中啟用。 但我無(wú)法
    發(fā)表于 05-31 07:19

    寄存器,寄存器是什么意思

    寄存器,寄存器是什么意思 寄存器定義  寄存器是中央處理內(nèi)的組成部分。寄存器是有限存貯容量
    發(fā)表于 03-08 14:26 ?2.2w次閱讀

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思

    數(shù)據(jù)寄存器,數(shù)據(jù)寄存器是什么意思 數(shù)據(jù)寄存器數(shù)據(jù)寄存器包括累加AX、基址寄存器BX、計(jì)數(shù)
    發(fā)表于 03-08 14:38 ?1.3w次閱讀

    ARM寄存器詳解

    ARM有37個(gè)寄存器,其中31個(gè)通用寄存器,6個(gè)狀態(tài)寄存器。   這里尤其要注意區(qū)別的是ARM自身寄存器和它的一些外設(shè)
    發(fā)表于 07-10 10:04 ?2956次閱讀

    FPGA 調(diào)試 – 外設(shè)寄存器視圖

    作為設(shè)計(jì)者,在 FPGA 設(shè)計(jì)中您可以訪問(wèn)眾多外設(shè)器件的內(nèi)部 寄存器 。一旦將FPGA設(shè)計(jì)下載到目標(biāo)器件中并且代碼已經(jīng)運(yùn)行在相應(yīng)處理上,與這些寄存器進(jìn)行交互的典型方法是通過(guò)嵌入
    發(fā)表于 05-15 11:49 ?3336次閱讀
    FPGA 調(diào)試 – <b class='flag-5'>外設(shè)</b><b class='flag-5'>寄存器</b>視圖

    STM32寄存器外設(shè)驅(qū)動(dòng)x_實(shí)驗(yàn)四

    主要介紹STM32寄存器——外設(shè)驅(qū)動(dòng),圖文詳情,非常合適看
    發(fā)表于 02-22 15:46 ?0次下載

    DSP2407片內(nèi)外設(shè)寄存器定義

    DSP2407片內(nèi)外設(shè)寄存器定義,有需要的下來(lái)看看
    發(fā)表于 05-06 15:29 ?25次下載

    51單片機(jī)復(fù)位電路及復(fù)位寄存器的狀態(tài)

    這是一個(gè)有關(guān)于51單片機(jī)復(fù)位電路的介紹以及復(fù)位寄存器狀態(tài)的講解,有助于我們更好的了解復(fù)位電路。
    發(fā)表于 05-09 14:16 ?2次下載

    STM32復(fù)位來(lái)源(寄存器版)

    一篇很簡(jiǎn)單,有必要了解的文章 - STM32復(fù)位來(lái)源(寄存器版)
    的頭像 發(fā)表于 03-14 14:13 ?1.1w次閱讀
    STM32<b class='flag-5'>復(fù)位</b>來(lái)源(<b class='flag-5'>寄存器</b>版)

    配置STM32寄存器控制GPIO點(diǎn)亮LED

    【8-15】端口配置寄存器 32位IDR 數(shù)據(jù)寄存器 32位 輸入ODR 數(shù)據(jù)寄存器 32位 輸出BSRR 置位/復(fù)位寄存器 32位BRR
    發(fā)表于 01-13 16:15 ?3次下載
    配置STM32<b class='flag-5'>寄存器</b>控制GPIO點(diǎn)亮LED

    修改寄存器默認(rèn)值的方法

    寄存器默認(rèn)值,也叫復(fù)位值,是當(dāng)reset或者set有效時(shí)寄存器輸出的值。對(duì)于一個(gè)DFF來(lái)說(shuō),如下圖,當(dāng)reset為0時(shí),Q輸出0;當(dāng)set為0時(shí),Q輸出為1(外部使用時(shí)保證reset與set不同時(shí)為0)。
    的頭像 發(fā)表于 09-28 14:13 ?1446次閱讀

    修改寄存器默認(rèn)值的方法有哪些

    寄存器默認(rèn)值,也叫復(fù)位值,是當(dāng)reset或者set有效時(shí)寄存器輸出的值。對(duì)于一個(gè)DFF來(lái)說(shuō),如下圖,當(dāng)reset為0時(shí),Q輸出0;當(dāng)set為0時(shí),Q輸出為1(外部使用時(shí)保證reset與set不同時(shí)為0)。
    的頭像 發(fā)表于 01-30 16:30 ?2337次閱讀
    <b class='flag-5'>修改寄存器</b>默認(rèn)值的方法有哪些

    寄存器的作用以及復(fù)位

    寄存器的作用** 1)時(shí)序邏輯存儲(chǔ)數(shù)據(jù)。例如,一個(gè)計(jì)數(shù),每個(gè)周期要加1,那它就要使用寄存器實(shí)現(xiàn)。純組合邏輯是實(shí)現(xiàn)不了的。
    的頭像 發(fā)表于 01-30 17:17 ?6937次閱讀
    <b class='flag-5'>寄存器</b>的作用以及<b class='flag-5'>復(fù)位</b>

    如何用外設(shè)復(fù)位修改只讀寄存器

    有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
    的頭像 發(fā)表于 06-21 16:11 ?673次閱讀
    如何用<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>

    干貨滿滿:ARM的內(nèi)核寄存器講解

    內(nèi)核寄存器外設(shè)寄存器: 內(nèi)核寄存器外設(shè)寄存器是完全不同的概念。內(nèi)核
    發(fā)表于 04-17 11:47 ?3548次閱讀
    干貨滿滿:ARM的內(nèi)核<b class='flag-5'>寄存器</b>講解
    RM新时代网站-首页