思路
目的是实现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寄
GD32H759系统板SD卡bootloader实现与问题解决

最低0.47元/天 解锁文章
2846

被折叠的 条评论
为什么被折叠?



