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í)覆蓋。
上一篇:STM32 TFT學(xué)習(xí)筆記——SD卡讀寫(xiě)
下一篇:STM32F767 TF卡與FAT文件系統(tǒng)研究
推薦閱讀
史海拾趣
隨著公司業(yè)務(wù)的不斷發(fā)展,地博電子在2010年成功投產(chǎn)了2條全自動(dòng)化PC薄膜生產(chǎn)線(xiàn)。這一舉措不僅大大提高了生產(chǎn)效率,降低了生產(chǎn)成本,還確保了產(chǎn)品質(zhì)量的穩(wěn)定性和一致性。全自動(dòng)化生產(chǎn)線(xiàn)的投產(chǎn),為地博電子在電子材料行業(yè)中的競(jìng)爭(zhēng)地位奠定了堅(jiān)實(shí)的基礎(chǔ)。
在追求經(jīng)濟(jì)效益的同時(shí),Hosiden也始終關(guān)注可持續(xù)發(fā)展和社會(huì)責(zé)任。公司致力于通過(guò)技術(shù)創(chuàng)新和綠色生產(chǎn)等方式,降低對(duì)環(huán)境的影響并促進(jìn)資源的循環(huán)利用。此外,Hosiden還積極參與社會(huì)公益事業(yè)和慈善活動(dòng),為社會(huì)的發(fā)展和進(jìn)步貢獻(xiàn)了自己的力量。這些舉措不僅提升了公司的社會(huì)形象和品牌價(jià)值,也為其在電子行業(yè)的長(zhǎng)遠(yuǎn)發(fā)展奠定了堅(jiān)實(shí)基礎(chǔ)。
隨著公司業(yè)務(wù)的不斷發(fā)展,芯邦開(kāi)始積極布局UWB(超寬帶通信)產(chǎn)品線(xiàn)。UWB技術(shù)以其高速率、高精度和低功耗的特點(diǎn),在智能家居、物聯(lián)網(wǎng)等領(lǐng)域展現(xiàn)出巨大的應(yīng)用潛力。芯邦通過(guò)研發(fā)UWB等信息傳輸技術(shù)及產(chǎn)品,致力于從移動(dòng)存儲(chǔ)及智能家電市場(chǎng)出發(fā),以手機(jī)及移動(dòng)智能設(shè)備、車(chē)規(guī)及汽車(chē)周邊產(chǎn)品應(yīng)用、智能家居及物聯(lián)網(wǎng)領(lǐng)域?yàn)槟繕?biāo)市場(chǎng),打造多系列產(chǎn)品線(xiàn)格局,提升公司的市場(chǎng)競(jìng)爭(zhēng)力。
隨著公司的發(fā)展壯大,Dresden Elektronik公司越來(lái)越意識(shí)到合作的重要性。他們積極與產(chǎn)業(yè)鏈上下游的企業(yè)開(kāi)展合作,共同推動(dòng)整個(gè)行業(yè)的發(fā)展。同時(shí),公司也注重與科研機(jī)構(gòu)、高校等的合作,引進(jìn)先進(jìn)的技術(shù)和人才,為公司的發(fā)展注入新的活力。這種合作共贏(yíng)的理念使公司在激烈的市場(chǎng)競(jìng)爭(zhēng)中保持了穩(wěn)健的發(fā)展態(tài)勢(shì)。
某個(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)答∨ |
本帖最后由 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)答∨ |
芯片MSP430F47197 SD16_A進(jìn)行7路采樣,32768晶振,OSR256,采樣頻率fs=32768*32/256=4096/s 采樣的交流電壓頻率為50HZ,我的理解是每秒可采集4096個(gè)數(shù)據(jù),而交流電每秒有50個(gè)周期, 理論上我每個(gè)周期的交流電可采集到4096/50=82個(gè)數(shù)據(jù)左右。 &n ...… 查看全部問(wèn)答∨ |
|
電路圖的畫(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ā)板 精華推薦
- Alif 大幅增強(qiáng)邊緣 AI 處理器性能
- VS Code+PlatformIO搭建ESP32 Arduino開(kāi)發(fā)環(huán)境
- ESP32學(xué)習(xí)筆記(49)——RFID RC522使用
- Esp32環(huán)境離線(xiàn)搭建參考
- ESP32使用舵機(jī)庫(kù)時(shí)的錯(cuò)誤
- ESP32 S3接ST7789屏幕線(xiàn)序
- Arduino IDE安裝ESP32開(kāi)發(fā)環(huán)境的最簡(jiǎn)單方法
- 基于S3C44B0X和μC/OS-Ⅱ智能家居嵌入式系統(tǒng)設(shè)計(jì)
- 8位還能打,新唐推出全新工業(yè)級(jí)MCU
- 半導(dǎo)體關(guān)稅可能會(huì)使您的下一輛汽車(chē)更加昂貴
- 潮起!人形機(jī)器人成本的20%-30%——靈巧手,國(guó)產(chǎn)3大廠(chǎng)商正快速產(chǎn)業(yè)化!
- AB Dynamics發(fā)布用于無(wú)人駕駛測(cè)試的物體檢測(cè)系統(tǒng)
- AI重構(gòu)出行:高階輔助駕駛的破局之路
- 廣汽即將發(fā)布全新星源增程技術(shù)
- Yole表示,到2030年,數(shù)據(jù)中心芯片市場(chǎng)規(guī)模將達(dá)到5000億美元
- 綠色節(jié)能趨勢(shì)下的延時(shí)繼電器發(fā)展:低功耗設(shè)計(jì)與環(huán)保材料應(yīng)用
- 國(guó)內(nèi)車(chē)企在固態(tài)電池領(lǐng)域的挑戰(zhàn)和技術(shù)方案
- 資本熱捧 + 政策護(hù)航,2025 人形機(jī)器人能否叩開(kāi) “量產(chǎn)元年” 大門(mén)?
- 耐世特推出用于智能運(yùn)動(dòng)控制的 MotionIQ?軟件套件
- TI 工業(yè)知識(shí)挑戰(zhàn)賽番外篇!
- MPS 有獎(jiǎng)直播 | FPGA 大電流電源的恒定導(dǎo)通時(shí)間 (COT) 控制
- 4月26日上午10:00邀您觀(guān)看 基于TI Sitara™AM5708的工業(yè)派開(kāi)源平臺(tái)介紹 有獎(jiǎng)直播
- 有獎(jiǎng)直播 | Keysight HDMI 2.1b 測(cè)試技術(shù)研討會(huì)
- 關(guān)注、評(píng)論贏(yíng)好禮!《美光2022臺(tái)北國(guó)際電腦展主題演講精選:智能邊緣與智能制造專(zhuān)輯》
- 【投票跟帖有禮】原廠(chǎng)的翻新儀器懟市場(chǎng)上的二手儀器,你頂誰(shuí)?
- 如何讓低功耗MSP430的功耗更低?
- 讓 MSP430 功耗更低的秘訣 — 第 2 部分
- 基于MSP430的函數(shù)信號(hào)發(fā)生器設(shè)計(jì)方案
- MSP430與I2C總線(xiàn)接口技術(shù)的高效輸出方案研究
- 三分鐘看懂stm8s單片機(jī)實(shí)現(xiàn)多通道轉(zhuǎn)換
- 解讀2018年智能家居產(chǎn)業(yè),傳統(tǒng)企業(yè)靠啥突圍
- 小藍(lán)單車(chē)剛復(fù)活就被秒,滴滴單車(chē)夢(mèng)還有戲?
- 富士康/高通/ADI/比亞迪/博通,華為核心供應(yīng)商大盤(pán)點(diǎn)
- 索尼最重要盈利業(yè)務(wù)下滑,這事和iPhone X有關(guān)?
- 防盜新方法 這只音箱用聲光效果假裝家里有人
- 運(yùn)算放大器基本應(yīng)用
- 功率因數(shù)自動(dòng)控制的問(wèn)題請(qǐng)師傅們幫忙
- 請(qǐng)問(wèn)wince串口接收漢字亂碼,如何處理?謝謝!
- 創(chuàng)建OpenGL ES群,歡迎大家加入
- 不要只顧低頭拉車(chē),而不抬頭看路
- [轉(zhuǎn)]參考設(shè)計(jì):數(shù)據(jù)集中器參考設(shè)計(jì)
- 同一線(xiàn)Linux嵌入式開(kāi)發(fā)工程師的對(duì)話(huà)
- 咨詢(xún)永宏P(guān)LC外部中斷不正常的原因
- 串口中斷接收,IntMasterEnable是否是必須的?
- 求助:Aavlon MM問(wèn)題