看了原子的STM32的IAP 教程,一开始还以为bootloader是啥意思,差点跟uboot搞混淆了,其实stm32的“bootloader”不需要自己写汇编和链接脚本,Boot和App都是单片机程序,只是实现的功能不同,前者是为了引导App,后者是为了实现业务逻辑。只不过boot是有写flash或者sram的功能,再加上通信口(USB/USART etc. )来接收所谓的应用程序app代码。然后跳转到该代码执行就好了,但是要重新设置一下中断向量表的位置,要不然两个程序的中断可能会混淆。也就是说boot代码的中断要进boot代码的irq handler 而 app代码的中断要进app代码的irq handler。下边就以flash iap为例来具体说说需要注意的两点:
(1)boot代码和app代码在flash中的位置
两个代码都要正常运行那肯定不能在写入app代码到flash时把boot的代码给覆盖了,要不然boot代码就失效了。
STM32F429IG支持三种启动方式
1. FLASH启动 上电复位后PC指针指向第一条指令位置——0x08000000
2. SRAM启动 上电复位后PC指针指向第一条指令位置——0X20000000
3. 系统存储器启动 上电复位后PC指针指向第一条指令位置——0X1FFF0000
程序的起始地址默认是被放在FLASH的起始地址处,即0x08000000。
下图为boot程序的flash设置:
boot程序的地址不需要更改就是用默认的地址,理论上我们只需要确保 APP 起始地址在 Boot 之后,并且偏移量为 0X200的倍数即可。
设置boot的占用64k(0x10000),就是0X08000000 ~ 0X08010000的flash区间。
该芯片flash共1M,则app占用的起始地址设置为: 0X08010000,size为:1M-64k =960K (0XF0000)。
以下为app程序的flash设置:
(2)中断向量表的重定位
我们都知道一般情况STM32复位后从0x08000000开始取指,中断向量从0x08000004开始第一个为RESET向量 那APP工程的中断向量就不能如此了 APP的向量地址要从0x08010000开始:
NVIC_SetVectorTable(FLASH_BASE, 0x10000);
这里的0x10000根据实际情况更改即可。
关键字:STM32F4 IAP
引用地址:
关于STM32F4的IAP的一点点记录
推荐阅读最新更新时间:2024-03-16 16:22
stm32f405 HAL库串口接收错误
错误分析 用的HAL库有丢包问题, 定义void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { if(huart == &huart1) { log_u( ********************* huart1 err ********************************* \r\n ); switch(huart- ErrorCode) { case HAL_UART_ERROR_NONE: log_u( HAL_UART_ERROR_NONE\r\n ); break;
[单片机]
STM32 实现 IAP与APP文件合并
;以下为合并程序的配置文件,请注意APP的偏移地址为0x2000...全部文件夹请参考我的资源贴。 ;只针对小于64K的FLASH,需要更大容量的将在后续推出。 ;--------------------------------------------------------------------------------------------------------------------- ;CONSOLEBIN 2015.12.25 ;Info2.ini 文件与ConsoleBin.exe 放置在同级目录 ;引导程序文件,命名规则为 引导+文件+pre.bin leadFile=STM32F10XX6_
[单片机]
IAR环境下STM32F103ZET6+IAP方案的实现
一、什么是IAP,为什么要IAP IAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给用户一个代码文件即可。 而IAP却能很好的解决掉这个难题,一片STM32芯片的Code(代码)区内一般只有一个用户程序。而IAP方案则是将代码区划分为两部分,两部分区
[单片机]
成功移植icore的shell串口到STM32F4
icore开发板上的例子光盘下的 \iCore_扩展相关\code\7_uart1_shell工程文件,删除FSMC.c 和RCC.c 两个C文件和H文件 移植步骤: 第一、替换到之前的启动代码,添加startup_stm32f4xx.s 和system_stm32f4xx.c 两个文件。system_stm32f4xx.h可以替代到rcc.h 第二、改写NVIC.c 里的初始化代码。 static int initialize(void) { SCB- VTOR = ((unsigned long)0x08000000); //Set the Vector Table base location at 0
[单片机]
STM32F429 Discovery FMC驱动原子4.3寸LCD
上一篇写了GPIO简单的流水灯测试,看着有点单调,习惯了串口调试,板子上没有串口 那就另想办法吧,看着LCD突然有了个想法,为什么不把调试信息输出到LCD上,以前在做2416 WINCE开发的时候就经常这样干非常直观,那说干就干。 STM32F429I-DISO SDK里已经把开发包做好,那就直接拿过来用吧。 #define MESSAGE1 STM32F429I-Discoverry //提示信息 #define MESSAGE1_1 GPIO TEST #define MESSAGE2 LED3 LED4 #define MESSAGE2_1 ^-^ #define
[单片机]
STM32F407学习之初始STM32F407
STM32F407是基于高性能ARM Cortex™-M4的32位RISC(精简指令集)内核,工作频率高达168 MHz。Cortex-M4核心功是能支持所有ARM单精度的单精度浮点单元(FPU)数据处理指令和数据类型、它还能实现DSP全套指令和内存保护单元(MPU),从而提高应用程序的安全性。 STM32F407采用高速嵌入式存储(多达1 MB闪存,高达192 KB的SRAM),多达4 KB的备份SRAM,增强型I / O口、外设连接到两条APB总线、AHB总线和一个32位的多AHB总线矩阵。 STM32F407包含的外设有: 1.3个 12-bit ADC; 2. 2个 DAC;
[单片机]
STM32的时钟系统学习笔记(基于STM32F407)
RCC(Reset clock Control 复位时钟控制器) 时钟源(时钟生成) 常规:外部晶振、芯片内部振荡器、锁相环(PLL) PS:(Phase Locked Loop): 为锁相回路或锁相环 其他:以太网、USB OTG FS、或其他外设的时钟源 STM32F407时钟树关系图(重点理解经常用到) 时钟总线 RCC通过多个预分频器配置时钟总线 PS:预分频器 (Prescaler-PSC)用来将定时器时钟源进行分频输出 总线类型:AHB、低速APB1、高速APB2 PS: AHB(Advanced High Performance Bus),高级高性能总线 APB(Advanc
[单片机]
分享关于stm32f407定时器时钟频率的问题
上午想要用Timer10做相对精确的延时功能,但是用示波器发现实际延时数值总是只有一半,百思不得其解。 仔细查阅各处资料结合实际研究后对stm32f407的14个定时器的时钟做一个总结: 从时钟树中我们可以得知(时钟树的图片可以直接参考6楼,感谢6楼xkwy补上的图): (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线 (2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 从STM32F4的内部时钟树可知,当APB1和APB2分频数为1的时候,TIM1、
[单片机]