gd32f303 iap升级源码
时间: 2023-07-05 15:10:44 浏览: 173
IAP升级源码
相较于通用的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升级时,需要注意数据的完整性和安全性,以避免因为升级失败导致微控制器无法正常工作。
阅读全文