日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年07月19日(星期六)

2018年07月19日 | STM32CubeMx + SD Card + FatFs 讀寫(xiě)SD卡死等問(wèn)題

發(fā)布者:老桃子 來(lái)源: eefocus關(guān)鍵字:STM32CubeMx  Card  FatFs  讀寫(xiě)SD  卡死 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

Cube Mx使用較新版本 Version:4.24.0

MDK v5.20

STM32F429ZGT6

兩年以前記得試過(guò)SD卡讀寫(xiě),好像不是單純的Read和Write,應(yīng)該是用了文件系統(tǒng),很順利的試驗(yàn)成功了,所以源碼和記錄都沒(méi)留,這次要做一個(gè)新的板子,真所謂苦難重重啊,到現(xiàn)在32.768K的晶振一直沒(méi)起振,由原來(lái)的10P電容換了6P的,還是不行,應(yīng)該說(shuō)偶爾可以,但生產(chǎn)代碼中MX_RTC_Init() 依然死在里面,LSE未就緒啊~, 言歸正傳,寫(xiě)了一個(gè)試驗(yàn)SD卡的程序,f_open 死在路上了,經(jīng)調(diào)試發(fā)現(xiàn)ReadStatus 始終不會(huì)置1,唯一修改其值的方法BSP_SD_ReadCpltCallback根本沒(méi)人調(diào)用,先是懷疑自己配置,在方法SD_read中直接調(diào)用了BSP_SD_ReadBlocks_DMA,可見(jiàn),不用DMA不行,配置SDIO的DMA,如下


通過(guò)調(diào)試,還是不行,現(xiàn)在的中斷函數(shù)已經(jīng)被調(diào)用了HAL_DMA_IRQHandler,中斷方法中傳輸完成調(diào)用hdma->XferM1CpltCallback(hdma); 而在讀取方法中設(shè)置回調(diào) hsd->hdmarx->XferCpltCallback = SD_DMAReceiveCplt; 在SD_DMAReceiveCplt方法中最后調(diào)用了HAL的回調(diào)HAL_SD_RxCpltCallback(hsd);而此方法又空,和希望的回調(diào)基本同名BSP_SD_ReadCpltCallback。所以把讀寫(xiě)都放到此方法里(文件stm32f4xx_hal_sd.c 頭加入extern void BSP_SD_ReadCpltCallback(void); extern void BSP_SD_WriteCpltCallback(void);)至此,Open方法過(guò)去了,但寫(xiě)方法一直失敗,原因是HAL_SD_TxCpltCallback居然沒(méi)地方調(diào)用,放到方法SD_DMATransmitCplt里,寫(xiě)一次后返回HAL_OK,但hsd->State一直是busy,導(dǎo)致下次讀直接返回HAL_ERROR,再次在方法SD_DMATransmitCplt中添加hsd->State = HAL_SD_STATE_READY;至此SD卡讀寫(xiě)正常。

總結(jié)一下生成代碼后的改動(dòng):

stm32f4xx_hal_sd.c


 //dp:add at2018.6.20

extern void BSP_SD_ReadCpltCallback(void);

extern void BSP_SD_WriteCpltCallback(void);

/**

  * @brief Tx Transfer completed callbacks

  * @param hsd Pointer to SD handle

  * @retval None

  */

 __weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)

{

  /* Prevent unused argument(s) compilation warning */

  //UNUSED(hsd);

    //dp:add

    BSP_SD_WriteCpltCallback();

  /* NOTE : This function should not be modified, when the callback is needed,

            the HAL_SD_TxCpltCallback can be implemented in the user file

   */

}

 

/**

  * @brief Rx Transfer completed callbacks

  * @param hsd Pointer SD handle

  * @retval None

  */

__weak void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)

{

  /* Prevent unused argument(s) compilation warning */

  //UNUSED(hsd);

    //dp:add

    BSP_SD_ReadCpltCallback();

  /* NOTE : This function should not be modified, when the callback is needed,

            the HAL_SD_RxCpltCallback can be implemented in the user file

   */

}

/**

  * @brief  DMA SD transmit process complete callback 

  * @param  hdma DMA handle

  * @retval None

  */

static void SD_DMATransmitCplt(DMA_HandleTypeDef *hdma)     

{

  SD_HandleTypeDef* hsd = (SD_HandleTypeDef* )(hdma->Parent);

  

  /* Enable DATAEND Interrupt */

  __HAL_SD_ENABLE_IT(hsd, (SDIO_IT_DATAEND));

    //dp:add

    hsd->State = HAL_SD_STATE_READY;

    HAL_SD_TxCpltCallback(hsd);

}

例子程序:試了一下128的數(shù)組沒(méi)問(wèn)題,然后寫(xiě)到外擴(kuò)SRAM里,再寫(xiě)入SD卡,再讀128也沒(méi)問(wèn)題,最后的長(zhǎng)度判斷請(qǐng)忽略

/**

  ******************************************************************************

  * @file    xx_module_debug.c

  * @author  deep

  * @version V1.0.0

  * @date    2018.6.14

  * @brief   debug module

  ******************************************************************************

  */

 

#include "main.h"

#include "ff.h"

#include "string.h"

#include "xx_base_types.h"

 

U32 m_sram_addr = 0x64000000;

void xx_fill_sram(void);

 

FATFS fs;

FIL fil;

 

char sd_file_name[] = "hd_sd_test.txt";

 

extern void _Error_Handler(char *file, int line);

extern uint8_t retSD;

 

void hd_sd_file_read_write(void)

{

    //char szwrite[128];

    char szread[128];

    U32 bytewritten;

    U32 byteread;

    U32 ADD = m_sram_addr;

    

    if (retSD != 0)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    hd_fill_sram();

    

    retSD = f_mount(&fs, "", 0);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    retSD = f_open(&fil, sd_file_name, FA_CREATE_ALWAYS | FA_WRITE);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    //strcpy(szwrite, " This function is called in f_mount() function to create a new !!\n");

    //retSD = f_write(&fil, (void *)szwrite, strlen(szwrite), (void *)&bytewritten);

    retSD = f_write(&fil, (void *)ADD, 512, (void *)&bytewritten);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    retSD = f_write(&fil, (void *)(ADD + 512), 512, (void *)&bytewritten);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    retSD = f_write(&fil, (void *)(ADD + 512), 512, (void *)&bytewritten);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    retSD = f_close(&fil);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    retSD = f_open(&fil, sd_file_name, FA_READ);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    retSD = f_read(&fil, szread, sizeof(szread), (U32 *)&byteread);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    retSD = f_close(&fil);

    if (retSD)

    {

        _Error_Handler(__FILE__, __LINE__);

    }

    

    if (byteread == bytewritten)

    {

        printf("FATFS OK!!!!!!!!!");

    }

    else

    {

        printf("FATFS ERROR, ERROR, ERROR!");

    }

    

}

時(shí)鐘設(shè)置



SDIO設(shè)置



單次寫(xiě)操作大于512會(huì)出錯(cuò),暫時(shí)沒(méi)去糾結(jié)原因,回頭更新了版本再試。

-------------------------------------------------------------------------------------------------------

2018.6.21 發(fā)現(xiàn)個(gè)很弱的弱函數(shù)標(biāo)示,一直沒(méi)有注意

__weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)

注:

weak 顧名思義是“弱”的意思,所以如果函數(shù)名稱(chēng)前面加上__weak 修飾符,我們一般稱(chēng)這個(gè)函數(shù)為“弱函數(shù)”。

加上了__weak 修飾符的函數(shù),用戶(hù)可以在用戶(hù)文件中重新定義一個(gè)同名函數(shù),最終編譯器編譯的時(shí)候,會(huì)選擇用戶(hù)定義的函數(shù),如果用戶(hù)沒(méi)有重新定義這個(gè)函數(shù),

那么編譯器就會(huì)執(zhí)行__weak 聲明的函數(shù),并且編譯器不會(huì)報(bào)錯(cuò)。

所以最終更改,在文件 sd_diskio.c 中末尾加入:


/* USER CODE BEGIN lastSection */ 

/* can be used to modify / undefine previous code or add new code */

void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)

{

    BSP_SD_WriteCpltCallback();

}

 

void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)

{

     BSP_SD_ReadCpltCallback();

}

/* USER CODE END lastSection */

SD_DMATransmitCplt 方法中的添加暫時(shí)沒(méi)找到好辦法,防止生成時(shí)覆蓋。


關(guān)鍵字:STM32CubeMx  Card  FatFs  讀寫(xiě)SD  卡死 引用地址:STM32CubeMx + SD Card + FatFs 讀寫(xiě)SD卡死等問(wèn)題

上一篇:STM32 TFT學(xué)習(xí)筆記——SD卡讀寫(xiě)
下一篇:STM32F767 TF卡與FAT文件系統(tǒng)研究

推薦閱讀

1.問(wèn)題描述:使用STM32CubeMX,配置SDIO的4bit模式,對(duì)SD卡進(jìn)行讀寫(xiě)測(cè)試。2.準(zhǔn)備工作:軟件版本:STM32CubeMX–4.22.0 ;KEIL5 硬件平臺(tái):原子戰(zhàn)艦V3(1)軟件設(shè)置:I. SDIO選擇,這里選擇4bits模式,實(shí)際選1bits也可以。II. 時(shí)鐘樹(shù)配置III. SDIO模式時(shí)鐘分頻設(shè)置,其他默認(rèn)。 其他詳細(xì)配置請(qǐng)自行打開(kāi)源碼壓縮包里的MP3_Test.ioc查看。(2)Keil工程測(cè)試...
據(jù)外媒報(bào)道,瑞典電動(dòng)汽車(chē)(EV)制造商國(guó)能(NEVS)與自動(dòng)駕駛汽車(chē)初創(chuàng)公司AutoX達(dá)成了獨(dú)家戰(zhàn)略合作伙伴關(guān)系,雙方將把AutoX的自動(dòng)駕駛汽車(chē)技術(shù)集成至國(guó)能下一代汽車(chē)架構(gòu)中。并購(gòu)合作,自動(dòng)駕駛,國(guó)能AutoX,國(guó)能機(jī)器人出租車(chē),AutoX機(jī)器人出租車(chē),國(guó)能歐洲機(jī)器人出租車(chē)(圖片來(lái)源:國(guó)能電動(dòng)汽車(chē)瑞典有限公司官網(wǎng))蓋世汽車(chē)訊 據(jù)外媒報(bào)道,瑞典電動(dòng)汽車(chē)(...
STM8 CAN外部時(shí)鐘控制寄存器(CLK_CANCCR)地址偏移值:0x0B復(fù)位值:0x00位7:3保留。始終為0。位2:0CANDIV[2:0]:外部CAN時(shí)鐘分頻值由軟件寫(xiě)入,用于指定外部CAN時(shí)鐘的分頻值。詳情請(qǐng)參見(jiàn)章節(jié)23.9000:外部CAN時(shí)鐘=fHSE/1(復(fù)位值)001:外部CAN時(shí)鐘=fHSE/2010:外部CAN時(shí)鐘=fMASTER/4…111:外部CAN時(shí)鐘=fMASTER/8
愛(ài)芯科技AX630A亮相2021 ICDIA,大算力、低功耗和優(yōu)異的畫(huà)質(zhì)成最大優(yōu)勢(shì)中國(guó) 北京 2021年7月19日——近日,人工智能視覺(jué)芯片初創(chuàng)公司愛(ài)芯科技亮相“2021中國(guó)集成電路設(shè)計(jì)創(chuàng)新大會(huì)暨IC應(yīng)用博覽會(huì)”(簡(jiǎn)稱(chēng)ICDIA),并重點(diǎn)展示了其第一顆高性能、低功耗人工智能視覺(jué)處理器芯片——AX630A。無(wú)論是瞬息萬(wàn)變的國(guó)際市場(chǎng)格局,還是今非昔比的國(guó)內(nèi)產(chǎn)業(yè)環(huán)境,都表...

史海拾趣

問(wèn)答坊 | AI 解惑

某個(gè)強(qiáng)人的電子競(jìng)賽經(jīng)驗(yàn)介紹

本帖最后由 paulhyde 于 2014-9-15 09:42 編輯 很值得學(xué)習(xí)的大賽經(jīng)驗(yàn)介紹!讓你少走彎路??!  …

查看全部問(wèn)答∨

【藏書(shū)閣】電子線(xiàn)路實(shí)驗(yàn) 方建中

目錄: 第一篇 模擬電路 實(shí)驗(yàn)一 常用電子儀器的使用 實(shí)驗(yàn)二 單級(jí)低頻放大器的設(shè)計(jì)、安裝與調(diào)試 實(shí)驗(yàn)三 集成運(yùn)算放大器及其應(yīng)用 實(shí)驗(yàn)四 OTL低頻功率放大器 實(shí)驗(yàn)五 音頻功率放大器的設(shè)計(jì)、安裝與調(diào)試 實(shí)驗(yàn)六 集成穩(wěn)壓電源 實(shí)驗(yàn)七 LC振蕩器 ...…

查看全部問(wèn)答∨

全國(guó)電子設(shè)計(jì)大賽的優(yōu)秀作品集錦???

哪本書(shū)或者那個(gè)網(wǎng)站有最近幾年全國(guó)電子設(shè)計(jì)大賽的優(yōu)秀作品集錦???…

查看全部問(wèn)答∨

幫幫忙急求:誰(shuí)知道嵌入式精簡(jiǎn)TCP/IP

    誰(shuí)知道嵌入式精簡(jiǎn)TCP/IP協(xié)議有多大要用多大的flash/ram來(lái)存儲(chǔ),是不是單片機(jī)上有這個(gè)協(xié)議就可以實(shí)現(xiàn)網(wǎng)絡(luò)通信了??? 如果不行還需要什么???…

查看全部問(wèn)答∨

計(jì)算機(jī)組成原理 和 計(jì)算機(jī)體系結(jié)構(gòu) 有什么不同?

已經(jīng)學(xué)了計(jì)算機(jī)組成原理,下學(xué)期有計(jì)算機(jī)體系結(jié)構(gòu)這門(mén)課選,不知道兩者有多大的不同?大家給點(diǎn)意見(jiàn)。…

查看全部問(wèn)答∨

也談家電產(chǎn)品之模糊控制技術(shù)(上)

本帖最后由 jameswangsynnex 于 2015-3-3 20:04 編輯 當(dāng)今絢麗多彩的家電市場(chǎng),產(chǎn)品最受關(guān)注的賣(mài)點(diǎn)莫過(guò)于“智能”、“人性化”、“全自動(dòng)”等。從用戶(hù)的角度來(lái)看,能配上如此美名的產(chǎn)品,應(yīng)該是用戶(hù)只需按觸一個(gè)“START”開(kāi)關(guān),不論具體應(yīng)用的對(duì)象 ...…

查看全部問(wèn)答∨

求430控制十字路口交通燈程序 急急急

求430控制十字路口交通燈程序 急急急  …

查看全部問(wèn)答∨

電路圖的畫(huà)法規(guī)則

電路圖的畫(huà)法規(guī)則,為了使看圖者能正確方便理解電路圖的全部?jī)?nèi)容,繪制電路圖時(shí),,,,... 資源中心下載地址:https://download.eeworld.com.cn/detail/qwqwqw2088/281462 直接下載:電路圖的畫(huà)法規(guī)則…

查看全部問(wèn)答∨

【轉(zhuǎn)】推挽輸出與開(kāi)漏輸出的區(qū)別

Push- Pull輸出就是一般所說(shuō)的推挽輸出,在CMOS電路里面應(yīng)該較CMOS輸出更合適,因?yàn)樵贑MOS里面的push-pull輸出能力不可能做得雙極那么大。輸出能力看IC內(nèi)部輸出極N管P管的面積。和開(kāi)漏輸出相比,push-pull的高低電平由IC的電源低定,不能簡(jiǎn)單的做 ...…

查看全部問(wèn)答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved