国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32H7使用FileX庫BUG,SD卡掛載失敗

這篇具有很好參考價值的文章主要介紹了STM32H7使用FileX庫BUG,SD卡掛載失敗。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

問題描述:

使用STM32H7+ThreadX+FileX,之前使用swissbit牌的存儲卡可正常使用,最近項目用了金士頓的存儲卡,發(fā)現(xiàn)無法掛載文件系統(tǒng)。

原因分析:

調(diào)試過程發(fā)現(xiàn),關(guān)閉D-Cache可以掛載使用exfat文件系統(tǒng)。
FileX對SD卡讀寫接口全部位于fx_stm32_sdio_driver.c中,查看該文件可以發(fā)現(xiàn)在讀寫函數(shù)中已經(jīng)考慮到使用Cache與DMA的情況,如下代碼所示。

SCB_InvalidateDCache_by_Addr((uint32_t*)scratch, DEFAULT_SECTOR_SIZE);
SCB_InvalidateDCache_by_Addr((uint32_t*)media_ptr->fx_media_driver_buffer, num_sectors * DEFAULT_SECTOR_SIZE);

SCB_InvalidateDCache_by_Addr()函數(shù)用于將該地址D-Cache無效化,無效化的意思是將Cache Line 標(biāo)記為無效,等同于刪除操作。這樣下次讀寫該地址數(shù)據(jù)時,D-Cache中無此數(shù)據(jù),CPU直接對SRAM讀寫數(shù)據(jù),保證CPU讀取到的數(shù)據(jù)是真實的。
源碼分析:
以讀取函數(shù)為例:

        case FX_DRIVER_READ:
        {
            media_ptr->fx_media_driver_status = FX_IO_ERROR;
            //TX_DISABLE /* disable interrupts */
           if ((ULONG)(media_ptr->fx_media_driver_buffer) & 0x03)
           {
              if (sd_read_data(media_ptr, media_ptr->fx_media_driver_logical_sector + media_ptr->fx_media_hidden_sectors,
                                media_ptr->fx_media_driver_sectors, 1) == FX_SUCCESS)
              {
                  media_ptr->fx_media_driver_status = FX_SUCCESS;
              }
           }
           ……

if ((ULONG)(media_ptr->fx_media_driver_buffer) & 0x03)判斷讀取地址是否4字節(jié)對齊,因為使用MDMA讀寫SD卡需要地址4字節(jié)對齊,并對sd_read_data()函數(shù)傳入相應(yīng)值。
sd_read_data()函數(shù)如下:

static UINT sd_read_data(FX_MEDIA *media_ptr, ULONG start_sector, UINT num_sectors, UINT use_scratch_buffer)
{
    INT i = 0;
    UINT status;
    if (use_scratch_buffer)
    {
        memset(scratch, '\0', DEFAULT_SECTOR_SIZE);
        for (i = 0; i < num_sectors; i++)
        {
            status = BSP_SD_ReadBlocks_DMA((uint32_t*)scratch, start_sector++, 1);

            if (status != BSP_ERROR_NONE)
            {
                status = FX_IO_ERROR;
                break;
            }

            if(tx_semaphore_get(&transfer_semaphore, DEFAULT_TIMEOUT) != TX_SUCCESS)
            {
                status = FX_BUFFER_ERROR;
                break;
            }
            else
            {
#if (ENABLE_CACHE_MAINTENANCE == 1)
                SCB_InvalidateDCache_by_Addr((uint32_t*)scratch, DEFAULT_SECTOR_SIZE);
#endif

                _fx_utility_memory_copy(scratch, media_ptr->fx_media_driver_buffer, DEFAULT_SECTOR_SIZE);
                media_ptr->fx_media_driver_buffer += DEFAULT_SECTOR_SIZE;
            }
        }

        if (i == num_sectors)
        {
            status = FX_SUCCESS;
        }
    }
    else
    {
        status = BSP_SD_ReadBlocks_DMA((uint32_t*)media_ptr->fx_media_driver_buffer, start_sector, num_sectors);

        if (status == BSP_ERROR_NONE)
        {
            if(tx_semaphore_get(&transfer_semaphore, DEFAULT_TIMEOUT) == TX_SUCCESS)
            {
#if (ENABLE_CACHE_MAINTENANCE == 1)
                SCB_InvalidateDCache_by_Addr((uint32_t*)media_ptr->fx_media_driver_buffer, num_sectors * DEFAULT_SECTOR_SIZE);
#endif
                status = FX_SUCCESS;
            }
            else
            {
                status =  FX_BUFFER_ERROR;
            }
        }
    }

    return status;
}

根據(jù)傳入?yún)?shù)判斷,若傳輸?shù)刂凡皇?字節(jié)對齊,則使用內(nèi)部定義的一塊32字節(jié)對齊的地址作為中轉(zhuǎn)站,先用MDMA讀取到數(shù)據(jù),再將數(shù)據(jù)拷貝到用戶提供地址。else分支若地址已經(jīng)是4字節(jié)對齊,則直接使用用戶提供的地址進行MDMA傳輸。
然而else分支的代碼存在一個bug,當(dāng)用戶傳入的地址為4字節(jié)對齊時,進入else分支,在MDMA傳輸完成后,進行SCB_InvalidateDCache_by_Addr()操作。但是該函數(shù)要求傳入的地址為32字節(jié)對齊,因為Cortex-M7內(nèi)核的Cache line大小為8個字。所以當(dāng)傳入的地址為4字節(jié)對齊但非32字節(jié)對齊時,SCB_InvalidateDCache_by_Addr()調(diào)用傳入的參數(shù)不符合要求,D-Cache緩存清除錯誤,使CPU讀取到緩存中錯誤的值。
STM32H7使用FileX庫BUG,SD卡掛載失敗,嵌入式,stm32,嵌入式

解決方案:

在判斷地址是否4字節(jié)對齊的地方,改成判斷地址是否32字節(jié)對齊(即0x03改成0x1f),共修改2行代碼,在代碼中搜索media_ptr->fx_media_driver_buffer即可找到。文章來源地址http://www.zghlxwxcb.cn/news/detail-861304.html

if ((ULONG)(media_ptr->fx_media_driver_buffer) & 0x1f)

到了這里,關(guān)于STM32H7使用FileX庫BUG,SD卡掛載失敗的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • STM32 CubeMX 無法將 STM32H7 的最大 CPU 頻率設(shè)置為 480 MHz

    STM32 CubeMX 無法將 STM32H7 的最大 CPU 頻率設(shè)置為 480 MHz

    使用stm32cubemx設(shè)置時鐘樹為480MHz時,提示 cpu clock frequency must be =200MHZ 對于STM32H7 需要CPU修訂版 為 V 才能達到 480 MHz 的最大頻率。 使用STM32Programmer查看芯片修訂版,確認(rèn)是V版本: 在STM32CubeMX PinConfiguration 界面修改RCC選項,將Product Version設(shè)置為V: 此時時鐘樹界面已可以設(shè)置48

    2024年02月16日
    瀏覽(16)
  • STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤

    STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤

    通過cubemx配置 實現(xiàn)STM32H7 SDMMC+FATFS+USBMSC+FREERTOS 虛擬U盤 1.使用FAFTS文件操作系統(tǒng),實現(xiàn)STM32虛擬U盤,讀寫外部SD卡,fatfs和usb mass storage class共存。 2.請先完成上一個帖子的步驟 -- 跳轉(zhuǎn)https://blog.csdn.net/hjn0618/article/details/130383593 硬件平臺:正點原子阿波羅 STM32H734IIT6 開發(fā)工具:

    2024年02月10日
    瀏覽(40)
  • cubmx基礎(chǔ)操作,hal庫基本配置流程之使用 stm32cubmx生成HAL庫進行g(shù)pio點亮led(stm32h7xx)(超詳細,小白教程)

    cubmx基礎(chǔ)操作,hal庫基本配置流程之使用 stm32cubmx生成HAL庫進行g(shù)pio點亮led(stm32h7xx)(超詳細,小白教程)

    HAL庫(硬件抽象層庫)是一個提供對底層硬件操作的抽象的庫,它使得開發(fā)者可以使用統(tǒng)一的接口進行硬件操作,而不必關(guān)心底層硬件的具體實現(xiàn)細節(jié)。HAL庫通常由硬件廠商提供,用于支持其硬件設(shè)備,并為其提供標(biāo)準(zhǔn)化的接口。 HAL庫的主要目的是簡化底層硬件的操作,使得

    2024年02月20日
    瀏覽(18)
  • STM32H7并行讀取AD7606數(shù)據(jù)以及片內(nèi)AD值不準(zhǔn)解決辦法

    STM32H7并行讀取AD7606數(shù)據(jù)以及片內(nèi)AD值不準(zhǔn)解決辦法

    先了解一下AD7606,16位,單電源,200k采樣率,8路,除了貴沒有其他缺點,數(shù)據(jù)相當(dāng)?shù)姆€(wěn),一個5V供電,不用運放的情況下采集電壓精度可以達到1mv,非常Nice 與單片機相連 單片機 調(diào)用代碼 測試發(fā)現(xiàn)AD采集到的電壓要遠小于實際電壓,H7的AD還是16位的,不能這么拉跨吧,在網(wǎng)上

    2024年02月11日
    瀏覽(25)
  • 【STM32H7 開發(fā)筆記】| 02 - 通過定時器級聯(lián)方式同步啟動多個定時器并輸出 PWM 波形

    【STM32H7 開發(fā)筆記】| 02 - 通過定時器級聯(lián)方式同步啟動多個定時器并輸出 PWM 波形

    (STM32H723xE/G) 所有定時器包括 兩個高級控制定時器、十二個通用定時器、兩個基本定時器、五個低功耗定時器、兩個看門狗定時器和一個SysTick定時器 。所有計時器計數(shù)器都可以在Debug模式下凍結(jié)。 本次實驗主頻配置的是500MHz 高級控制定時器(TIM1,TIM8)可以看作是在6通道

    2024年02月14日
    瀏覽(36)
  • STM32CUBEMX配置STM32H750時鐘480M時失敗

    STM32CUBEMX配置STM32H750時鐘480M時失敗

    STM32H750最高的時鐘是支持480M的,但是在CUBEMX新建工程配置始終時,卻無法設(shè)置為480M。 解決方案如下: 原因是電壓級別設(shè)置的問題。STM32CUBEMX默認(rèn)設(shè)置的事VOS3,是不能支持480M運行的。 在H750的參考手冊中有相應(yīng)的描述 必須設(shè)置為0時,系統(tǒng)的時鐘才能達到最高的480MHz ? ?

    2024年02月16日
    瀏覽(21)
  • stm32H743編譯器關(guān)于浮點類型強制轉(zhuǎn)換傳參的bug

    stm32H743編譯器關(guān)于浮點類型強制轉(zhuǎn)換傳參的bug

    局部函數(shù),正常傳參 當(dāng)測試函數(shù)作為局部函數(shù)和main函數(shù)寫在同一個文件中時,參數(shù)可以正常傳遞。函數(shù)參數(shù)和形參都為3.14 keil仿真截圖,形參正常 全局函數(shù),異常傳參 當(dāng)測試函數(shù)放到另一個文件中,在main函數(shù)中進行調(diào)用時,會發(fā)生異常參數(shù),函數(shù)形參轉(zhuǎn)換出錯 test.c main.

    2024年02月03日
    瀏覽(33)
  • STM32掛載SD卡基于Fatfs文件系統(tǒng)讀取文件信息

    STM32掛載SD卡基于Fatfs文件系統(tǒng)讀取文件信息

    ??本例程基于正點原子標(biāo)準(zhǔn)庫修改而來。 ??FatFs 相關(guān)API函數(shù)網(wǎng)站: http://elm-chan.org/fsw/ff/00index_e.html ??分別測試了SD卡模塊以及Mini SD卡模塊。 ??STM32f1單片機和TF卡、SD卡連接采用SPI通訊方式。 SD模塊: Mini SD卡模塊: ????如果需要采用SDIO驅(qū)動方式,那么需要采用下面這種

    2024年02月10日
    瀏覽(18)
  • STM32嵌入式系統(tǒng):將數(shù)據(jù)保存到SD卡的操作

    STM32嵌入式系統(tǒng):將數(shù)據(jù)保存到SD卡的操作 嵌入式系統(tǒng)在現(xiàn)代科技中扮演著重要角色,而STM32單片機是一種常用的嵌入式系統(tǒng)解決方案。本文將介紹如何使用STM32單片機將采集到的數(shù)據(jù)以TXT文件的格式保存到SD卡中,并且能夠方便地讀取這些本地數(shù)據(jù)。 硬件準(zhǔn)備 為了實現(xiàn)數(shù)據(jù)保

    2024年02月01日
    瀏覽(46)
  • STM32H743使用CubeMX配置Lwip、Freertos

    STM32H743使用CubeMX配置Lwip、Freertos

    硬件:野火挑戰(zhàn)者開發(fā)板STM32H743IIT6 軟件版本: CubeMX 6.7.0 STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 原理圖: 時鐘樹參數(shù)僅供參考 MPU配置需要查相關(guān)資料,一知半解 修改GPIO與硬件原理圖對應(yīng),串口參數(shù)默認(rèn) 參數(shù)配置與硬件對應(yīng) 此處網(wǎng)絡(luò)收發(fā)地址非常重要!??! 使能中斷 串口

    2024年02月07日
    瀏覽(42)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包