国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

應(yīng)用筆記 | 關(guān)閉SPI會導致WRPERR錯誤的問題分析

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

掃碼添加小助手

加入工程師交流群

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

目錄預覽

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

01 引言

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

02 問題

2.1 問題起源

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

客戶使用兩個標志flag1和flag2,來觀察WRPERR標志的變化。代碼如圖1所示。

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

圖1.用戶測試代碼

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

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

2.2 問題重現(xiàn)

使用NUCLEO-L053R8來驗證客戶的這個問題。在STM32Cube_FW_L0_V1.10.0ProjectsSTM32L052R8-NucleoExamplesSPISPI_FullDuplex_ComPolling例程中直接進行修改測試。

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

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

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

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

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

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

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

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

好,那么再來修改一下測試代碼,把客戶這三句測試代碼挪動到SPI初始化之前,如圖4所示。

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

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

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

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

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

可以看到,這時Flash的WRPERR標志位置1了,測試代碼中,flag2的值也跟flag1不同了。

再做一個實驗,將此處的HAL庫寫法,改成直接操作寄存器,來試一下。測試代碼變成是圖6這樣的。

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

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

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

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

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

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

2.3 反匯編分析

對于三種情況,把反匯編拉出來看最清楚其操作過程了。

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

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

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

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

現(xiàn)在對三句C語言測試語句的反匯編語句進行解析,如下:

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

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

可以看到,這段匯編是一點問題都沒有的。

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

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

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

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

現(xiàn)在對三句C語言測試語句的反匯編語句進行解析,如下:

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

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

可以看到,這段匯編也是一點問題都沒有的。

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

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

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

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

現(xiàn)在對三句C語言測試語句的反匯編語句進行解析,如下:

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

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

可以看到,問題出在哪了?問題就出在“STR R3,[R 2]”這個語句上,這個語句在0x00000000這個位置寫值,而0x00000000此時映射的是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ù)

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

第二,因為沒有對Flash程序存儲器進行解鎖,就往里邊寫值,就會造成寫保護錯誤,導致WRPERR標志位置位。所以,可以明白為什么WRPERR會被置位了。

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

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

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

從Watch窗口來看一下SpiHandle的情況。如圖14所示。

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

圖14.SpiHandle(未初始化)

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

也就是因為這里的問題,才會導致了后面的WRPERR錯誤。

2.4 代碼分析

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

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

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

圖15._HAL_SPI_DISABLE函數(shù)

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

所以,把客戶的測試代碼放在SPI初始化代碼之后沒有問題,就是因為這個SpiHandle.Instance已經(jīng)被初始化過了。所以,它不會有問題。

03 問題解決

本來客戶的代碼就沒有必要這么寫,因為SPI都沒初始化,對它進行關(guān)閉并沒有什么意義。

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

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

圖16._HAL_SPI_DISABLE函數(shù)

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

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

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

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

經(jīng)過對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ù)并還沒有進行實際初始化。在沒有初始化的前提下,對其進行操作時不對的,也是危險的,應(yīng)該在寫代碼的時候引起重視。

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

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

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

長按掃碼關(guān)注公眾號

更多資訊,盡在STM32

點擊“閱讀原文”,可下載原文檔


原文標題:應(yīng)用筆記 | 關(guān)閉SPI會導致WRPERR錯誤的問題分析

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


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

    關(guān)注

    6076

    文章

    45495

    瀏覽量

    670411
  • STM32
    +關(guān)注

    關(guān)注

    2309

    文章

    11162

    瀏覽量

    373471

原文標題:應(yīng)用筆記 | 關(guān)閉SPI會導致WRPERR錯誤的問題分析

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    LAT1178+關(guān)閉 SPI 導致 WRPERR 錯誤的問題分析應(yīng)用筆記

    在 STM32 的應(yīng)用中,SPI 算是用的比較多的外設(shè)了,也是單片機最常見外設(shè)之一。客戶說它執(zhí)行了關(guān)閉 SPI 的代碼,竟然導致 Flas
    發(fā)表于 01-11 17:31 ?0次下載

    SPI的缺點介紹

    缺乏內(nèi)置錯誤檢查: SPI 的一個顯著缺點是缺乏內(nèi)置錯誤檢查機制。雖然其高速通信是一個顯著的優(yōu)勢,但它也為由于信號噪聲、時鐘抖動或電壓尖峰等因素造成的潛在數(shù)據(jù)錯誤留下了空間。在數(shù)據(jù)完
    發(fā)表于 11-26 06:41

    CW32F030 芯片 SPI DMA BULK發(fā)送問題,是什么原因導致的?

    在CW32F030芯片上用SPI DMA發(fā)送,Block模式?jīng)]有問題,可以調(diào)試出來,但是因為每個字節(jié)最后一位插入一個大約60ns的時間,這個時間導致數(shù)據(jù)出錯。看到規(guī)格書有說BULK
    發(fā)表于 11-24 07:42

    【EMC技術(shù)案例】SPI模塊搭接機殼導致輻射超標問題案例

    【EMC技術(shù)案例】SPI模塊搭接機殼導致輻射超標問題案例
    的頭像 發(fā)表于 11-11 17:26 ?614次閱讀
    【EMC技術(shù)案例】<b class='flag-5'>SPI</b>模塊搭接機殼<b class='flag-5'>導致</b>輻射超標問題案例

    分析負載特性時,有哪些常見的錯誤或誤區(qū)?

    分析負載特性時,很多人因 “想當然套用經(jīng)驗”“忽略實際場景細節(jié)” 或 “混淆概念” 導致判斷偏差,進而讓報警閾值調(diào)整失效(如誤報、漏報)。以下是 6 個最常見的錯誤 / 誤區(qū),附
    的頭像 發(fā)表于 10-10 17:03 ?809次閱讀

    唯品:利用訂單地址API校驗收貨信息,降低因地址錯誤導致的退貨率

    ? ?在電子商務(wù)領(lǐng)域,退貨率高是許多平臺面臨的挑戰(zhàn),其中地址錯誤導致的退貨占比不小。唯品作為國內(nèi)領(lǐng)先的時尚電商平臺,通過集成訂單地址API(Application Programming
    的頭像 發(fā)表于 09-11 15:47 ?558次閱讀

    SPI主機/從機接收發(fā)送都開啟DMA通信

    和發(fā)送;SPI 作為從機時,接收和發(fā)送同時開啟 DMA 進行數(shù)據(jù)接收和發(fā)送。 注:本應(yīng)用筆記對應(yīng)的代碼是基于雅特力提供的V2.x.x 板級支持包(BSP)而開發(fā),對于其他版本BSP,需要注意使用上
    發(fā)表于 09-10 16:56

    國巨貼片電容的電壓標識有哪些常見錯誤

    國巨貼片電容的電壓標識在識別和使用過程中可能存在一些常見錯誤,這些錯誤可能源于標識本身的模糊性、不同系列產(chǎn)品的差異、對標識規(guī)則的誤解,或使用環(huán)境的影響。以下是具體分析: 一、標識模糊或缺失導致
    的頭像 發(fā)表于 08-28 16:51 ?753次閱讀

    VW-102A振弦讀數(shù)儀接線錯誤導致傳感器設(shè)備損壞嗎?

    在巖土工程安全監(jiān)測領(lǐng)域,VW-102A型振弦讀數(shù)儀是讀取振弦式傳感器(如應(yīng)變計、滲壓計)數(shù)據(jù)的核心設(shè)備。一個常被用戶關(guān)注的問題是:接線操作錯誤是否直接損壞價格不菲的傳感器?結(jié)合設(shè)備特性和使用說明
    的頭像 發(fā)表于 08-20 10:42 ?1027次閱讀
    VW-102A振弦讀數(shù)儀接線<b class='flag-5'>錯誤</b>會<b class='flag-5'>導致</b>傳感器設(shè)備損壞嗎?

    SPI+DMA一直發(fā)進入HAL_BUSY無法跳出是怎么回事?

    為HAL_SPI_STATE_BUSY_TX_RX狀態(tài),導致HAL_SPI_TransmitReceive_DMA無法正常運行,我不知道是不是哪里設(shè)置不對還是其他問題導致的。 這是ST
    發(fā)表于 07-18 06:38

    CAN總線傳播延遲過大導致通信異常現(xiàn)象解析

    本文導讀在CAN總線系統(tǒng)中,傳播延遲過大是引發(fā)通信故障的關(guān)鍵誘因之一,可能導致仲裁異常,使優(yōu)先級高的信號無法正常優(yōu)先傳輸,破壞通信秩序;可能造成應(yīng)答錯誤,使發(fā)送節(jié)點難以在應(yīng)答隙內(nèi)接
    的頭像 發(fā)表于 07-15 11:47 ?916次閱讀
    CAN總線傳播延遲過大<b class='flag-5'>導致</b>通信異常現(xiàn)象解析

    【電磁兼容技術(shù)案例分享】TVS選型導致浪涌問題整改分析案例

    【電磁兼容技術(shù)案例分享】TVS選型導致浪涌問題整改分析案例
    的頭像 發(fā)表于 06-11 17:29 ?724次閱讀
    【電磁兼容技術(shù)案例分享】TVS選型<b class='flag-5'>導致</b>浪涌問題整改<b class='flag-5'>分析</b>案例

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

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

    LCD_SPI_X-&gt;DAT = (uint16_t)dat; while((LCD_SPI_X-&gt;STS &amp; SPI_I2S_BUSY_FLAG)!=(uint16_t)RESET){}

    決方案: 問題原因分析? SPI初始化配置錯誤?:時鐘、模式或波特率設(shè)置不當導致傳輸異常。 硬件連接問題?:線路接觸不良或干擾導致傳輸失敗。
    發(fā)表于 04-02 14:29

    Design Studio 3.6.0配置錯誤怎么解決?

    在嘗試配置其他 SPI 接口時,我不斷遇到 RTD 5.0.0 的 DS 3.6.0 上的錯誤。 任何想法可能導致這種情況的原因嗎?我嘗試卸載并重新安裝 DS 和 RTD,但遇到了相同的錯誤
    發(fā)表于 03-28 07:53