手上的单片机是STM32F103C8T6,ROM容量是64KB,起始地址为 0x0800 0000;RAM容量是16KB,起始地址为0x0200 0000。开发环境是Keil5,用到的工具还有串口助手。我将待下载的程序生成为bin文件,再通过串口助手发送给单片机接收。
在设计IAP程序时,要考虑ROM和RAM的大小。一方面,APP程序下载到单片机时是存放在ROM中的,如果你想下载多个APP程序,肯定需要ROM大些;另一方面,在串口接收数据时,APP代码首先存在一个数组变量中,这需要占用很大的RAM。我的APP程序是一个简单的灯闪烁程序,仅为验证IAP可行。
首先要完成bin文件的生成:
第一步:配置程序到底写在flash的哪个区域。APP代码首先从0x0800 C000 开始写,字长为0x4000,表示给APP代码预留16K的空间,另外48KB全部留给Bootloader程序。RAM不作修改,因为我是写进ROM(即flash)里的呀。由此还可知地址偏移量为0xC000(从0x0800 0000偏到0x0800 C000)
第二步:在代码初始化阶段添加一条代码: SCB->VTOR = FLASH_BASE | 0xC000;//flash偏移量为0xc000,这是对中断向量表的重定向。
第三步:配置程序如何生成bin文件。在Option(即配置单片机型号、下载器那个窗口)里找到User,在.....After Build\Rebuild 里 勾选Run#1,并黏贴如下内容:C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o "$L@L.bin" "#L"(其中\Keil_v5之前为安装路径)
第四步:编译程序。在工程文件夹搜索有没有bin格式的文件,应该只有唯一的一个,它就是所谓的APP代码,类似于HEX。
之后就是编写Bootloader程序:
主要就是两个函数,将APP代码写入flash,和跳转函数。其实不用太深究,会用就好。
关键字:IAP stm32f103c8t6
引用地址:
IAP在stm32f103c8t6上的实现
推荐阅读最新更新时间:2024-03-16 16:22
STM32F103RCT6移植到STM32F103C8T6注意事项
1,修改IC为STC32F103C8 2,修改晶振为8.0M 3,修改C/C++宏定义,由STM32F10X_HD,USE_STDPERIPH_DRIVER 改为 STM32F10X_MD,USE_STDPERIPH_DRIVER 4,替换启动文件,由startup_stm32f10x_hd.s修改为startup_stm32f10x_md.s 到这里已经没有报错了 5,重新分配各模块引脚定义 这一步做完以后才发现,程序好像跑的慢了10来倍, 群里求助,说是倍频没有设置好,找到一个设置倍频的代码后,发现还是不行. 再搜索原子论坛有人同样遇到相同的问题,在某位大神的回复中找到了答案,就是第6步, 6,系统初始化时调
[单片机]
怎么使用stm32写IAP的bootloader和APP
Stm32的bootloader和App的编写注意事项 1、 怎么分配bootloader和app的空间 2、 怎么得到数据和写入flash 3、 怎么从bootloader跳转到app 4、 怎么设置App的中断向量 5、 App中怎么生成bin文件 6、程序执行的流程 1、怎么分配bootloader和app的空间 因为我用的是stm32f103c8t6,它的flash的大小是64k,所以把它分成如上所示 0x08000000 ---0x0800 33FF分配给bootloader使用,大小是13k 0x0800 3400----0x080097FF分配给第一个APP的使用,大小是25k 0x08009800---
[单片机]
IAP+APP程序拼接方法,及相关拓展内容
1写在前面 在产品量产时,产品具有IAP和APP两部分程序时,一般需要拼接成一个量产程序文件。 有人肯定会好奇,为什么要拼接成一个程序文件呢? 这个答案很简单:为了提高生产效率,在量产只烧录一个程序文件(而不是烧录IAP + APP两个程序文件)。 下面写几点内容: 理解bin、hex、axf IAP+APP拼接方法 bin和hex互相转换 2 理解bin、hex、axf 想要掌握程序IAP+APP程序拼接,需要理解程序文件hex、bin文件格式内容。 先给一张三者的对比图: Bin文件 Bin文件就是一种没有格式的程序文件,只是包含了程序数据。 Hex文件 Hex是由Intel制定的
[单片机]
STM32F103C8T6控制器单片机的简单认识
STM32等基于 ARM Cortex内核的微控制器,凭借丰富的片上资源与简单易用的标准外设库,逐步成为消费与工业领域中的主流产品。 我们所说的STM32F103C8T6是属于市场上用得比较广泛的一种型号,意法提供的标准外设库对 STM32片上资源进行了封装,标准库和HALL库相比,标准外设库比较接近于传统的寄存器操作,国产GD32微控制器在很多方面都可以移植替代。 STM32F103C8T6是一款基于 ARM 32位 Cortex™-M3内核,电压使用范围是2.0V ~ 3.6V,工作频率最高可以达到72MHz,内部采用64K或128K字节 Flash程序存储器,以及高达20K字节的 SRAM数据存储器;内置 CRC循环
[单片机]
STM32F103CB IAP升级时APP部分调试
由于考虑了IAP升级,APP的程序rom地址要做响应改变,跟普通的调试有所区别。要按照以下步骤进行: 第一步:也是非常重要的和最容易被忽视的一步,先把IAP功能的bootloader引导程序烧写进去,这里假设该部分占用0x4000长度的空间。 第二步: 第三步: 第四步: 第五步: 修改代码中的中断服务程序偏移量。 然后就可以像平常一样调试了。
[单片机]
STM32F4xx官方IAP源码
单片机源程序如下: /* Includes ------------------------------------------------------------------*/ #include menu.h #include stm324xg_eval.h /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -----
[单片机]
STM32F072使用SD卡进行IAP升级
之前做的一个小项目,因为刚开始没有考虑到以后会经常升级,而每次升级都要旋开4颗螺丝拆壳,然后烧程序,再装壳,如果只要更新几个倒没啥感觉,但是一下更新几百个,那工作量。。。。,正好板子上有SD卡,就想着写个Bootloader程序,通过读取SD卡中的Bin文件进行IAP升级,这样可以大大简化以后的升级。IAP升级原理就不多说了,网上相关的资料和帖子一大堆,这里简单介绍我做的IAP方案,欢迎大家批评指正! Bootloader程序设计 bootloader程序的设计思路很简单,流程图如下: 初始化程序就不介绍了,比较简单。主要介绍下Bin文件检测以及IAP过程。我将IAP过程分为5个步骤,如下: Step1:检查是否存在升级文
[单片机]
STM32F0XX Cortex-M0 IAP
最近涉及到STM32F0XX的IAP,找了很多相关资料,感觉不是特别清楚,所以综合一些资料分享一下。 刚开始做的时候以为很简单,在程序中写了个跳转函数(跳转到System Memory,并运行MCU自己的Bootloader)如下: void EnterBootLoader() { void((*BootLoaderEntry)()); BootLoaderEntry = (void((*)()))(*((uint32_t *)0x1FFFEC04)); SCB- VTOR = 0X1FFF0000; RCC_Init(); (*BootLoaderEntry)(); }
[单片机]