OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4191|回复: 2

stm32f407探索者 SDIO SD 寄存器模式 DMA模式设置不成功

[复制链接]

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2018-5-29
在线时间
136 小时
发表于 2021-11-22 11:47:45 | 显示全部楼层 |阅读模式
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;                 
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

385

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1023
金钱
1023
注册时间
2019-9-21
在线时间
269 小时
发表于 2021-11-22 12:48:03 | 显示全部楼层
回复

使用道具 举报

9

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2018-5-29
在线时间
136 小时
 楼主| 发表于 2021-11-22 12:54:56 | 显示全部楼层
gjs13030247996 发表于 2021-11-22 12:48
可以参考一下这个帖子看一下:https://blog.csdn.net/waitxhurt/article/details/82110355

我用的时寄存器版
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 15:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表