历史上的今天
今天是:2024年09月22日(星期日)
2018年09月22日 | STM32CubeMX生成SDIO驱动SD卡的代码
2018-09-22 来源:eefocus
1.STM32CubeMX配置




2.修改代码
先添加串口部分代码,因为需要用到printf函数
在usart.c中添加
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}

添加SDIO读写函数和获取容量的函数
获取容量的函数添加
在SDIO.c文件中添加如下函数:
uint8_t SD_GetCardInfo(HAL_SD_CardInfoTypeDef *cardinfo)
{
uint8_t sta;
sta=HAL_SD_GetCardInfo(&hsd,cardinfo);
return sta;
}

SDIO读写函数添加
在sdio.c文件中添加如下函数:
//¶ÁSD¿¨
//buf:¶ÁÊý¾Ý»º´æÇø
//sector:ÉÈÇøµØÖ·
//cnt:ÉÈÇø¸öÊý
//·µ»ØÖµ:´íÎó״̬;0,Õý³£;ÆäËû,´íÎó´úÂë;
uint8_t SD_ReadDisk(uint8_t* buf,uint32_t sector,uint32_t cnt)
{
uint8_t sta=0;
long long lsector=sector;
uint8_t n;
lsector<<=9;
INTX_DISABLE();//¹Ø±Õ×ÜÖжÏ(POLLINGģʽ,ÑϽûÖжϴò¶ÏSDIO¶Áд²Ù×÷!!!)
if((uint32_t)buf%4!=0)
{
for(n=0;n
{
sta=HAL_SD_ReadBlocks(&hsd,SDIO_DATA_BUFFER,lsector+512*n,1,2000);//µ¥¸ösectorµÄ¶Á²Ù×÷
memcpy(buf,SDIO_DATA_BUFFER,512);
buf+=512;
}
}else
{
sta=HAL_SD_ReadBlocks(&hsd,buf,lsector,cnt,2000);//µ¥¸ösectorµÄ¶Á²Ù×÷
}
INTX_ENABLE();//¿ªÆô×ÜÖжÏ
return sta;
}
//дSD¿¨
//buf:дÊý¾Ý»º´æÇø
//sector:ÉÈÇøµØÖ·
//cnt:ÉÈÇø¸öÊý
//·µ»ØÖµ:´íÎó״̬;0,Õý³£;ÆäËû,´íÎó´úÂë;
uint8_t SD_WriteDisk(uint8_t *buf,uint32_t sector,uint32_t cnt)
{
uint8_t sta=0;
long long lsector=sector;
uint8_t n;
lsector<<=9;
INTX_DISABLE();//¹Ø±Õ×ÜÖжÏ(POLLINGģʽ,ÑϽûÖжϴò¶ÏSDIO¶Áд²Ù×÷!!!)
if((uint32_t)buf%4!=0)
{
for(n=0;n
{
memcpy(SDIO_DATA_BUFFER,buf,512);
sta=HAL_SD_WriteBlocks(&hsd,SDIO_DATA_BUFFER,lsector+512*n,1,2000);//µ¥¸ösectorµÄд²Ù×÷
buf+=512;
}
}else
{
sta=HAL_SD_WriteBlocks(&hsd,buf,lsector,cnt,2000);//¶à¸ösectorµÄд²Ù×÷
}
INTX_ENABLE();//¿ªÆô×ÜÖжÏ
return sta;
}


因为读写函数用到了SDIO_DATA_BUFFER数组和INTX_ENABLE();INTX_DISABLE();来开关总中断,所以接着再添加如下代码
//¹Ø±ÕËùÓÐÖжÏ
void INTX_DISABLE(void)
{
__ASM volatile("cpsid i");
}
//¿ªÆôËùÓÐÖжÏ
void INTX_ENABLE(void)
{
__ASM volatile("cpsie i");
}
__align(4) uint8_t SDIO_DATA_BUFFER[512];


本实验通过SDIO读取SD卡的容量,所以接着定义一个句柄

函数声明等就不说了,到这一步已经完成了对底层的配置,接下来直接在主函数里调用获取容量的函数就可以了

到这一步就完成了软件的编辑,就可以下载程序了,现象如下

没按一次复位按键,串口打印一行字符。
史海拾趣
|
2007年2月,中国的导航卫星“北斗”在四川成功升空,这是我国发射的第四颗导航卫星,组成了中国自己的导航卫星系统,这一系统计划在2008年完成建设。目前,全球已经建立了美国的GPS全球导航系统、欧洲的“伽利略”系统和俄罗斯的“格洛纳斯”系统。 ...… 查看全部问答> |
|
碎碎念就是对个人现在状态的一个具体描述,比如“电子设计大赛准备中...” 1)登录博客后,进入个人空间,点击上方的“碎碎念”, 2)进入碎碎念的编辑界面,可以发布自己的碎碎念,查看大家的碎碎念,还可以找到同心情的朋友 … 查看全部问答> |
|
本人初学单片机,需要用数码管、AT89S51、按键实现一可调时秒表。在调试程序过程中发现,当按键触发外部中断时,会打断显示程序。哪位大侠能给小弟一些指导,不胜感激!(两个数码管)程序如下: #include #define uchar unsigned ...… 查看全部问答> |
|
大家好: 我以前是搞51和pic单片机的,现在想搞嵌入式系统开发,我想向大家问一下:目前大家普遍使用的嵌入式开发软件有哪些啊?最好用的嵌入式开发软件是哪个呢?谢谢指点!… 查看全部问答> |
|
用keil c 编译程序的时候,分别选择small模式和compact模式,出现不同的结果。 同样的代码,用small模式是一种结果,用compact模式是另外一种结果,请高手给指点下,这是怎么回事?… 查看全部问答> |
|
想利用msp430和CC2530通过spi相连,各位知道具体该怎么设计么?本人刚入门,对这些不是太懂,希望众位大神多多帮助小弟啊~~~感激不尽~~~… 查看全部问答> |
|
大家好,俺看了几个帖子,有点晕了。家用电中,分火线,零线(中线),和地线。 一般情况下,都将零线也接地。那么,请教一下: 由于是交流电,在某半个周期时,火线电压高,电流是从 火线-用电器-零线-大地-变压器的零线(中线) 吗?&nb ...… 查看全部问答> |




