中级会员
 
- 积分
- 423
- 金钱
- 423
- 注册时间
- 2018-5-29
- 在线时间
- 136 小时
|
1金钱
在使用stm32f407探索者寄存器版 SDIO SD卡时,想使用DMA,按红色修改不成功。
//初始化SD卡
//返回值:错误代码;(0,无错误)
SD_Error SD_Init(void)
{
SD_Error errorstatus=SD_OK;
u8 clkdiv=0;
//SDIO IO口初始化
RCC->AHB1ENR|=1<<2; //使能PORTC时钟
RCC->AHB1ENR|=1<<3; //使能PORTD时钟
RCC->AHB1ENR|=1<<22; //DMA2时钟使能
RCC->APB2ENR|=1<<11; //SDIO时钟使能
RCC->APB2RSTR|=1<<11; //SDIO复位
GPIO_Set(GPIOC,0X1F<<8,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); //PC8,9,10,11,12复用功能输出
GPIO_Set(GPIOD,1<<2,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU); //PD2复用功能输出
GPIO_AF_Set(GPIOC,8,12); //PC8,AF12
GPIO_AF_Set(GPIOC,9,12); //PC9,AF12
GPIO_AF_Set(GPIOC,10,12); //PC10,AF12
GPIO_AF_Set(GPIOC,11,12); //PC11,AF12
GPIO_AF_Set(GPIOC,12,12); //PC12,AF12
GPIO_AF_Set(GPIOD,2,12); //PD2,AF12
RCC->APB2RSTR&=~(1<<11); //SDIO结束复位
//SDIO外设寄存器设置为默认值
SDIO->POWER=0x00000000;
SDIO->CLKCR=0x00000000;
SDIO->ARG=0x00000000;
SDIO->CMD=0x00000000;
SDIO->DTIMER=0x00000000;
SDIO->DLEN=0x00000000;
SDIO->DCTRL=0x00000000;
SDIO->ICR=0x00C007FF;
SDIO->MASK=0x00000000;
MY_NVIC_Init(0,0,SDIO_IRQn,2); //SDIO中断配置
errorstatus=SD_PowerON(); //SD卡上电
if(errorstatus==SD_OK)errorstatus=SD_InitializeCards(); //初始化SD卡
if(errorstatus==SD_OK)errorstatus=SD_GetCardInfo(&SDCardInfo); //获取卡信息
if(errorstatus==SD_OK)errorstatus=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡
if(errorstatus==SD_OK)errorstatus=SD_EnableWideBusOperation(1); //4位宽度,如果是MMC卡,则不能用4位模式
if((errorstatus==SD_OK)||(SDIO_MULTIMEDIA_CARD==CardType))
{
if(SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==SDIO_STD_CAPACITY_SD_CARD_V2_0)
{
clkdiv=SDIO_TRANSFER_CLK_DIV+10;//V1.1/V2.0卡,设置最高48/12=4Mhz
}else clkdiv=SDIO_TRANSFER_CLK_DIV+2; //SDHC等其他卡,设置最高48/2=24Mhz
SDIO_Clock_Set(clkdiv); //设置时钟频率,SDIO时钟计算公式:SDIO_CK时钟=SDIOCLK/[clkdiv+2];其中,SDIOCLK固定为48Mhz
errorstatus=SD_SetDeviceMode(SD_DMA_MODE); //设置为DMA模式
//errorstatus=SD_SetDeviceMode(SD_POLLING_MODE);//设置为查询模式
}
return errorstatus;
}
|
|