女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

應(yīng)用筆記 | 關(guān)閉SPI會(huì)導(dǎo)致WRPERR錯(cuò)誤的問(wèn)題分析

STM32單片機(jī) ? 來(lái)源:未知 ? 2023-08-10 18:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

關(guān)鍵字:SPI,F(xiàn)lash,WRPERR

目錄預(yù)覽

1 引言2 問(wèn)題3 問(wèn)題解決4 小結(jié)

01 引言

STM32的應(yīng)用中,SPI算是用的比較多的外設(shè)了,也是單片機(jī)最常見(jiàn)外設(shè)之一。客戶說(shuō)它執(zhí)行了關(guān)閉SPI的代碼,竟然會(huì)導(dǎo)致Flash中的WRPERR標(biāo)志置位,致使應(yīng)用碰到一些問(wèn)題。這就奇怪了,SPI和內(nèi)部Flash看起來(lái)是風(fēng)馬牛不相及的事情,為什么會(huì)發(fā)生這種事呢?一起來(lái)看看吧。

02 問(wèn)題

2.1 問(wèn)題起源

客戶在使用STM32L072RBT6的時(shí)候,使用STM32 CubeL0庫(kù),在程序編寫時(shí),發(fā)現(xiàn)執(zhí)行關(guān)閉SPI代碼時(shí),會(huì)導(dǎo)致Flash的寫保護(hù)錯(cuò)誤標(biāo)志W(wǎng)RPERR置位,導(dǎo)致其后面準(zhǔn)備寫EEPROM的時(shí)候,就無(wú)法對(duì)EEPROM寫入了。

客戶使用兩個(gè)標(biāo)志flag1和flag2,來(lái)觀察WRPERR標(biāo)志的變化。代碼如圖1所示。

bd73cac8-3769-11ee-9e74-dac502259ad0.png

圖1.用戶測(cè)試代碼

在執(zhí)行這個(gè)代碼時(shí),前面flag1還等于0,執(zhí)行到flag2那句,就變成flag2等于1了,同樣地取了WRPERR標(biāo)志位的值。所以客戶就懷疑執(zhí)行_HAL_SPI_DISABLE()會(huì)把Flash的WRPERR標(biāo)志置1了。

因?yàn)樵趯?duì)EEPROM編程中,需要先調(diào)用位于stm32l0xx_hal_flash.c中的FLASH_WaitForLastOperation()函數(shù),此函數(shù)中,將會(huì)對(duì)Flash所有錯(cuò)誤標(biāo)志進(jìn)行檢查,如果出現(xiàn)了錯(cuò)誤,它則返回HAL_ERROR,導(dǎo)致后續(xù)對(duì)EEPROM的編程不會(huì)被執(zhí)行。

2.2 問(wèn)題重現(xiàn)

使用NUCLEO-L053R8來(lái)驗(yàn)證客戶的這個(gè)問(wèn)題。在STM32Cube_FW_L0_V1.10.0ProjectsSTM32L052R8-NucleoExamplesSPISPI_FullDuplex_ComPolling例程中直接進(jìn)行修改測(cè)試。

首先,把客戶的測(cè)試代碼加到例程中SPI初始化之后的位置。如圖2所示。

bd8bde6a-3769-11ee-9e74-dac502259ad0.png

圖2.測(cè)試代碼1(位于SPI初始化之后)

編譯,并在線調(diào)試,發(fā)現(xiàn)并沒(méi)有出現(xiàn)客戶所描述的問(wèn)題。如圖3所示。

bdcd1132-3769-11ee-9e74-dac502259ad0.png

圖3.測(cè)試代碼1結(jié)果(位于SPI初始化之后)

可以看到,WRPERR的值并沒(méi)有被置1,F(xiàn)lag1和Flag2的值也都是0。那么,為什么客戶說(shuō)他那邊會(huì)有這個(gè)問(wèn)題呢?

再回頭仔細(xì)看一下客戶的測(cè)試代碼,發(fā)現(xiàn)客戶的測(cè)試代碼中并沒(méi)有對(duì)SPI進(jìn)行初始化,其_HAL_SPI_DISABLE()代碼是放在其他外設(shè)初始化之后的。

好,那么再來(lái)修改一下測(cè)試代碼,把客戶這三句測(cè)試代碼挪動(dòng)到SPI初始化之前,如圖4所示。

bdf126da-3769-11ee-9e74-dac502259ad0.png

圖4.測(cè)試代碼2(位于SPI初始化之前)

編譯,并在線調(diào)試,這時(shí),會(huì)驚奇地發(fā)現(xiàn)客戶所描述地問(wèn)題來(lái)了。其結(jié)果如圖5所示。

be3694fe-3769-11ee-9e74-dac502259ad0.png

圖5.測(cè)試代碼2結(jié)果(位于SPI初始化之前)

可以看到,這時(shí)Flash的WRPERR標(biāo)志位置1了,測(cè)試代碼中,flag2的值也跟flag1不同了。

再做一個(gè)實(shí)驗(yàn),將此處的HAL庫(kù)寫法,改成直接操作寄存器,來(lái)試一下。測(cè)試代碼變成是圖6這樣的。

be561ea0-3769-11ee-9e74-dac502259ad0.png

圖6.測(cè)試代碼3(位于SPI初始化之前,直接操作寄存器)

編譯,在線調(diào)試,這次又驚喜地發(fā)現(xiàn),問(wèn)題不見(jiàn)了。結(jié)果如圖7所示。

be9c7256-3769-11ee-9e74-dac502259ad0.png

圖7.測(cè)試代碼3結(jié)果(位于SPI初始化之前,直接操作寄存器)

三種操作,為什么只有第二種方式有問(wèn)題呢?而且為什么錯(cuò)的偏偏是Flash的寫保護(hù)錯(cuò)誤標(biāo)志W(wǎng)RPERR呢?接下來(lái)可以分析一下它們的反匯編代碼,看看到底是哪里出問(wèn)題了。

2.3 反匯編分析

對(duì)于三種情況,把反匯編拉出來(lái)看最清楚其操作過(guò)程了。

先分析第一種情況——測(cè)試代碼位于SPI初始化之后。其反匯編如圖8所示。

bebaabb8-3769-11ee-9e74-dac502259ad0.png

圖8.測(cè)試代碼1的反匯編(位于SPI初始化之后)

從之前的Watch窗口,知道flag1的地址為 0x2000000c,flag2的地址為0x2000000d。

現(xiàn)在對(duì)三句C語(yǔ)言測(cè)試語(yǔ)句的反匯編語(yǔ)句進(jìn)行解析,如下:

bed8369c-3769-11ee-9e74-dac502259ad0.png

beeb4f7a-3769-11ee-9e74-dac502259ad0.png

可以看到,這段匯編是一點(diǎn)問(wèn)題都沒(méi)有的。

接下來(lái),先分析第三種情況——也就是測(cè)試代碼放在SPI初始化之前,但是使用直接操作寄存器的方式。其反匯編如圖9所示。

bf20e914-3769-11ee-9e74-dac502259ad0.png

圖9.測(cè)試代碼3的反匯編(位于SPI初始化之前,直接操作寄存器)

從之前的Watch窗口,知道flag1的地址為0x2000000c,flag2的地址為0x2000000d。

現(xiàn)在對(duì)三句C語(yǔ)言測(cè)試語(yǔ)句的反匯編語(yǔ)句進(jìn)行解析,如下:

bf4f4e26-3769-11ee-9e74-dac502259ad0.png

bf8ab4ac-3769-11ee-9e74-dac502259ad0.png

可以看到,這段匯編也是一點(diǎn)問(wèn)題都沒(méi)有的。

最后,再來(lái)分析一下有問(wèn)題的第二種情況,也就是測(cè)試代碼放在SPI初始化之前,但是使用_HAL_SPI_DISABLE()關(guān)閉SPI的情況。其反匯編如圖10所示。

bfa3c3c0-3769-11ee-9e74-dac502259ad0.png

圖10.測(cè)試代碼2的反匯編(位于SPI初始化之前)

從之前的Watch窗口,知道flag1的地址為0x20000008,flag2的地址為0x20000009。

現(xiàn)在對(duì)三句C語(yǔ)言測(cè)試語(yǔ)句的反匯編語(yǔ)句進(jìn)行解析,如下:

bfca076a-3769-11ee-9e74-dac502259ad0.png

bfe4e65c-3769-11ee-9e74-dac502259ad0.png

可以看到,問(wèn)題出在哪了?問(wèn)題就出在“STR R3,[R 2]”這個(gè)語(yǔ)句上,這個(gè)語(yǔ)句在0x00000000這個(gè)位置寫值,而0x00000000此時(shí)映射的是Flash的地址0x08000000,也就是Stack Pointer的位置。如圖11和圖12所示。

c019f0a4-3769-11ee-9e74-dac502259ad0.png

圖11.0x00000000地址的數(shù)據(jù)

c04706ca-3769-11ee-9e74-dac502259ad0.png

圖12.0x08000000地址的數(shù)據(jù)

首先,這個(gè)位置本來(lái)就不應(yīng)該被修改。

第二,因?yàn)闆](méi)有對(duì)Flash程序存儲(chǔ)器進(jìn)行解鎖,就往里邊寫值,就會(huì)造成寫保護(hù)錯(cuò)誤,導(dǎo)致WRPERR標(biāo)志位置位。所以,可以明白為什么WRPERR會(huì)被置位了。

可是關(guān)鍵的問(wèn)題在哪兒呢?在執(zhí)行“LDR R2,[R0,#4]”這條語(yǔ)句時(shí),R2本來(lái)應(yīng)該是SPI2_CR1的地址,但是它竟然是0x00000000!如圖13所示。

c06c0ac4-3769-11ee-9e74-dac502259ad0.png

圖13.0x2000000c地址的數(shù)據(jù)

從Watch窗口來(lái)看一下SpiHandle的情況。如圖14所示。

c0827e80-3769-11ee-9e74-dac502259ad0.png

圖14.SpiHandle(未初始化)

從圖14可以看到,其實(shí)剛才的0x2000000c地址就是SpiHandle結(jié)構(gòu)體的地址,也是SpiHandle.Instance的地址,而SpiHandle.Instance的值為0。SpiHandle.Ins tance.CR1的地址為0x0,導(dǎo)致顯示它裝載的值是Stack pointer的值0x20000468,這里本應(yīng)該是SPI2_CR1的地址和SPI2_CR1的值。

也就是因?yàn)檫@里的問(wèn)題,才會(huì)導(dǎo)致了后面的WRPERR錯(cuò)誤。

2.4 代碼分析

再回到代碼這邊來(lái)看一下,有問(wèn)題的代碼究竟是有什么情況。客戶的代碼主要就是一句關(guān)閉SPI的語(yǔ)句“_HAL_SPI_DISABLE(&SpiHandle);”。

這個(gè)語(yǔ)句是怎么解析的?它再stm32l0xx_hal_spi.h中解析,如圖15所示。

c0a183d4-3769-11ee-9e74-dac502259ad0.png

圖15._HAL_SPI_DISABLE函數(shù)

看到這個(gè)函數(shù)時(shí),看到了重要的字眼——“Instance”!就明白是什么問(wèn)題了,因?yàn)檫@個(gè)SpiHandle.Instance還沒(méi)有被初始化呢!這也說(shuō)明了為什么在圖14中,看到的SpiHandle.Instance的值為0x0,而SpiHandle.Instance. CR2的值為0x20000468。關(guān)鍵就在于這個(gè)SpiHandle. Instance還沒(méi)有初始化。

所以,把客戶的測(cè)試代碼放在SPI初始化代碼之后沒(méi)有問(wèn)題,就是因?yàn)檫@個(gè)SpiHandle.Instance已經(jīng)被初始化過(guò)了。所以,它不會(huì)有問(wèn)題。

03 問(wèn)題解決

本來(lái)客戶的代碼就沒(méi)有必要這么寫,因?yàn)镾PI都沒(méi)初始化,對(duì)它進(jìn)行關(guān)閉并沒(méi)有什么意義。

如果非要在這里關(guān)閉SPI的話,那就要先對(duì)SpiHandle.Instance進(jìn)行初始化才行。如圖16所示。

c0afe622-3769-11ee-9e74-dac502259ad0.png

圖16._HAL_SPI_DISABLE函數(shù)

加了“SpiHandle.Instance=SPIx;”初始化后,再跑這段代碼,就不會(huì)出現(xiàn)客戶所說(shuō)的問(wèn)題了。

現(xiàn)在再來(lái)看一下SpiHandle的情況。

c0cadd38-3769-11ee-9e74-dac502259ad0.png

圖17.SpiHandle(SpiHandle.Instance已初始化)

經(jīng)過(guò)對(duì)SpiHandle.Instance的初始化,這里就可以看到SpiHandle.Instance的值為0x40003800了,為SPI2外設(shè)寄存器的基地址,而且可以看到SpiHandle.Instance. CR1的地址就是SPI2_CR1的地址0x40003800,值也是SPI2_CR1的值0x0了。

04 小結(jié)

在用戶代碼中,SpiHandle只是定義了SPI_HandleTypeDef結(jié)構(gòu)體,其各種參數(shù)并還沒(méi)有進(jìn)行實(shí)際初始化。在沒(méi)有初始化的前提下,對(duì)其進(jìn)行操作時(shí)不對(duì)的,也是危險(xiǎn)的,應(yīng)該在寫代碼的時(shí)候引起重視。

使用HAL庫(kù)的時(shí)候,如果要對(duì)一個(gè)外設(shè)進(jìn)行任何的操作,請(qǐng)務(wù)必記得它是被初始化過(guò)的。否則,出了問(wèn)題可能都不一定知道。

完整內(nèi)容請(qǐng)點(diǎn)擊“閱讀原文”下載原文檔。

c0e4716c-3769-11ee-9e74-dac502259ad0.png

長(zhǎng)按掃碼關(guān)注公眾號(hào)

更多資訊,盡在STM32

點(diǎn)擊“閱讀原文”,可下載原文檔


原文標(biāo)題:應(yīng)用筆記 | 關(guān)閉SPI會(huì)導(dǎo)致WRPERR錯(cuò)誤的問(wèn)題分析

文章出處:【微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6067

    文章

    44992

    瀏覽量

    650492
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    364961

原文標(biāo)題:應(yīng)用筆記 | 關(guān)閉SPI會(huì)導(dǎo)致WRPERR錯(cuò)誤的問(wèn)題分析

文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    GPDV6624C應(yīng)用筆記1.0版

    電子發(fā)燒友網(wǎng)站提供《GPDV6624C應(yīng)用筆記1.0版.pdf》資料免費(fèi)下載
    發(fā)表于 06-06 17:20 ?0次下載

    了解ISL28022的電流和功率計(jì)算應(yīng)用筆記

    本應(yīng)用筆記討論數(shù)字電源監(jiān)控器(DPM) ISL28022的內(nèi)部計(jì)算程序。它解釋了數(shù)據(jù)寄存器的位格式,并舉例說(shuō)明了內(nèi)部數(shù)學(xué)處理器從測(cè)得的分流和總線電壓導(dǎo)出電流和功率值的程序步驟。本應(yīng)用筆記是ISL28022數(shù)據(jù)手冊(cè)的摘要。
    的頭像 發(fā)表于 02-21 11:30 ?585次閱讀
    了解ISL28022的電流和功率計(jì)算應(yīng)<b class='flag-5'>用筆記</b>

    CDK應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《CDK應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 16:17 ?0次下載
    CDK應(yīng)<b class='flag-5'>用筆記</b>

    ES32VF2264應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《ES32VF2264應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 16:14 ?0次下載
    ES32VF2264應(yīng)<b class='flag-5'>用筆記</b>

    ES7P0214應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《ES7P0214應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 16:06 ?0次下載
    ES7P0214應(yīng)<b class='flag-5'>用筆記</b>

    智通國(guó)際推出全新商用筆記本品牌恒悅

    1月15日,智通國(guó)際旗下品牌恒悅舉辦了全新一代商用筆記本的發(fā)布會(huì)。當(dāng)前PC市場(chǎng)正處在傳統(tǒng)PC向AI PC邁進(jìn)的關(guān)鍵時(shí)刻,硬件架構(gòu)創(chuàng)新、產(chǎn)品形態(tài)創(chuàng)新、軟件應(yīng)用創(chuàng)新風(fēng)起云涌。而作為AI向大眾普及的最佳
    的頭像 發(fā)表于 01-16 16:01 ?901次閱讀

    ES7P0213應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《ES7P0213應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-16 15:26 ?0次下載
    ES7P0213應(yīng)<b class='flag-5'>用筆記</b>

    AT32F423 PWC應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《AT32F423 PWC應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 01-15 15:30 ?0次下載
    AT32F423 PWC應(yīng)<b class='flag-5'>用筆記</b>

    電橋電路的常見(jiàn)錯(cuò)誤分析

    電橋電路的常見(jiàn)錯(cuò)誤分析主要包括以下幾個(gè)方面: 一、電阻值不準(zhǔn)確 電阻值不準(zhǔn)確是電橋電路常見(jiàn)的錯(cuò)誤之一。這可能是由于電阻本身的誤差,如電阻的標(biāo)稱值與實(shí)際值存在偏差,或者電阻老化、溫度變化等因素導(dǎo)
    的頭像 發(fā)表于 01-09 10:08 ?1130次閱讀

    S32K3系列汽車級(jí)MCU應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《S32K3系列汽車級(jí)MCU應(yīng)用筆記.docx》資料免費(fèi)下載
    發(fā)表于 12-30 15:43 ?2次下載

    S32K3xxICU應(yīng)用筆記

    S32K3xxICU應(yīng)用筆記
    發(fā)表于 12-30 15:38 ?2次下載

    應(yīng)用筆記1604:去補(bǔ)償運(yùn)算放大器

    電子發(fā)燒友網(wǎng)站提供《應(yīng)用筆記1604:去補(bǔ)償運(yùn)算放大器.pdf》資料免費(fèi)下載
    發(fā)表于 09-29 10:30 ?0次下載
    應(yīng)<b class='flag-5'>用筆記</b>1604:去補(bǔ)償運(yùn)算放大器

    TPS6598x沒(méi)電電池應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《TPS6598x沒(méi)電電池應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 10:03 ?1次下載
    TPS6598x沒(méi)電電池應(yīng)<b class='flag-5'>用筆記</b>

    TLC3702 TLC3704系列應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《TLC3702 TLC3704系列應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 09-20 09:14 ?0次下載
    TLC3702 TLC3704系列應(yīng)<b class='flag-5'>用筆記</b>

    變頻器的功率計(jì)基本計(jì)算應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《變頻器的功率計(jì)基本計(jì)算應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 09-09 14:38 ?0次下載
    變頻器的功率計(jì)基本計(jì)算應(yīng)<b class='flag-5'>用筆記</b>