ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-06 15:59:43  阅读:960  来源: 互联网

标签:0x00 app flash 程序 华大 HC32F460 地址 串口


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有