嵌入式開發中經常會用到對外部SD卡進行相關的讀寫操作。下圖是CPU硬件連接示意圖

引腳配置瑞如下:
void SD_LowLevel_DeInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< Disable SDIO Clock */
SDIO_ClockCmd(DISABLE);
/*!< Set Power State to OFF */
SDIO_SetPowerState(SDIO_PowerState_OFF);
/*!< DeInitializes the SDIO peripheral */
SDIO_DeInit();
/*!< Disable the SDIO AHB Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO, DISABLE);
/*!< Configure PC.08, PC.09, PC.10, PC.11, PC.12 pin: D0, D1, D2, D3, CLK pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/*!< Configure PD.02 CMD line */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
DMA部分配置如下:
void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_ClearFlag(SD_SDIO_DMA_FLAG_TC | SD_SDIO_DMA_FLAG_TE | SD_SDIO_DMA_FLAG_HT | SD_SDIO_DMA_FLAG_GL);
/*!< DMA2 Channel4 disable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, DISABLE);
/*!< SDIO DMA CHANNEL Config */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferSRC;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SD_SDIO_DMA_CHANNEL, &DMA_InitStructure);
DMA_ITConfig(SD_SDIO_DMA_CHANNEL, DMA_IT_TC, ENABLE);
/*!< SDIO DMA CHANNEL enable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, ENABLE);
}
void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_ClearFlag(SD_SDIO_DMA_FLAG_TC | SD_SDIO_DMA_FLAG_TE | SD_SDIO_DMA_FLAG_HT | SD_SDIO_DMA_FLAG_GL);
/*!< SDIO DMA CHANNEL disable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, DISABLE);
/*!< SDIO DMA CHANNEL Config */
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferDST;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = BufferSize / 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(SD_SDIO_DMA_CHANNEL, &DMA_InitStructure);
DMA_ITConfig(SD_SDIO_DMA_CHANNEL, DMA_IT_TC, ENABLE);
/*!< SDIO DMA CHANNEL enable */
DMA_Cmd(SD_SDIO_DMA_CHANNEL, ENABLE);
}
uint32_t SD_DMAEndOfTransferStatus(void)
{
return (uint32_t)DMA_GetFlagStatus(DMA2_FLAG_TC4);
}
SDIO函數中斷部分
///sd卡狀態判斷
void SDCARD_Config(void)
{
SD_Error Status = SD_OK;
Status = SD_Init(); //初始化SDIO
if (Status != SD_OK)
{
Display_ErrorWithoutSD((u8 *)"No_SDCard");
}
SDCARD_NVIC_Config();
}
//中斷配置 部分
void SDCARD_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中斷函數
void SDIO_IRQHandler(void)
{
/* Process All SDIO Interrupt Sources */
SD_ProcessIRQSrc();
}
審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5141文章
19532瀏覽量
314962 -
SD卡
+關注
關注
2文章
575瀏覽量
65138
發布評論請先 登錄
相關推薦
熱點推薦
【STM32系統】基于STM32設計的SD卡數據讀取與上位機顯示系統(SDIO接口驅動、雷龍貼片SD卡)
5. 系統實現
5.1 系統架構
5.2 硬件連接與調試
6. 實驗與測試
6.1 實驗方案設計
6.2 實驗過程
6.2.1 SD
發表于 05-09 16:11
Nand flash 和SD卡(SD NAND)存儲扇區分配表異同
NAND)接口與主機設備連接,主機設備通過文件系統接口來訪問 SD卡(SD NAND),對存儲扇區分配表的操作是通過文件系統的函數和接口來間接實現
發表于 03-13 10:45
HAL庫的函數調用示例
HAL(Hardware Abstraction Layer,硬件抽象層)庫是STM32等微控制器中常用的庫,它為開發者提供了訪問和控制硬件設備的接口。以下是一些常用的HAL庫函數及其
一文帶你了解什么是SD NAND存儲芯片
XST_FAILURE;
}
return XST_SUCCESS;
}
以上是本次實驗使用到的部分代碼,里面包含了外設,標準的打印函數和SD卡控制器的功能,在程序中先進行
發表于 11-13 15:20
Arduino程序:實現SD NAND(貼片sd卡)的讀寫功能
單片機上傳程序的時候,有時候感覺它的rom和 ram有時直接限制了他的使用,之前使用eeprom,和sd卡模塊.
[]()
然后最近看到了出的SD NAND 就是下面這個
發表于 11-07 17:45
工業級SD卡:穩健發展,未來可期
SD卡,自1999年由松下、東芝和SanDisk聯合推出以來,已經走過了二十余年的發展歷程。從最初的2GB容量、150KB/s的傳輸速度,到如今動輒數百GB容量、數GB/s的傳輸速度,SD卡


SD-WAN能實現幾層防護層級?安全保障怎么實行?
保障措施覆蓋了從物理層到應用層的多個層面,確保企業網絡的穩定性和安全性。 一、SD-WAN實現的防護層級 1、物理層和數據鏈路層(第1
樹莓派4b支持多大的sd卡
樹莓派4B是一款非常受歡迎的微型計算機,它具有強大的性能和豐富的擴展功能。在樹莓派4B的使用過程中,SD卡是一個非常重要的組件,因為它是樹莓派的啟動設備,同時也是存儲系統文件和應用程序的地方。 樹莓
【GD32H757Z海棠派開發板使用手冊】第十二講 SDIO-SD卡讀寫實驗
SD卡是一種主要以Nand Flash作為存儲介質,具有體積小、數據傳輸速度快以及支持熱插拔的優點。如今,已被廣泛應用于數碼相機、便攜式移動設備以及手機等多種設備中。SD卡的

評論