说明
模组内部使用的M3的内核, 如果大家伙使用过STM32或者类似的ARM核的单片机做过程序升级,
那么这篇文章就可以基本上看懂了, 如果没有做过升级,建议看一下下面的
https://mnifdv.cn/resource/cnblogs/iot_documents/STM32 OTA demo.pdf
然后呢, 模组的开发是没有使用IDE的, 是直接使用的ARMCC Cmake
咱以前是直接在Keil上进行配置, 是软件帮咱内部配置的编译过程.
实际上脱离了Keil软件照样是可以编译程序的, Keil只是提供了页面配置而已.
有兴趣的同学可以百度下如何脱离Keil使用 Cmake编译程序.
先来看程序加载的过程
1.使用文本编辑软件打开 PLAT文件夹 (我就使用 VSCode)
2.BootLoader程序会执行 SystemXIPNormalBoot 函数
ec_main 就是程序入口函数
3.SystemXIPNormalBoot 函数里面最终会执行跳转
APP_FLASH_LOAD_ADDR 地址呢是 0x00820000 ; 其实就是咱用户程序(执行具体功能的程序)存放在flash的起始地址
咱的用户程序就是从这个地址开始烧录到flash
看下下面的跳转程序,因为是ARM内核嘛, 所以最终就是要执行程序的复位中断入口地址,
注:falsh是4字节代表一个地址, 地址加1 正好是复位中断地址(如果不理解,说明没有玩转ARM单片机升级....)
执行完上面的其实就是运行了用户程序了.
现在整体说下flash的分配情况
1.BootLoader程序
BootLoader程序是从flash的 0x00804000 地址开始存储的, 总共 0x00012000(73728字节,72KB)
(说明最底层还有一套程序,这个咱就不关心了)
2.用户程序
用户程序是从flash的 0x00820000 地址开始存储的, 总共 0x280000(2621440字节,2560KB)
3.后面的(因为刚使用,还没有具体了解, 我猜的)
FLASH_MEM_BACKUP_ADDR 感觉是升级程序时, 接收的差分程序文件存放的地址,
FLASH_MEM_PLAT_INFO_ADDR 不知道, 要么是内部使用的, 要么是提供给用户使用的.....
编译的时候如何设置程序运行的ROM起始地址
1,在有IDE软件的时候咱都知道在上面就可以设置程序运行的ROM地址
2,在没有IDE的时候如何做的呢?
编译程序的时候其实有个链接文件 xxxxx.ld文件;
现在咱看是如何把BootLoader程序设置到运行在上面说的0x00804000 地址上的
其实就是xxxxx.ld文件控制的哈, 不过咱只需要了解就可以, 咱也不需要改什么.
同样的用户程序也有设置(注意哈,所有的用户程序是在上面的文件夹里面统一设置的)
提示:上面说的这个不必深究, 了解下就可以, 后面应该是用不到去自己调整flash分配