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

歷史上的今天

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

2018年07月19日 | STM32CubeMx + SD Card + FatFs 讀寫SD卡死等問題

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

Cube Mx使用較新版本 Version:4.24.0

MDK v5.20

STM32F429ZGT6

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


通過調(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。所以把讀寫都放到此方法里(文件stm32f4xx_hal_sd.c 頭加入extern void BSP_SD_ReadCpltCallback(void); extern void BSP_SD_WriteCpltCallback(void);)至此,Open方法過去了,但寫方法一直失敗,原因是HAL_SD_TxCpltCallback居然沒地方調(diào)用,放到方法SD_DMATransmitCplt里,寫一次后返回HAL_OK,但hsd->State一直是busy,導(dǎo)致下次讀直接返回HAL_ERROR,再次在方法SD_DMATransmitCplt中添加hsd->State = HAL_SD_STATE_READY;至此SD卡讀寫正常。

總結(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ù)組沒問題,然后寫到外擴(kuò)SRAM里,再寫入SD卡,再讀128也沒問題,最后的長度判斷請忽略

/**

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

  * @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è)置



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

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

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

__weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)

注:

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

加上了__weak 修飾符的函數(shù),用戶可以在用戶文件中重新定義一個(gè)同名函數(shù),最終編譯器編譯的時(shí)候,會(huì)選擇用戶定義的函數(shù),如果用戶沒有重新定義這個(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í)沒找到好辦法,防止生成時(shí)覆蓋。


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

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

推薦閱讀

2018俄羅斯世界杯最終定格在了高盧雄雞法國 4:1格子軍團(tuán)克羅地亞,法國隊(duì)第二次獲得世界杯冠軍。果然,世界杯冠軍從來沒有黑馬!世界杯需要的是足球文化的積淀,歷代球員的經(jīng)驗(yàn)積累,心理的比拼,難有一黑到底的馬!???一個(gè)月的世界杯賽程中,相比大家都選購了不錯(cuò)的大屏4K電視觀戰(zhàn)世界杯,其中哪些產(chǎn)品給大家留下了深刻的印象呢?本期我們就來盤點(diǎn)一...
Vox Power Ltd 宣布與全球電子元器件分銷商 Digi-Key Electronics 達(dá)成經(jīng)銷協(xié)議,面向全球 24 小時(shí)提供創(chuàng)新型可配置電源解決方案。“我們很高興可以通過 Digi-Key 將我們的產(chǎn)品推向全球市場,”Vox Power 首席執(zhí)行官 Marco Prinsloo 表示。“我們的模塊化產(chǎn)品幾乎可為任何單路或多路輸出應(yīng)用配置定制電源解決方案,讓客戶更具自由性和靈活...
四種STM8低功耗模式的主要特性如表12。(表12:STM8S低功耗模式管理)1.如果外設(shè)時(shí)鐘未被關(guān)閉2.包括通訊外設(shè)的中斷(參見中斷向量表)STM8等待(Wait)模式在運(yùn)行模式下執(zhí)行WFI(等待中斷)指令,可進(jìn)入等待模式。此時(shí)CPU停止運(yùn)行,但外設(shè)與中斷控制器仍保持運(yùn)行,因此功耗會(huì)有所降低。等待模式可與PCG(外設(shè)時(shí)鐘門控),降低CPU時(shí)鐘頻率,以及選擇低功耗時(shí)鐘源(LS...
一、51單片機(jī)標(biāo)識(shí)信息 通常我們所說的51單片機(jī)是指以51內(nèi)核擴(kuò)展出的單片機(jī)。生產(chǎn)51單片機(jī)的廠商很多,51單片機(jī)的型號(hào)也很多。下表列出了一些51單片機(jī)的廠商和型號(hào)。 以上提到的單片機(jī)都是51內(nèi)核擴(kuò)展出來的單片機(jī),只要學(xué)會(huì)了51單片機(jī)的應(yīng)用,這些單片機(jī)也就基本都能使用了。單片機(jī)都是相通的,不管是51單片機(jī)還是其它單片機(jī),都是用...

史海拾趣

問答坊 | AI 解惑

常見的嵌入式操作系統(tǒng)

DOS     微軟一開始選用了派特森的Q-DOS “QUICK AND DISK OPERATING SYSTEM ”為基礎(chǔ)然后再擴(kuò)充功能而成 MS-DOS,主要是采用由IBM 提供的使用8088 微處理器的計(jì)算機(jī)作開發(fā)平臺(tái),它是以16 字節(jié)單人單工操作系統(tǒng),特別適合一些功能簡單 ...…

查看全部問答∨

請教關(guān)于PXA270喚醒源的設(shè)置

專家好:    我的PDA前兩天在公司測試部門發(fā)現(xiàn),按鍵進(jìn)入深度休眠后,不能馬上按鍵喚醒,只有等5~6秒(大約值)后才能馬上喚醒 我的按鍵休眠是設(shè)置的GPIO0,喚醒源也是GPIO0 具體的設(shè)置如下:          &nbs ...…

查看全部問答∨

wince5.0的中斷向量地址問題

shuiyan 大哥你好!  小弟最近在搞OAL里的中斷函數(shù)OALTimerInit遇到個(gè)問題,是這樣的:  我在private下的armtrap.s里發(fā)現(xiàn)了中斷的異常跳轉(zhuǎn)表 VectorInstructions         ldr     pc, [p ...…

查看全部問答∨

如何在win ce下設(shè)置圖片的3D凸起效果?(C#) 謝謝了!

如何在win ce下設(shè)置圖片的3D凸起效果?(C#) 謝謝了!…

查看全部問答∨

touch panel驅(qū)動(dòng) 奇怪問題!

本人把wince6.0下的DeviceEmulator改到我的2440的開發(fā)板上運(yùn)行,因?yàn)镈eviceEmulator是基于2410的,現(xiàn)在改到2440下改動(dòng)也不是太大, 目前wince6.0的桌面已經(jīng)可以顯示出來了,但是觸摸屏卻一直動(dòng)不了,后來跟蹤發(fā)現(xiàn)觸摸屏驅(qū)動(dòng)已經(jīng)加載,而且第一次點(diǎn) ...…

查看全部問答∨

不好意思,問一下這個(gè)問題:-sh: ./helloworld: not found

我是一名初學(xué)者,今天終于完成了博創(chuàng)S3C2410上Linux 2.6.22的移植,網(wǎng)卡,文件系統(tǒng)都能正常使用,感覺蠻有成就感的。 但如今這個(gè)問題不知道如何解決了: 用編譯內(nèi)核和Busybox 1.5.1的編譯器編譯了一個(gè)helloworld,在開發(fā)板上用NFS掛載上,運(yùn)行./hello ...…

查看全部問答∨

全球首個(gè)太空機(jī)器人

$(\'swf_vSx\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://www.tudou.com/v/IJy11e9LXmk/v.swf\'), \'quality\', ...…

查看全部問答∨

Quartus II的用法

我寫了兩段不同的verilog代碼來實(shí)現(xiàn)同一個(gè)功能,現(xiàn)在我想比較哪個(gè)代碼在FPGA上跑的更快,我在Quartus II里如何看出來呢,請各位指導(dǎo)我一下,謝謝。…

查看全部問答∨

jlink v8識(shí)別不了LPC2148

用jlink V8給目標(biāo)板提供3.3V電壓,就是把jlink 里面的跳線帽插到3.3V pin上然后連接 2148,一直這樣提示,試了兩個(gè)2148了,都是這樣的提示我如果用目標(biāo)板自己的電源,也是同樣的提示Feature(s): RDI,FlashDL,FlashBP,JFlash,GDBFullVTarget = 3.300 ...…

查看全部問答∨

紅外接收頭的問題

目的:制作一個(gè)模塊,該模塊能檢測紅外發(fā)射管發(fā)出的紅外線,波長為940nm,紅外接收頭型號(hào)為IRM-3638,當(dāng)有接收頭接收到紅外光,那么模塊上的LED燈就亮 我畫的電路圖如下:     但是我的板子沒有達(dá)到預(yù)期目標(biāo),LED燈不亮,接收頭沒有 ...…

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

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

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

 
汽車開發(fā)圈

 
機(jī)器人開發(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