女人自慰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)不再提示

擦寫Flash時(shí)一定不能開啟系統(tǒng)全局中斷嗎?

痞子衡嵌入式 ? 來(lái)源:痞子衡嵌入式 ? 2023-02-10 14:27 ? 次閱讀

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是i.MXRT下FlexSPI driver實(shí)現(xiàn)Flash編程時(shí)對(duì)于中斷支持問題。

前段時(shí)間有客戶在官方社區(qū)反映 i.MXRT1170 下使用官方 SDK 里 FlexSPI 驅(qū)動(dòng)去擦寫 Flash 時(shí)不能很好地支持全局中斷。客戶項(xiàng)目里用了兩塊 NOR Flash,分別掛在不同的 FlexSPI 上,一塊 Flash 用于存儲(chǔ) XIP 代碼(FlexSPI1),另一塊 Flash 用于存儲(chǔ)項(xiàng)目資源數(shù)據(jù)(FlexSPI2),顯然這樣的設(shè)計(jì)原理上是沒有問題的,那為什么使能了中斷會(huì)出問題呢?今天痞子衡來(lái)分析下這個(gè)問題:

Note: 客戶測(cè)試的 SDK 版本為 2.12.1,對(duì)應(yīng)的 FlexSPI driver 版本為 2.3.6

一、為什么擦寫Flash時(shí)經(jīng)常需要關(guān)全局中斷?

在具體分析客戶問題之前,我們先來(lái)聊聊嵌入式應(yīng)用里應(yīng)對(duì) NOR Flash 的擦寫為何大部分情況下都是要關(guān)閉全局中斷(這里假設(shè)執(zhí)行代碼空間與擦寫操作空間在同一個(gè) Flash 上,當(dāng)然是在不同區(qū)域),這其實(shí)跟如下兩個(gè)特性有關(guān):

1.1 RWW特性(Read-While-Write)

RWW 特性的意思是在 Flash 執(zhí)行擦寫命令進(jìn)入 Busy 狀態(tài)期間(Flash 內(nèi)部狀態(tài)寄存器 WIP 位變狀態(tài) 1)還能否繼續(xù)響應(yīng)非操作區(qū)域的讀訪問。如果 SR[WIP] = 1 時(shí)還能夠支持讀訪問,則該 Flash 支持 RWW,反之則不支持 RWW。

85961c98-a879-11ed-bfe3-dac502259ad0.png

絕大部分 Flash 都是不支持 RWW 特性的,這就是為什么 Flash 擦寫操作代碼本身是需要重定向到 RAM 里去執(zhí)行(尤其是回讀 SR[WIP] 狀態(tài)的代碼)。對(duì)于支持 RWW 特性的 Flash,一般是以 Block 為單位,F(xiàn)lash 擦寫操作代碼放在 BlockX 里執(zhí)行,則可以操作 BlockX 以外的其它 Block 區(qū)域,且不需要做代碼重定向。

現(xiàn)在你應(yīng)該知道對(duì)于不支持 RWW 的 Flash 為什么擦寫時(shí)需要關(guān)閉全局中斷了,因?yàn)闊o(wú)法保證中斷響應(yīng)相關(guān)代碼全都重定向到 RAM 里了,所以干脆在 Flash 擦寫期間不響應(yīng)任何中斷。

1.2 SCLK Stop特性

SCLK Stop 特性的意思是在 Flash 執(zhí)行寫入命令接受主設(shè)備傳輸過來(lái)的 Page 數(shù)據(jù)期間,如果總線上 SCLK 停止(一般情況是 FlexSPI 這一端的 TXFIFO 為空或者觸發(fā)空條件),則 Flash 能否也暫停接受當(dāng)前 Page 數(shù)據(jù)直到 SCLK 繼續(xù)輸出從而繼續(xù)處理剩下的 Page 數(shù)據(jù)。

絕大部分 Flash 是不支持 SCLK Stop 特性的,因此在 MCU 端如果傳輸 Page 數(shù)據(jù),需要一次性連續(xù)傳輸完成,一旦中途被打斷,則兩次不連續(xù)的 Page 數(shù)據(jù)傳輸可能無(wú)法得到想要的 Page 寫入結(jié)果。這也是為何 Flash 寫入期間我們需要關(guān)閉中斷。

85afacd0-a879-11ed-bfe3-dac502259ad0.png

二、FlexSPI外設(shè)寫操作設(shè)計(jì)

關(guān)于 i.MXRT 上的 FlexSPI 外設(shè)基本情況,痞子衡有兩篇舊文 《FlexSPI支持在Flash XIP原理》、《FlexSPI支持AHB方式寫入Flash》,大家先讀一下有個(gè)初步了解。這里痞子衡想重點(diǎn)說(shuō)一下 FlexSPI 關(guān)于 IPG 方式寫操作的設(shè)計(jì),下圖為 FlexSPI 外設(shè)的模塊框圖,痞子衡用綠色線標(biāo)出了 IPG 方式寫入的通路,這里大家可以看出其中 IP_TX_FIFO 模塊起了重要的數(shù)據(jù)緩沖作用,驅(qū)動(dòng)里往 FLEXSPI->TFDRx 寄存器寫入的 Page 數(shù)據(jù)會(huì)先被裝載進(jìn) IP_TX_FIFO 里,然后再傳輸出去。

85b9d016-a879-11ed-bfe3-dac502259ad0.png

不同 i.MXRT 型號(hào)上 IP_TX_FIFO 大小不一樣,目前有三種大小:128/256/1024 Bytes。對(duì)于 QuadSPI/OctalSPI NOR Flash 來(lái)說(shuō),Page 大小一般是 256 Bytes;對(duì)于 HyperBus Flash,Page 大小一般是 512 Bytes。所以在 i.MXRT10xx 上 IP_TX_FIFO 是不足以緩沖整個(gè) Page 的,i.MXRT117x 上可以緩沖 QuadSPI/OctalSPI NOR 類型的 Page,i.MXRT118x/5xx/6xx 上則可以緩沖全部 NOR Flash 類型的 Page。對(duì)于 Page 數(shù)據(jù)不能全部緩沖的情況,則需要一邊傳輸一邊緩沖。

型號(hào) FlexSPI外設(shè) IP TX FIFO大小
i.MXRT118x 1 x dual-channel /8-bit
1 x dual-channel /16-bit
1024 Bytes
i.MXRT117x
i.MXRT116x
1 x dual-channel /8-bit
1 x dual-channel /16-bit
256 Bytes
i.MXRT106x
i.MXRT1042
2 x dual-channel /8-bit 128 Bytes
i.MXRT105x 1 x dual-channel /8-bit 128 Bytes
i.MXRT1024 2 x dual-channel /8-bit 128 Bytes
i.MXRT1021
i.MXRT1015
1 x dual-channel /8-bit 128 Bytes
i.MXRT1011 1 x dual-channel /8-bit 128 Bytes
i.MXRT6xx 1 x dual-channel /8-bit 1024 Bytes
i.MXRT5xx 2 x dual-channel /8-bit 1024 Bytes

在具體裝載數(shù)據(jù)進(jìn) IP_TX_FIFO 時(shí),主要涉及如下三個(gè) FLEXSPI 寄存器,IP_TX_FIFO 一次只能被填入 watermark level 大小的數(shù)據(jù),想要把全部 Page 數(shù)據(jù)填進(jìn) IP_TX_FIFO,需要分多次裝載。只要 FLEXSPI->INTR[IPTXWE] 標(biāo)志為 0, 即代表 IP_TX_FIFO 剩余空間大于等于 watermark level,那么就可以繼續(xù)裝載。

FLEXSPI->IPTXFCR[TXWMRK]  -- 設(shè)置一次裝載進(jìn) IP_TX_FIFO 的數(shù)據(jù)長(zhǎng)度(即 watermark level),8 Bytes為單位
FLEXSPI->TFDRx            -- 按 watermark level 長(zhǎng)度填入 IP_TX_FIFO 裝載數(shù)據(jù)
FLEXSPI->INTR[IPTXWE]     -- 觸發(fā) IP_TX_FIFO 的一次裝載
85c79b60-a879-11ed-bfe3-dac502259ad0.png

三、客戶問題及FlexSPI driver寫操作流程

前面鋪墊了這么多,終于來(lái)到客戶遇到的 FlexSPI 驅(qū)動(dòng)對(duì)于中斷不支持的問題了。因?yàn)榭蛻羰褂昧藘善?Flash,所以不存在 RWW 限制問題,那剩下的原因就跟 SCLK Stop 特性有關(guān),即 IP_TX_FIFO 并沒有緩沖全部的 Page,導(dǎo)致 Page 傳輸過程被中斷打斷了,然后 IP_TX_FIFO 因?yàn)榫彌_數(shù)據(jù)全部發(fā)完而使 FlexSPI 模塊進(jìn)入了 SCLK Stop 狀態(tài)。

我們直接打開 fsl_flexspi.c 驅(qū)動(dòng)文件,找到跟寫操作相關(guān)的 FLEXSPI_TransferBlocking() 函數(shù),在函數(shù)實(shí)現(xiàn)里可以發(fā)現(xiàn),啟動(dòng)寫傳輸時(shí)序的控制位 FLEXSPI->IPCMD[TRG] 是在 IP_TX_FIFO 填充動(dòng)作 FLEXSPI_WriteBlocking() 函數(shù)之前被開啟的,那這樣的實(shí)現(xiàn)確實(shí)是不能夠很好地支持中斷的。

85d164c4-a879-11ed-bfe3-dac502259ad0.png

四、如何改進(jìn)FlexSPI driver支持中斷?

知道了原因所在,改起來(lái)也很簡(jiǎn)單。如果是 QuadSPI/OctalSPI NOR Flash 類型(Page=256 Bytes),在 i.MXRT117x 上,其 IP_TX_FIFO 大小為 256 Bytes,能夠緩沖全部的 Page 大小,則可以先調(diào)用 FLEXSPI_WriteBlocking() 裝載全部的 Page 數(shù)據(jù),然后再開啟 FLEXSPI->IPCMD[TRG] 去觸發(fā)寫傳輸時(shí)序,這時(shí)候就不怕被中斷打斷了,如下代碼所示。

當(dāng)然下面代碼只是一個(gè) workaround 式的實(shí)現(xiàn)示例,不是一個(gè)完整的解決方案,畢竟 FlexSPI 驅(qū)動(dòng)要適配全部 i.MXRT 型號(hào)以及全部類型的 NOR Flash,此外還適用 NAND 型 Flash(Page 一般是 2KB),這時(shí)候需要根據(jù)情況拆分調(diào)用多次 FLEXSPI_WriteBlocking() 函數(shù)(不管怎樣要保證啟動(dòng)寫傳輸時(shí)序前,把 IP_TX_FIFO 先裝滿)。

status_tFLEXSPI_TransferBlocking(FLEXSPI_Type*base,flexspi_transfer_t*xfer)
{
//代碼略去

/*StartTransfer.*/
if((xfer->cmdType==kFLEXSPI_Write)||(xfer->cmdType==kFLEXSPI_Config))
{
result=FLEXSPI_WriteBlocking(base,xfer->data,xfer->dataSize);
base->IPCMD|=FLEXSPI_IPCMD_TRG_MASK;
}
elseif(xfer->cmdType==kFLEXSPI_Read)
{
base->IPCMD|=FLEXSPI_IPCMD_TRG_MASK;
result=FLEXSPI_ReadBlocking(base,xfer->data,xfer->dataSize);
}
else
{
base->IPCMD|=FLEXSPI_IPCMD_TRG_MASK;
}

//代碼略去
}

至此,i.MXRT下FlexSPI driver實(shí)現(xiàn)Flash編程時(shí)對(duì)于中斷支持問題痞子衡便介紹完畢了,掌聲在哪里~~~

審核編輯:湯梓紅

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

    關(guān)注

    10

    文章

    1662

    瀏覽量

    150954
  • 存儲(chǔ)
    +關(guān)注

    關(guān)注

    13

    文章

    4499

    瀏覽量

    87052
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3679

    瀏覽量

    94847
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    904

    瀏覽量

    42500
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1065

    瀏覽量

    47654

原文標(biāo)題:擦寫Flash時(shí)一定不能開啟系統(tǒng)全局中斷嗎?

文章出處:【微信號(hào):pzh_mcu,微信公眾號(hào):痞子衡嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    華大單片機(jī)如何開啟或關(guān)閉全局中斷

    華大單片機(jī)如何開啟或關(guān)閉全局中斷
    發(fā)表于 03-25 13:38

    如何提高M(jìn)SP430G系列單片機(jī)的Flash擦寫壽命?

    Flash 與EEPROM 在擦寫壽命上存在一定差距,所以在實(shí)際應(yīng)用中,這種應(yīng)用方式并不能夠滿足所有客戶的需求。本應(yīng)用筆記介紹了使用代碼區(qū)域Flas
    發(fā)表于 09-23 08:31

    MSP430G系列單片機(jī)的Flash擦寫壽命怎么提高?

    Flash,可用于存儲(chǔ)非易失性數(shù)據(jù),但是由于 Flash 與 EEPROM 在擦寫壽命上存在一定差距,所以在實(shí)際應(yīng)用中,這種應(yīng)用方式并不能
    發(fā)表于 10-18 09:00

    開啟WWDG 片內(nèi)flash寫異常

    擦寫過程中,中斷程序是無(wú)法執(zhí)行的,擦寫過程觸發(fā)喂狗中斷失敗,導(dǎo)致系統(tǒng)復(fù)位。如果flash
    發(fā)表于 02-22 19:33

    為什么在UCOSIII外部中斷服務(wù)函數(shù)中不能開啟已經(jīng)創(chuàng)建的軟件定時(shí)器?

    個(gè)外部中斷服務(wù)函數(shù)中,開啟個(gè)已經(jīng)創(chuàng)建的軟件定時(shí)器,會(huì)開啟不成功返回的錯(cuò)誤碼:OS_ERR_TMR_ISR錯(cuò)誤碼說(shuō)明:if the ca
    發(fā)表于 06-02 14:13

    FLASH擦寫時(shí)間

    STM32f0301. FLASH擦寫時(shí)間2. FLASH擦寫次數(shù)和數(shù)據(jù)保存年限只能擦寫1000次,有點(diǎn)少。非必要,不要
    發(fā)表于 08-05 06:46

    如何對(duì)HCS12單片機(jī)的FLASH進(jìn)行擦寫

    由于在我的項(xiàng)目中,需要實(shí)現(xiàn)對(duì)HCS12單片機(jī)的FLASH進(jìn)行擦寫,所以難免會(huì)遇到對(duì)全局地址的操作,因?yàn)閷?duì)FLASH擦寫操作是必須使用
    發(fā)表于 03-02 06:20

    要想電流測(cè)得準(zhǔn),一定不能忽視的技術(shù)細(xì)節(jié)(第二講)

    要想電流測(cè)得準(zhǔn),一定不能忽視的技術(shù)細(xì)節(jié)(第二講)
    的頭像 發(fā)表于 07-02 11:40 ?3108次閱讀

    STM32F0F1F4內(nèi)部flash擦寫時(shí)間和壽命

    STM32f0301. FLASH擦寫時(shí)間2. FLASH擦寫次數(shù)和數(shù)據(jù)保存年限只能擦寫1000次,有點(diǎn)少。非必要,不要
    發(fā)表于 12-01 20:36 ?14次下載
    STM32F0F1F4內(nèi)部<b class='flag-5'>flash</b><b class='flag-5'>擦寫</b>時(shí)間和壽命

    I.MXRT FreeRTOS環(huán)境下擦寫外部Flash

    在FreeRTOS環(huán)境下,如果外部擦寫 Flash,禁用指令緩存以避免在多個(gè)任務(wù)中使用來(lái)自Flash 的分支預(yù)測(cè)和應(yīng)用程序同步操作 Flash的緩存預(yù)加載指令。因?yàn)榇a是XIP,所以向
    的頭像 發(fā)表于 01-30 09:18 ?2625次閱讀

    探討i.MX RT下FlexSPI driver實(shí)現(xiàn)Flash編程時(shí)對(duì)于中斷支持問題

    前段時(shí)間有客戶在官方社區(qū)反映i.MX RT1170下,使用官方SDK里FlexSPI驅(qū)動(dòng)去擦寫Flash時(shí)不能很好地支持全局中斷。 客戶項(xiàng)目
    的頭像 發(fā)表于 02-06 15:09 ?1463次閱讀

    什么是全局中斷

    什么是全局中斷全局中斷使能位控制著“所有”中斷,它如果關(guān)閉的話會(huì)屏蔽其它中斷,有人經(jīng)常關(guān)閉它,
    的頭像 發(fā)表于 06-14 18:25 ?3604次閱讀

    語(yǔ)音芯片的型號(hào)有哪些?為什么強(qiáng)烈推薦使用flash型可擦寫

    語(yǔ)音芯片的型號(hào)有哪些?為什么強(qiáng)烈推薦使用flash型可擦寫的芯片。這里我們簡(jiǎn)單描述下如下常見類容: 1、他們都有什么特點(diǎn)?以及發(fā)展的歷程簡(jiǎn)介 2、常見的語(yǔ)音芯片有哪些? 3、為什么推薦使用
    的頭像 發(fā)表于 08-14 11:05 ?1015次閱讀
    語(yǔ)音芯片的型號(hào)有哪些?為什么強(qiáng)烈推薦使用<b class='flag-5'>flash</b>型可<b class='flag-5'>擦寫</b>的

    什么是可重復(fù)擦寫Flash型)語(yǔ)音芯片?

    什么是可重復(fù)擦寫Flash型)語(yǔ)音芯片?可重復(fù)擦寫Flash型)語(yǔ)音芯片是種嵌入式語(yǔ)音存儲(chǔ)解決方案,采用了
    的頭像 發(fā)表于 12-14 10:08 ?851次閱讀
    什么是可重復(fù)<b class='flag-5'>擦寫</b>(<b class='flag-5'>Flash</b>型)語(yǔ)音芯片?

    NAND Flash擦寫次數(shù)介紹

    NAND Flash作為非易失性存儲(chǔ)技術(shù)的重要員,其擦寫次數(shù)是評(píng)估其性能和壽命的關(guān)鍵因素之。以下將詳細(xì)介紹NAND Flash
    的頭像 發(fā)表于 07-29 17:18 ?5135次閱讀