记录gd32f303 IAP代码跳转卡时钟初始化问题

一、问题描述

        在代码升级跳转中发现跳转正确,但是会卡在代码开头的初始化时钟树的操作中。

二、解决

        发现是因为boot代码跟我app代码的时钟配置不一样的问题,一个内部时钟104MHz一个外部时钟72MHz。简单地把app的时钟配置搬到boot程序就实现跳转且运行正常。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
相较于通用的GD32 IAP升级函数,GD32F303 IAP升级代码需要做一些针对性的修改。下面是一个简单的GD32F303 IAP升级源码示例: ```c #include "gd32f30x.h" #include "iap.h" #define IAP_APP_ADDRESS (uint32_t)0x08008000 // 应用程序起始地址 #define IAP_APP_SIZE (uint32_t)0x00070000 // 应用程序大小 #define IAP_APP_END_ADDRESS (IAP_APP_ADDRESS + IAP_APP_SIZE) // 应用程序结束地址 /** * @brief GD32F303 IAP升级函数 * @param[in] buf: 存储升级数据的缓冲区 * @param[in] len: 升级数据的长度 * @retval 升级结果 * @arg 0: 成功 * @arg 非0: 失败 */ uint8_t gd32f303_iap_upgrade(uint8_t* buf, uint32_t len) { uint32_t i = 0; uint32_t app_addr = IAP_APP_ADDRESS; // 检查升级数据的长度是否超出应用程序范围 if (len > IAP_APP_SIZE) { return 1; // 升级数据过长 } // 关闭所有中断 __disable_irq(); // 关闭Flash缓存 fmc_cache_disable(); // 使能Flash写入 fmc_unlock(); // 擦除应用程序 for (i = app_addr; i < IAP_APP_END_ADDRESS; i += FLASH_PAGE_SIZE) { fmc_page_erase(i); } // 写入升级数据 for (i = 0; i < len; i += 4) { fmc_word_program(app_addr + i, *(uint32_t*)(buf + i)); } // 校验升级数据 for (i = 0; i < len; i += 4) { if (*(uint32_t*)(buf + i) != *(uint32_t*)(app_addr + i)) { return 2; // 校验失败 } } // 升级成功,重启系统 NVIC_SystemReset(); return 0; } ``` 需要注意的是,GD32F303 IAP升级源码中需要对Flash缓存进行关闭操作,并且需要注意升级数据的长度是否超出应用程序范围。同时,在进行IAP升级时,需要注意数据的完整性和安全性,以避免因为升级失败导致微控制器无法正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值