本文共 2873 字,大约阅读时间需要 9 分钟。
http://openedv.com/thread-13912-1-1.html 中 有 资料正点原子探索者STM32F407ZGT6开发板资料:A盘文件夹形式:链接:https://pan.baidu.com/s/1KkjcofP1M6f0WOBUEZqd5w 提取码:z4dy 探索者F4 资料盘(A盘)\4,程序源码\2,标准例程-库函数版本\实验38 SD卡实验
//初始化SD卡//返回值:错误代码;(0,无错误)SD_Error SD_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; SD_Error errorstatus=SD_OK; u8 clkdiv=0; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_DMA2, ENABLE);//使能GPIOC,GPIOD DMA2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);//SDIO时钟使能 RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, ENABLE);//SDIO复位 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12; //PC8,9,10,11,12复用功能输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100M GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOC, &GPIO_InitStructure);// PC8,9,10,11,12复用功能输出 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2; GPIO_Init(GPIOD, &GPIO_InitStructure);//PD2复用功能输出 //引脚复用映射设置 GPIO_PinAFConfig(GPIOC,GPIO_PinSource8,GPIO_AF_SDIO); //PC8,AF12 GPIO_PinAFConfig(GPIOC,GPIO_PinSource9,GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOC,GPIO_PinSource12,GPIO_AF_SDIO); GPIO_PinAFConfig(GPIOD,GPIO_PinSource2,GPIO_AF_SDIO); RCC_APB2PeriphResetCmd(RCC_APB2Periph_SDIO, DISABLE);//SDIO结束复位 //SDIO外设寄存器设置为默认值 SDIO_Register_Deinit(); NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 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(SDIO_BusWide_4b); //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+2; //V1.1/V2.0卡,设置最高48/4=12Mhz } else clkdiv=SDIO_TRANSFER_CLK_DIV; //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;}
转载地址:http://qengi.baihongyu.com/