其他分享
首页 > 其他分享> > 华大MCU(四):HC32F460串口iap升级(踩坑篇)

华大MCU(四):HC32F460串口iap升级(踩坑篇)

作者:互联网

HC32F460串口iap升级(踩坑篇)

文章目录

1. 串口IAP升级

mcu的串口iap升级,其实就是通过串口升级程序的一种方式,现在基本上都是仿照linux的启动模式来实现的,总体上最少要有两个程序,一个叫bootloader程序,一个是app程序,具体的实现原理方法多种多样,但是本质上是一样的,只是有的做了安全方面的考量。这节只说基于HC32F460最简单的iap升级的实现。

2. APP程序的实现

2.1 确定app在flash的存储位置

首先大家要知道,任何的mcu启动都会在addr为0x00的地方开始读程序运行,一般mcu地址为0x00的地方是芯片flash的起始地址,所以可以说mcu上电都会从flash的0x00地址开始启动。只不过有些芯片厂商会做内部地址映射,将其它地方的地址映射到地址0x00,这样的目的是可以灵活的配置不一样的启动模式。

我们在学stm32的时候都知道,当配置为flash启动的时候,就会将0x8000000地址映射到0x00,stm32在启动的时候,从0x00启动就变成了0x8000000地址启动,那么当程序下载到0x8000000为起始地址后的一片区域,程序就会运行。

而HC32F460不支持多种启动模式,所以没有做映射,而是上电直接读0x00地址的代码运行。

2.2 正常app的实现

正常的mcu制作app程序都只需要两个步骤:

  1. 在程序中添加修改中断向量表位置,

    代码:

    //要声明两个宏
    //华大mcu是默认从地址为0x00开始执行程序
    #define FLASH_BASE 0x00 
    
    //地址偏移量,要通过boot loader和app所占空间大小自己估量,但值一般要求是flash页的整数倍
    #define VECT_TAB_OFFSET 0x020000 
    
    //在main函数添加一句
    int main()
    {
        //在main函数的第一句执行
        SCB->VTOR = FLASH_BASE + VECT_TAB_OFFSET; //重定位中断向量表
    	//其他程序。。。。
    }
    
  2. 修改编译的链接脚本。对于用keil编译可直接在界面修改,将IROM起始地址加上程序设置的地址偏移量,大小参考芯片flash的大小算一下。IRAM也要改,参照程序编译后那个

    例如将:
    在这里插入图片描述

    修改为下图:

    在这里插入图片描述

2.3 华大hc32f460特有的坑

正常的app程序,有上面两部分就可以了,可是hc32f460编译会报一个错误:

Error: Q0147E: Failed to create Directory .\output\xxx.bin\ER$$.ARM.__AT_0x00000400: File exists

这个是在说0x00000400地址访问不到,查看map文件,发现在code部分的0x400地址竟然是个data,这就说明程序里面对0x400地址有特别操作,后来在程序中搜索400,结果找到这段代码:

在这里插入图片描述

注意:FLASH_BASE是我自己填的,若您看到应该括号只有0x400。

后来在用户手册找到了原因:

在这里插入图片描述

数据手册里面说,在上电后,程序会默认读地址为0x400这个地方的内容,配置一些东西,包括看门狗。

这样有一定好处,在stm32我们设置看门狗,都是在main函数里面开启,但是若程序还没执行到main函数里面的的开启看门狗程序,就死机了,那就真的死机了。但是华大的通过这个,可以在开机的时候直接启动看门狗,这样更安全。

但是当我更改了app的程序运行位置,这个0x400就不在我程序编译的范围内,所以要更改为:

在这里插入图片描述
其中,这两个宏是在上面 2.1节 定义的。

注意:这个程序在文件hc32f460_icg.c文件中定义的,若没有这个文件,需要手动从sdk库中添加此文件。

这样hc32f460的app基本就完成了。

3. boot loader的实现(未完成)

整理中。。。

标签:0x00,app,flash,程序,华大,HC32F460,地址,串口
来源: https://blog.csdn.net/Zhichao_Zhang/article/details/122798683