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í)覆蓋。
上一篇:STM32 TFT學(xué)習(xí)筆記——SD卡讀寫
下一篇:STM32F767 TF卡與FAT文件系統(tǒng)研究
推薦閱讀
史海拾趣
G24i在發(fā)展過程中始終注重國際合作與市場拓展。公司董事長Mr. Edward J Stevenson及其團(tuán)隊(duì)多次訪問國內(nèi)外知名科研機(jī)構(gòu)和企業(yè),就DSSC技術(shù)的研發(fā)、產(chǎn)業(yè)化等方面進(jìn)行深入交流。同時(shí),G24i還積極參加國際太陽能展會(huì)和論壇,展示其最新的技術(shù)成果和產(chǎn)品應(yīng)用。這些努力不僅提升了G24i在國際市場上的知名度和影響力,也為公司贏得了更多的合作機(jī)會(huì)和市場份額。通過國際合作與市場拓展,G24i正逐步成為全球DSSC領(lǐng)域的領(lǐng)軍企業(yè)之一。
1998年,Amphenol Nexus Technologies經(jīng)歷了一次重要的領(lǐng)導(dǎo)層更迭。拜爾斯先生退休,弗雷德·法拉哈尼(Fred Farahani)收購了Nexus, Inc.的股份,并與弗拉納根先生成為合伙人。在Fred的領(lǐng)導(dǎo)下,公司開始關(guān)注銷售和開發(fā)方面的新機(jī)遇,產(chǎn)品基礎(chǔ)也擴(kuò)展到包括微型連接器系列。這一變革為公司帶來了新的增長點(diǎn),使其在激烈的市場競爭中保持了領(lǐng)先地位。
在2003年,全鵬公司成為巴西Coletek集團(tuán)的一員,開始了其在南美洲市場的征程。起初,全鵬在巴西設(shè)立了提供系統(tǒng)組裝所需機(jī)殼、鍵盤、鼠標(biāo)、喇叭等配件的組裝工廠,以滿足當(dāng)?shù)厥袌龅某醪叫枨蟆kS著業(yè)務(wù)的不斷擴(kuò)大,全鵬在2004年與當(dāng)?shù)厥姓献?,?guī)劃并建設(shè)了一座總廠房面積達(dá)8000平方公尺的新工廠,配置了六條組裝生產(chǎn)線和兩條印刷生產(chǎn)線,以及一個(gè)發(fā)貨倉庫。這座新工廠迅速成為全鵬在巴西市場的發(fā)貨中心,推動(dòng)了全鵬在當(dāng)?shù)氐臉I(yè)務(wù)增長。
近年來,CINTERION與泰雷茲達(dá)成戰(zhàn)略合作,共同推出了創(chuàng)新型物聯(lián)網(wǎng)無線通信模組Cinterion MV32。這款模組結(jié)合了泰雷茲在連接管理方面的靈活性和CINTERION在無線通信模組技術(shù)上的優(yōu)勢,為制造商提供了快速構(gòu)建和維護(hù)高性能5G設(shè)備的解決方案。這一合作不僅加強(qiáng)了CINTERION在物聯(lián)網(wǎng)領(lǐng)域的市場地位,也為其在未來的發(fā)展中注入了新的活力。
以上五個(gè)故事均基于CINTERION在電子行業(yè)中的發(fā)展歷程和成就進(jìn)行描述,旨在客觀呈現(xiàn)其在不同領(lǐng)域的發(fā)展軌跡和技術(shù)實(shí)力。
振寶佳(DMBJ)公司自成立之初,就專注于貼片鋁電解電容的研發(fā)與生產(chǎn)。在1998年之前,公司一直在臺(tái)灣深耕細(xì)作,積累了豐富的技術(shù)實(shí)力和市場資源。進(jìn)入21世紀(jì),隨著電子產(chǎn)業(yè)的快速發(fā)展,振寶佳意識(shí)到技術(shù)突破的重要性。于是,公司投入大量資源,研發(fā)出多項(xiàng)專利技術(shù),這些技術(shù)不僅提升了產(chǎn)品的性能,也增強(qiáng)了公司的市場競爭力。
在成立初期,ELPIDA憑借其強(qiáng)大的技術(shù)實(shí)力和規(guī)模效應(yīng),迅速在全球DRAM市場中占據(jù)了重要地位。公司不斷推出創(chuàng)新產(chǎn)品,擴(kuò)大市場份額,成為行業(yè)內(nèi)的重要參與者。然而,隨著市場競爭的加劇和技術(shù)的快速變化,ELPIDA也面臨著巨大的挑戰(zhàn)。
DOS 微軟一開始選用了派特森的Q-DOS “QUICK AND DISK OPERATING SYSTEM ”為基礎(chǔ)然后再擴(kuò)充功能而成 MS-DOS,主要是采用由IBM 提供的使用8088 微處理器的計(jì)算機(jī)作開發(fā)平臺(tái),它是以16 字節(jié)單人單工操作系統(tǒng),特別適合一些功能簡單 ...… 查看全部問答∨ |
專家好: 我的PDA前兩天在公司測試部門發(fā)現(xiàn),按鍵進(jìn)入深度休眠后,不能馬上按鍵喚醒,只有等5~6秒(大約值)后才能馬上喚醒 我的按鍵休眠是設(shè)置的GPIO0,喚醒源也是GPIO0 具體的設(shè)置如下: &nbs ...… 查看全部問答∨ |
shuiyan 大哥你好! 小弟最近在搞OAL里的中斷函數(shù)OALTimerInit遇到個(gè)問題,是這樣的: 我在private下的armtrap.s里發(fā)現(xiàn)了中斷的異常跳轉(zhuǎn)表 VectorInstructions ldr pc, [p ...… 查看全部問答∨ |
|
本人把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 ...… 查看全部問答∨ |
$(\'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\', ...… 查看全部問答∨ |
我寫了兩段不同的verilog代碼來實(shí)現(xiàn)同一個(gè)功能,現(xiàn)在我想比較哪個(gè)代碼在FPGA上跑的更快,我在Quartus II里如何看出來呢,請各位指導(dǎo)我一下,謝謝。… 查看全部問答∨ |
用jlink V8給目標(biāo)板提供3.3V電壓,就是把jlink 里面的跳線帽插到3.3V pin上然后連接 2148,一直這樣提示,試了兩個(gè)2148了,都是這樣的提示我如果用目標(biāo)板自己的電源,也是同樣的提示Feature(s): RDI,FlashDL,FlashBP,JFlash,GDBFullVTarget = 3.300 ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 直播已結(jié)束|如何通過【TI MSPM0 固件示例】及【常用電機(jī)驅(qū)動(dòng)器方案和拓?fù)洹?,?0分鐘內(nèi)旋轉(zhuǎn)電機(jī)
- 快來訪問泰克高速串行通信專題 配置您的專屬解決方案 贏好禮!
- 有獎(jiǎng)活動(dòng)“庖丁”解智能睡眠監(jiān)測儀,一波“水軍”來圍觀
- ADI有獎(jiǎng)下載活動(dòng)之20:基于NDIR和PID的ADI氣體探測器解決方案和新產(chǎn)品
- 【已結(jié)束】RIGOL直播|示波器、可編程直流電源應(yīng)用分享
- 村田在線課堂:健康篇
- 快來應(yīng)援吧!投票選出你最愛的TI培訓(xùn)課程