基于GD32H7的SD卡Bootloader代码,以及BUG解决

GD32H759系统板SD卡bootloader实现与问题解决

思路

目的是实现GD32H759系统板的SD卡bootloader,进行SD卡升级,思路可以参考硬汉哥的教学BSP视频教程第18期:基于NAND,eMMC,SD卡和U盘的BootLoader实战,带CRC完整性校验(2022-06-16) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz!

流程就是通过外部设备获取代码的二进制可执行文件,也就是bin文件,可以直接写入到内部Flash中执行.

为此为了减少上位机的依赖,我选择使用SD卡来存储bin文件,读取后写入Flash中,通过板载的按键来切换升级代码或者直接启动APP.

外设配置

Flash

通过查看系统结构图,GD32H7的Flash挂载在FMC总线上,通过FMC总线访问,由于GD已经编写了对应FMC的代码,可以直接通过地址访问,这里使用惠勤智远的示例代码,直接读写内部Flash.

void fmc_write_32bit_data(uint32_t address, uint32_t *data_32, uint32_t length)
{
    fmc_state_enum fmc_state = FMC_READY;
    uint32_t addrx = 0;
    uint32_t endaddr = 0;
    uint32_t i;
    
    if (address < FMC_START_ADDRESS || address % 4 ||       /* 写入地址小于 FMC_START_ADDRESS, 或不是4的整数倍, 非法. */
        address > (FMC_END_ADDRESS))                        /* 写入地址大于 FMC_END_ADDRESS, 非法. */
    {
        return;
    }
    
    fmc_unlock();                     /* 解锁FMC_CTL寄存器 */
    
    fmc_all_flags_clear();            /* 清除FMC标志位  */
  
    addrx = address;                  /* 写入的起始地址 */
    endaddr = address + length * 4;   /* 写入的结束地址 */

    while (addrx < endaddr)           /* 扫清一切障碍.(对非FFFFFFFF的地方,先擦除) */
    {
        if (*(volatile uint32_t *)addrx != 0XFFFFFFFF)     /* 有非0XFFFFFFFF的地方,要擦除这个扇区 */
        {          
            fmc_state = fmc_sector_erase(addrx);           /* 擦除扇区 */
          
            if (FMC_READY != fmc_state)             
            {
                break;                                     /* 发生错误 */
            }
            
            fmc_all_flags_clear();                         /* 清除FMC标志位  */
            SCB_CleanInvalidateDCache();                   /* 清除无效的D-Cache */
        }
        else
        {
            addrx += 4;
        }
    }
    
    if (FMC_READY == fmc_state)
    {
        for (i = 0; i < length; i++)
        {
            if (FMC_READY != fmc_word_program(address, data_32[i])) /* 写入数据 */
            {
                 break;             /* 写入异常 */  
            }
            
            address += 4;
            fmc_all_flags_clear();  /* 清除FMC标志位 */ 
        }
    }

    SCB_CleanInvalidateDCache();    /* 清除无效的D-Cache */
    
    fmc_lock();                     /* 锁定FMC_CTL寄
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值