2021-04-01

STM32 IAP心得

	笔者不是大神,只是有时经过一些坑时的有感而发,且仅为个人理解,不具备相关其权威性。
	在STM32的芯片开发中,我一直处于一个懵懵懂懂的状态,不知编译器如何去制作烧录相关的代码到芯片中,很多时候就会去移植相关的代码例程进行修改。然而,这也导致了一个问题,遇到找不到的例程怎么办,一些参数或者一些类似于IAP升级时就会遇到许许多多的问题。(此篇也是笔者经历了两次IAP的毒打后,有感而发)
	首先,先介绍下keil中的options设置。
	Target篇:IROM1 和IRAM1这两个在结合STM32手册时是我最大的困惑之处,当时一直以为FLash就是ROM,其实这个概念是不对的。ROM只是一个执行程序的大小,表示的是当时工程所可以占据的最大值。而Flash就是存放程序的硬件物理空间。同时,关于flash的操作在不同芯片当中是不一定一致的,如F1和F4的擦除区域大小的问题,还有关于Flash的数据存储方式问题:在F4的3.3v额定电压时,读写的字宽为32位,将array[4]的数据写入Flash时,应为:array[0] | (array[1]<<8 )|(array[2]<<16)|(array[3]<<24)的方式。
	在一个工程编译后,在build output窗口,我们可以看到Code、RW、RO、ZI这四个。Flash中存储的应为Code+RW+RO,在程序未运行时RAM为0,执行前 RAM则有 RW+RO+ZI的数据大小占据其中。
	User篇: After Build/Rebuild->Run #1 :fromelf --bin -o "$L@L.bin" "#L" 。将HEX的文件改为BIN文件。原因:hex文件其实就是在bin文件之上包了一层外壳,这个外壳的作用是给其他编译之类的识别使用,而STM中bin文件也可以运行,同时bin文件比hex文件小很多。对于stm32这个小内存的芯片而言,当然要想方设法地减小代码的大小。
	C/C++篇:optimization 选择Level3,做个极致的 ==
	Debug篇:setting->flash Download->start 应和Target->IROM 保持一致
	至于跳转部分就不多说了,应该这个网上也是许许多多的资料。
	唯一注意的点是
 if (((*(__IO uint32_t*)APP_FLASH_START_ADD) & 0x2FFE0000 ) == 0x20000000)

0x2FFE0000 、0x20000000 是根据stm芯片的RAM大小去判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值