STM32H750XB_RT-THREAD/36-SDMMC—SD卡读写测试/User/sd_card/bsp_sdio_sd.c

381 lines
10 KiB
C
Raw Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************************
* @file bsp_sdio_sd.c
* @author fire
* @version V1.0
* @date 2018-xx-xx
* @brief SDIO sd<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ϵͳ<EFBFBD><EFBFBD>
******************************************************************************
* @attention
*
* ʵ<EFBFBD><EFBFBD>ƽ̨:<EFBFBD><EFBFBD><EFBFBD><EFBFBD> STM32 H750 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
* <EFBFBD>Ա<EFBFBD> :http://firestm32.taobao.com
*
******************************************************************************
*/
#include "./sd_card/bsp_sdio_sd.h"
#include "./led/bsp_led.h"
#include "./delay/core_delay.h"
#include "./usart/bsp_debug_usart.h"
SD_HandleTypeDef uSdHandle;
//SDMMCֻ<43>ܷ<EFBFBD><DCB7><EFBFBD>AXI_SRAM
uint8_t Buffer_Block_Tx[MULTI_BUFFER_SIZE/4];
uint8_t Buffer_Block_Rx[MULTI_BUFFER_SIZE/4];
//<2F><><EFBFBD>ͱ<EFBFBD>־λ
__IO uint8_t TX_Flag=0;
//<2F><><EFBFBD>ܱ<EFBFBD>־λ
__IO uint8_t RX_Flag=0;
/**
* @brief SD_Card<EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void SD_Test(void)
{
LED_BLUE;
/*------------------------------ SD <20><>ʼ<EFBFBD><CABC> ------------------------------ */
if(BSP_SD_Init() != HAL_OK)
{
LED_RED;
printf("SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>\n");
}
else
{
printf("SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>\n");
LED_BLUE;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
SD_EraseTest();
LED_BLUE;
/*single block <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>*/
SD_SingleBlockTest();
LED_BLUE;
/*muti block <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>*/
SD_MultiBlockTest();
}
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>SDMMC1<EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval HAL_OK<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>HAL_ERROR<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
*/
static HAL_StatusTypeDef BSP_SD_Init(void)
{
HAL_StatusTypeDef sd_state = HAL_OK;
/* <20><><EFBFBD><EFBFBD>SDMMC<4D><43><EFBFBD><EFBFBD> */
uSdHandle.Instance = SDMMC1;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч */
uSdHandle.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
/* <20>رս<D8B1><D5BD><EFBFBD>ģʽ */
uSdHandle.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
/* <20><><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>Ϊ4 */
uSdHandle.Init.BusWide = SDMMC_BUS_WIDE_4B;
/* <20>ر<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uSdHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
/* ʱ<>ӷ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>Ϊ0 */
uSdHandle.Init.ClockDiv = 8;
/* <20><>ʼ<EFBFBD><CABC>SD<53>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD> */
BSP_SD_MspInit();
/* HAL SD <20><>ʼ<EFBFBD><CABC> */
if(HAL_SD_Init(&uSdHandle) != HAL_OK)
{
sd_state = HAL_ERROR;
}
/* <20><><EFBFBD><EFBFBD>SD<53><44><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> */
if(sd_state == HAL_OK)
{
/* <20><><EFBFBD><EFBFBD>Ϊ4bitģʽ */
if(HAL_SD_ConfigWideBusOperation(&uSdHandle, uSdHandle.Init.BusWide) != HAL_OK)
{
sd_state = HAL_ERROR;
}
else
{
sd_state = HAL_OK;
}
}
return sd_state;
}
/**
* @brief SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void SD_EraseTest(void)
{
HAL_StatusTypeDef Status = HAL_OK;
HAL_StatusTypeDef EraseStatus = HAL_OK;
if (Status == HAL_OK)
{
Status = HAL_SD_Erase(&uSdHandle, 0x00, (BLOCK_SIZE * NUMBER_OF_BLOCKS));
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(Wait_SDCARD_Ready() != HAL_OK)
{
EraseStatus = HAL_ERROR;
}
}
if(EraseStatus == HAL_OK)
{
LED_GREEN;
printf("SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Գɹ<EFBFBD><EFBFBD><EFBFBD>\n");
}
else
{
LED_RED;
printf("SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>\n");
printf("<EFBFBD><EFBFBD>ܰ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD>ֲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>single<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾSD<EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>á<EFBFBD>\n");
}
}
/**
* @brief SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void SD_SingleBlockTest(void)
{
HAL_StatusTypeDef Status = HAL_OK;
HAL_StatusTypeDef TransferStatus1 = HAL_ERROR;
/* Fill the buffer to send */
Fill_Buffer(Buffer_Block_Tx, BLOCK_SIZE/4, 0);
// SCB_CleanDCache_by_Addr((uint32_t*)Buffer_Block_Tx, BLOCK_SIZE/4);
if(Status == HAL_OK)
{
/* <20><>ʼ<EFBFBD><CABC>ַΪ0<CEAA><30>д<EFBFBD><D0B4>512<31><32><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD> */
Status = HAL_SD_WriteBlocks_DMA(&uSdHandle, Buffer_Block_Tx, 0x00,1);
while(TX_Flag == 0);
}
/* Fill the buffer to reception */
Fill_Buffer(Buffer_Block_Rx, BLOCK_SIZE/4, 0);
// SCB_CleanDCache_by_Addr((uint32_t*)Buffer_Block_Rx, BLOCK_SIZE/4);
if(Status == HAL_OK)
{
/* <20><>ʼ<EFBFBD><CABC>ַΪ0<CEAA><30><EFBFBD><EFBFBD>ȡ512<31><32><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD> */
Status = HAL_SD_ReadBlocks_DMA(&uSdHandle, Buffer_Block_Rx,0, 1);
while(RX_Flag == 0);
}
if (Status == HAL_OK)
{
TransferStatus1 = Buffercmp(Buffer_Block_Tx, Buffer_Block_Rx, BLOCK_SIZE/4);
}
if(TransferStatus1 == HAL_OK)
{
LED_GREEN;
printf("Single block <20><><EFBFBD>Գɹ<D4B3><C9B9><EFBFBD>\n");
}
else
{
LED_RED;
printf("Single block <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ȷ<EFBFBD><C8B7>SD<53><44><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EBBFAA><EFBFBD><EFBFBD><E5A3AC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>SD<53><44><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>\n");
}
}
/**
* @brief SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
void SD_MultiBlockTest(void)
{
HAL_StatusTypeDef Status = HAL_OK;
HAL_StatusTypeDef TransferStatus1 = HAL_ERROR;
TX_Flag = 0;
RX_Flag = 0;
/* Fill the buffer to send */
Fill_Buffer(Buffer_Block_Tx, MULTI_BUFFER_SIZE/4, 0);
// SCB_CleanDCache_by_Addr((uint32_t*)Buffer_Block_Tx, MULTI_BUFFER_SIZE/4);
if(Status == HAL_OK)
{
/* <20><>ʼ<EFBFBD><CABC>ַΪ0<CEAA><30>д<EFBFBD><D0B4>NUMBER_OF_BLOCKS*512<31><32><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD> */
Status = HAL_SD_WriteBlocks_DMA(&uSdHandle, (uint8_t *)Buffer_Block_Tx, 0,NUMBER_OF_BLOCKS);
CPU_TS_Tmr_Delay_US(10000);
while(TX_Flag == 0);
}
/* Fill the buffer to reception */
Fill_Buffer(Buffer_Block_Rx, MULTI_BUFFER_SIZE/4, 0);
// SCB_CleanDCache_by_Addr((uint32_t*)Buffer_Block_Rx, MULTI_BUFFER_SIZE/4);
if(Status == HAL_OK)
{
/* <20><>ʼ<EFBFBD><CABC>ַΪ0<CEAA><30><EFBFBD><EFBFBD>ȡNUMBER_OF_BLOCKS*512<31><32><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD> */
Status = HAL_SD_ReadBlocks_DMA(&uSdHandle, Buffer_Block_Rx,0, NUMBER_OF_BLOCKS);
CPU_TS_Tmr_Delay_US(10000);
//<2F>ȴ<EFBFBD>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while(RX_Flag == 0);
}
if (Status == HAL_OK)
{
TransferStatus1 = Buffercmp(Buffer_Block_Tx, Buffer_Block_Rx, MULTI_BUFFER_SIZE/4);
}
if(TransferStatus1 == HAL_OK)
{
LED_GREEN;
printf("Multi block <20><><EFBFBD>Գɹ<D4B3><C9B9><EFBFBD>\n");
}
else
{
LED_RED;
printf("Multi block <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ȷ<EFBFBD><C8B7>SD<53><44><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EBBFAA><EFBFBD><EFBFBD><E5A3AC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>SD<53><44><EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD>\n");
}
}
/**
* @brief SD<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval HAL_OK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>HAL_ERROR<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>
*/
static HAL_StatusTypeDef Wait_SDCARD_Ready(void)
{
uint32_t loop = SD_TIMEOUT;
/* Wait for the Erasing process is completed */
/* Verify that SD card is ready to use after the Erase */
while(loop > 0)
{
loop--;
if(HAL_SD_GetCardState(&uSdHandle) == HAL_SD_CARD_TRANSFER)
{
return HAL_OK;
}
}
return HAL_ERROR;
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pBuffer1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>pBuffer2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BufferLength<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval HAL_OK<EFBFBD><EFBFBD>ƥ<EFBFBD>HAL_ERROR<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD>
*/
static HAL_StatusTypeDef Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint32_t BufferLength)
{
while (BufferLength--)
{
if (*pBuffer1 != *pBuffer2)
{
return HAL_ERROR;
}
else{
pBuffer1++;
pBuffer2++;
}
}
return HAL_OK;
}
/**
* @brief Fills buffer with user predefined data.
* @param pBuffer: pointer on the Buffer to fill
* @param BufferLength: size of the buffer to fill
* @param Offset: first value to fill on the Buffer
* @retval None
*/
void Fill_Buffer(uint8_t *pBuffer, uint32_t BufferLength, uint32_t Offset)
{
uint32_t index = 0;
/* Put in global buffer same values */
for (index = 0; index < BufferLength; index++)
{
pBuffer[index] = index + Offset;
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>WIFIģ<EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
*/
static void WIFI_PDN_INIT(void)
{
/*<2A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>GPIO_InitTypeDef<65><66><EFBFBD>͵Ľṹ<C4BD><E1B9B9>*/
GPIO_InitTypeDef GPIO_InitStruct;
/*ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>*/
__HAL_RCC_GPIOC_CLK_ENABLE();
/*ѡ<><D1A1>Ҫ<EFBFBD><D2AA><EFBFBD>Ƶ<EFBFBD>GPIO<49><4F><EFBFBD><EFBFBD>*/
GPIO_InitStruct.Pin = GPIO_PIN_2;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ*/
GPIO_InitStruct.Pull = GPIO_PULLUP;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD> */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
/*<2A><><EFBFBD>ÿ⺯<C3BF><E2BAAF><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>GPIO_InitStructure<72><65>ʼ<EFBFBD><CABC>GPIO*/
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*<2A><><EFBFBD><EFBFBD>WiFiģ<69><C4A3>*/
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_RESET);
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>SD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval None
*/
static void BSP_SD_MspInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* ʹ<><CAB9> SDMMC ʱ<><CAB1> */
__HAL_RCC_SDMMC1_CLK_ENABLE();
/* ʹ<><CAB9> GPIOs ʱ<><CAB1> */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
|GPIO_PIN_12;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ҫ<EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD>ģʽ*/
GPIO_InitStruct.Pull = GPIO_NOPULL;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD> */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
/*<2A><><EFBFBD><EFBFBD>ΪSDIO1<4F><31><EFBFBD><EFBFBD> */
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
/*<2A><><EFBFBD>ÿ⺯<C3BF><E2BAAF><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>GPIO_InitStructure<72><65>ʼ<EFBFBD><CABC>GPIO*/
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_2;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ҫ<EFBFBD>ϡ<EFBFBD><CFA1><EFBFBD><EFBFBD><EFBFBD>ģʽ*/
GPIO_InitStruct.Pull = GPIO_NOPULL;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD> */
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
/*<2A><><EFBFBD><EFBFBD>ΪSDIO1<4F><31><EFBFBD><EFBFBD> */
GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;
/*<2A><><EFBFBD>ÿ⺯<C3BF><E2BAAF><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>GPIO_InitStructure<72><65>ʼ<EFBFBD><CABC>GPIO*/
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
//<2F><><EFBFBD><EFBFBD>WIFIģ<49><C4A3>
WIFI_PDN_INIT();
HAL_NVIC_SetPriority(SDMMC1_IRQn,0,0); //<2F><><EFBFBD><EFBFBD>SDMMC1<43>ж<EFBFBD>
HAL_NVIC_EnableIRQ(SDMMC1_IRQn); //ʹ<><CAB9>SDMMC1<43>ж<EFBFBD>
}
//SDMMC1<43><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻص<C9BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
{
TX_Flag=1;
}
//SDMMC1<43><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɻص<C9BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
{
// SCB_InvalidateDCache_by_Addr((uint32_t*)Buffer_Block_Rx, MULTI_BUFFER_SIZE/4);
RX_Flag=1;
}
/************************END OF FILE*******************/