其實(shí)SD卡的初始化以及FAT文件系統(tǒng)也移植到了我的板子上面。但是我要存一張BMP的照片,不知道為啥,每次存儲(chǔ)150kb進(jìn)入TF卡的時(shí)候,時(shí)間不確定。有時(shí)幾百毫秒。有時(shí)要好幾秒。導(dǎo)致我完全不能夠?qū)崟r(shí)保存一些圖片。導(dǎo)致系統(tǒng)卡機(jī)。而且在FAT文件系統(tǒng)下,還不能夠使用DMA釋放CPU。
下面貼出 TF卡初始化例程,參考來自于正點(diǎn)原子源碼:
u8 SD_Init(void)
{
u8 SD_Error;
//初始化時(shí)的時(shí)鐘不能大于400KHZ
SDCARD_Handler.Instance=SDMMC1;
SDCARD_Handler.Init.ClockEdge=SDMMC_CLOCK_EDGE_RISING; //上升沿
SDCARD_Handler.Init.ClockBypass=SDMMC_CLOCK_BYPASS_DISABLE; //不使用bypass模式,直接用HCLK進(jìn)行分頻得到SDIO_CK
SDCARD_Handler.Init.ClockPowerSave=SDMMC_CLOCK_POWER_SAVE_DISABLE; //空閑時(shí)不關(guān)閉時(shí)鐘電源
SDCARD_Handler.Init.BusWide=SDMMC_BUS_WIDE_1B; //1位數(shù)據(jù)線
SDCARD_Handler.Init.HardwareFlowControl=SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;//關(guān)閉硬件流控
SDCARD_Handler.Init.ClockDiv=SDMMC_TRANSFER_CLK_DIV; //SD傳輸時(shí)鐘頻率最大25MHZ
SD_Error=HAL_SD_Init(&SDCARD_Handler,&SDCardInfo);
if(SD_Error!=SD_OK) return 1;
SD_Error=HAL_SD_WideBusOperation_Config(&SDCARD_Handler,SDMMC_BUS_WIDE_4B);//使能寬總線模式
if(SD_Error!=SD_OK) return 2;
return 0;
}
//SDMMC底層驅(qū)動(dòng),時(shí)鐘使能,引腳配置,DMA配置
//此函數(shù)會(huì)被HAL_SD_Init()調(diào)用
//hsd:SD卡句柄
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_SDMMC1_CLK_ENABLE(); //使能SDMMC1時(shí)鐘
__HAL_RCC_DMA2_CLK_ENABLE(); //使能DMA2時(shí)鐘
__HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOC時(shí)鐘
__HAL_RCC_GPIOD_CLK_ENABLE(); //使能GPIOD時(shí)鐘
//PC8,9,10,11,12
GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //推挽復(fù)用
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF12_SDIO; //復(fù)用為SDIO
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化
//PD2
GPIO_Initure.Pin=GPIO_PIN_2;
HAL_GPIO_Init(GPIOD,&GPIO_Initure); //初始化
#if (SD_DMA_MODE==1) //使用DMA模式
HAL_NVIC_SetPriority(SDMMC1_IRQn,2,0); //配置SDMMC1中斷,搶占優(yōu)先級(jí)2,子優(yōu)先級(jí)0
HAL_NVIC_EnableIRQ(SDMMC1_IRQn); //使能SDMMC1中斷
//配置發(fā)送DMA
SDRxDMAHandler.Instance=DMA2_Stream3;
SDRxDMAHandler.Init.Channel=DMA_CHANNEL_4;
SDRxDMAHandler.Init.Direction=DMA_PERIPH_TO_MEMORY;
SDRxDMAHandler.Init.PeriphInc=DMA_PINC_DISABLE;
SDRxDMAHandler.Init.MemInc=DMA_MINC_ENABLE;
SDRxDMAHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
SDRxDMAHandler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
SDRxDMAHandler.Init.Mode=DMA_PFCTRL;
SDRxDMAHandler.Init.Priority=DMA_PRIORITY_VERY_HIGH;
SDRxDMAHandler.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
SDRxDMAHandler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
SDRxDMAHandler.Init.MemBurst=DMA_MBURST_INC4;
SDRxDMAHandler.Init.PeriphBurst=DMA_PBURST_INC4;
__HAL_LINKDMA(hsd, hdmarx, SDRxDMAHandler); //將接收DMA和SD卡的發(fā)送DMA連接起來
HAL_DMA_DeInit(&SDRxDMAHandler);
HAL_DMA_Init(&SDRxDMAHandler); //初始化接收DMA
//配置接收DMA
SDTxDMAHandler.Instance=DMA2_Stream6;
SDTxDMAHandler.Init.Channel=DMA_CHANNEL_4;
SDTxDMAHandler.Init.Direction=DMA_MEMORY_TO_PERIPH;
SDTxDMAHandler.Init.PeriphInc=DMA_PINC_DISABLE;
SDTxDMAHandler.Init.MemInc=DMA_MINC_ENABLE;
SDTxDMAHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
SDTxDMAHandler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
SDTxDMAHandler.Init.Mode=DMA_PFCTRL;
SDTxDMAHandler.Init.Priority=DMA_PRIORITY_VERY_HIGH;
SDTxDMAHandler.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
SDTxDMAHandler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
SDTxDMAHandler.Init.MemBurst=DMA_MBURST_INC4;
SDTxDMAHandler.Init.PeriphBurst=DMA_PBURST_INC4;
__HAL_LINKDMA(hsd, hdmatx, SDTxDMAHandler);//將發(fā)送DMA和SD卡的發(fā)送DMA連接起來
HAL_DMA_DeInit(&SDTxDMAHandler);
HAL_DMA_Init(&SDTxDMAHandler); //初始化發(fā)送DMA
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 3, 0); //接收DMA中斷優(yōu)先級(jí)
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 3, 0); //發(fā)送DMA中斷優(yōu)先級(jí)
HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
#endif
}
接下來我繼續(xù)更新。希望能夠達(dá)到實(shí)時(shí)存儲(chǔ)。
找到問題原因了,在FAT文件系統(tǒng)當(dāng)中,如果不是一次性寫完一個(gè)文件,而是分開來寫一個(gè)文件,也就是連續(xù)調(diào)用f_write函數(shù),后面這個(gè)函數(shù)的運(yùn)行時(shí)間是不確定的。所以我把整個(gè)文件打包,直接一次寫入,速度很快。、
但是又遇到了新的問題,每次創(chuàng)建一個(gè)新的文件,它需要的時(shí)間要好幾百毫秒。這個(gè)太慢了,很大的影響我的操作。準(zhǔn)備找到新的解決辦法,并且如果要實(shí)時(shí)存視頻的話,也需要新的辦法。
上一篇:STM32CubeMx + SD Card + FatFs 讀寫SD卡死等問題
下一篇:STM32f429-SDRAM+LTDC總結(jié)
推薦閱讀
史海拾趣
設(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)課程
- 2440 DMA寄存器總結(jié)
- mini2440之a(chǎn)ds下dma測試
- STM32中DMA編程分析
- ATmega168 Standby模式
- 看Microchip的尿性,MPLAB的Win32經(jīng)典版停止更新后的bug
- 小米11手機(jī)可以手動(dòng)開啟全局120Hz屏幕:絲滑流暢
- Redmi K40 Pro渲染圖解密!后攝模組長這樣
- 曝榮耀V40將于1月12日發(fā)布,榮耀重組后的首款機(jī)型
- 2021蘋果產(chǎn)品預(yù)測:哪些可能會(huì)出現(xiàn)?
- LG Stylo 7 5G渲染圖解密:側(cè)面指紋識(shí)別,具備3.5mm耳機(jī)孔