初级会员

- 积分
- 117
- 金钱
- 117
- 注册时间
- 2019-8-1
- 在线时间
- 27 小时
|
1金钱
/初始化SD卡
//返回值:错误代码;(0,无错误)
SD_Error SD_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
u8 clkdiv=0;
SD_Error errorstatus=SD_OK;
//SDIO IO口初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//使能PORTC,PORTD时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO|RCC_AHBPeriph_DMA2,ENABLE);//使能SDIO,DMA2时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //PC.8~12 复用输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化PC.8~12
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PD2 复用输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化PD2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PD7 上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始化PD7
//SDIO外设寄存器设置为默认值
SDIO_DeInit();
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; //SDIO中断配置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
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+6; //V1.1/V2.0卡,设置最高72/12=6Mhz
}else clkdiv=SDIO_TRANSFER_CLK_DIV; //SDHC等其他卡,设置最高72/6=12Mhz
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;
}
是不是只要把黄色的两行代码选一个就是其功能,我改为DMA模式后就卡死在主程序的这句代码。//--- f_mount(fs[0],"0:",1); //挂载SD卡 --//,
是原子哥的代码写的有问题???
|
|