×
单片机 > 单片机程序设计 > 详情

STM32CubeMX生成SDIO驱动SD卡的代码

发布时间:2020-06-16 发布时间:
|

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卡的容量,所以接着定义一个句柄



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



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


没按一次复位按键,串口打印一行字符。


关键字:STM32CubeMX  SDIO  驱动SD卡

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
stm32 总线矩阵介绍