[经验] stm32f769 寄存器配置SD卡驱动

[复制链接]

版主

发表于 2018-3-9 10:34:58   456 查看 0 回复 显示全部楼层 倒序浏览
分享
本帖最后由 lee_st 于 2018-3-11 20:40 编辑

最近在研究Linux过程中有点插曲,先不表了,于是就想着把SD卡研究一下,这个以前也没有搞过,找了stm32f767的例程,在此基础上更改了一下,可以在stm32f769上使用,就开始了SD卡的研究,个人钟爱寄存器配置的,没办法,就是对ST提供的库不感冒,有相同癖好的进来探讨,闲言少叙,进入正题。
看了f767板子的寄存器版本的指导书,正好也是和STM32F769DISCOVERY电路一样,都是非SPI接口的,可以参考其例程了,于是边参考st官方的例程STM32F769I-Discovery\Applications\Display\LCD_PicturesFromSDCard,边参考f767的例程,比较着修改,
先看看电路图

对应的IO分别是PG9,PG10,PB3,PB4,PD6,PD7,PI15
于是开始配置IO
*(uint32_t *)0x40023830 |=  0x14a; //使能PORTB\D\G\I时钟
    *(uint32_t *)0x40023830 |=  0x400000; //使能dma2时钟
    *(uint32_t *)0x40023844 |= 0x80;//SDMMC2时钟使能
    *(uint32_t *)0x40023824 |= 0x80;//SDMMC2复位
        GPIO_Set(GPIOB,PIN3|PIN4,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
        GPIO_AF_Set(GPIOB,3,10);        //PB3,AF10
    GPIO_AF_Set(GPIOB,4,10);        //PB4,AF10
    GPIO_Set(GPIOD,PIN6|PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
        GPIO_AF_Set(GPIOD,6,11);        //PB6,AF11
    GPIO_AF_Set(GPIOD,7,11);        //PB7,AF11
    GPIO_Set(GPIOG,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PB3,PB4设置
        GPIO_AF_Set(GPIOG,9,11);        //PB9,AF11
    GPIO_AF_Set(GPIOG,10,11);        //PB10,AF11
    GPIO_Set(GPIOI,PIN15,GPIO_MODE_IN,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PI15设置        
    *(uint32_t *)0x40023824 &= ~(0x80);//SDMMC2复位
这里是在f767的模板基础上改的,所以没有完全改成纯寄存器版本的,这个后续研究,然后再发帖。
IO配置完成后,开始清理SDMMC的所有寄存器
//SDMMC外设寄存器设置为默认值                           
        SDMMC2->POWER=0x00000000;
        SDMMC2->CLKCR=0x00000000;
        SDMMC2->ARG=0x00000000;
        SDMMC2->CMD=0x00000000;
        SDMMC2->DTIMER=0x00000000;
        SDMMC2->DLEN=0x00000000;
        SDMMC2->DCTRL=0x00000000;
        SDMMC2->ICR=0x00C007FF;
        SDMMC2->MASK=0x00000000;         
增加SD卡的中断配置
        MY_NVIC_Init(0,0,SDMMC2_IRQn,2);        //SDMMC中断配置
完成后,开始进行上电操作,
SD_PowerON();
SD_InitializeCards();                        //初始化SD卡
SD_GetCardInfo(&SDCardInfo);        //获取卡信息
SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));//选中SD卡
SD_EnableWideBusOperation(1);        //4位宽度,如果是MMC卡,则不能用4位模式

以上实现了检测SD卡的类型,具体设置SD卡的时钟频率。
if(SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V1_1||SDCardInfo.CardType==STD_CAPACITY_SD_CARD_V2_0)
{
        clkdiv=SDMMC_TRANSFER_CLK_DIV+2;        //V1.1/V2.0卡,设置最高48/4=12Mhz
}else clkdiv=SDMMC_TRANSFER_CLK_DIV;        //SDHC等其他卡,设置最高48/2=24Mhz
        SDMMC_Clock_Set(clkdiv);        //设置时钟频率,SDMMC时钟计算公式:SDMMC_CK时钟=SDMMCCLK/[clkdiv+2];其中,SDMMCCLK固定为48Mhz
暂且设置成查询模式,后续再改成中断模式
SD_SetDeviceMode(SD_POLLING_MODE);//设置为查询模式

初始化完成后,在main函数下添加以下代码实现SD卡的初始化操作
while(sdcard_init())//检测不到SD卡
{
                delay_ms(500);
                LED0(led0sta^=1);//DS0闪烁
}

在while(1)添加代码,检查SD卡初始化是否完成,代码是否继续运行
{
delay_ms(500);
printf("\r\n sd is ok!:\r\n");
}
果然串口一直在打印输出

说明SD卡初始化完成了
详细的代码说明,后面会陆续有新帖,喜欢寄存器配置的网友,自行关注!



                                                      发帖与2018年3月9日

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 2积分 +15 收起 理由
star_66666 + 5 资源分享达人,加分鼓励!
ElecFans王岑 + 10

查看全部评分

标签:寄存器 配置 驱动
高级模式
您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐 上一条 /9 下一条

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

推荐专区

技术干货集中营

专家问答

方案交易

用户帮助┃咨询与建议┃版主议事

工程师杂谈

项目|工程师创意

招聘|求职}工程师职场

论坛电子赛事

社区活动专版

发烧友活动

-

嵌入式论坛

ARM技术论坛

Android论坛

Linux论坛

单片机/MCU论坛

MSP430技术论坛

FPGA|CPLD|ASIC论坛

STM32/STM8技术论坛

NXP MCU 技术论坛

PIC单片机论坛

DSP论坛

瑞萨单片机论坛

嵌入式系统论坛

-

电源技术论坛

电源技术论坛

无线充电技术

-

硬件设计论坛

PCB设计论坛

电路设计论坛

电子元器件论坛

控制|传感

总线技术|接口技术

-

测试测量论坛

LabVIEW论坛

Matlab论坛

测试测量技术专区

仪器仪表技术专区

-

EDA设计论坛

multisim论坛

PADS技术论坛

Protel|AD|DXP论坛

Allegro论坛

proteus论坛|仿真论坛

EasyEDA-中国人自已的EDA工具

Orcad论坛

-

综合技术与应用

电机控制

智能电网

光电及显示

工程资源中心

汽车电子技术论坛

医疗电子论坛

-

开源硬件

-

无线通信论坛

无线通信技术专区

天线|RF射频|微波|雷达技术

-

IC设计论坛

芯片测试与失效分析

Mixed Signal/SOC[数模混合芯片设计]

Analog/RF IC设计

设计与制造封装测试

-

厂商专区

TI论坛

TI Deyisupport社区

-

检测技术与质量

电磁兼容(EMC)设计与整改

安规知识论坛

检测与认证

-

消费电子论坛

手机技术论坛

平板电脑/mid论坛

音视/视频/机顶盒论坛

-

电子论坛综合区

聚丰众筹官方社区

新人报道区

聚丰供应链

-

论坛服务区

-

供求信息发布

供需广告

电子展览展会专区

芯片求购|供应发布区