怎么使用stm32写IAP的bootloader和APP

2020-07-01来源: eefocus关键字: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----0x0800 FBFF分配给第二个APP的使用,大小是25k

0x0800FC00----0x0800 FFFF 分配给user_flag和其它标志使用,大小是1k


在keil中设置rom的大小

A、bootloader中rom大小的设置

B、APP1中rom大小的设置

C、APP2中rom大小的设置

Rom设置好了就可以在map中看见地址的改变,这里拿bootloader和app1来说。

Bootloader的map

App1的map

这里就可以看到RESET的地址改变了

但是要想我们改变的rom在map中也改变keil里面必须要设置如下图,

这里必须要打勾,默认新建的工程是没有选择的


2、怎么得到数据和写入flash

在我的程序是通过串口接收数据,然后调用app_bin_handler(&timer);函数来在里面完成写flash(函数iap_write_appbin(Flash_Current_Write_addr(),g_RxBuf1,length))、和校验写入的数据是否正确(函数flag =read_flash_ECC(Flash_Current_Write_addr(),length);)、校验通过就可以跳转到app中(函数JumpToApp(Flash_Current_Write_addr(),1);)


3、怎么从bootloader跳转到app

voidJumpToApp(u32 ApplicationAddress,u8 flag)

{

     u32 temp;

     if (((*(vu32*)ApplicationAddress) &0x2FFE0000 ) == 0x20000000)

     {

               if(flag == 1)

               {

                        User_write_Flash_falg();

               }

               temp = (*(vu32*)(ApplicationAddress + 4));

               JumpToApplication =(FunVoidType)temp;

               MSR_MSP(*(vu32*)ApplicationAddress);

               JumpToApplication();

     }1234567891011121314151617181920212223

}

程序中就是利用上面的函数实现跳转,中间有个User_write_Flash_falg()函数是用来设置app的标志的,如果当前正在使用的是app1,那么就设置标志位为2,好在下次启动的时候跳转到app2,如果当前正在使用的是app2,那么就设置标志位为1,好在下次启动的时候跳转到app1


至于上面函数的详解可以百度。


4、怎么设置App的中断向量

Stm32的中断重定向比较简单,因为它有一个专用的寄存器

     NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x9800);1

这个函数就是重定向了app2的中断向量,实现起来简单


6、App中怎么生成bin文件

因为我的程序是通过串口下载app的所以必须要生成bin文件,才方便下载,

在工程里面进行如下设置就可以生成bin文件

其中主要是路径要对,不然找不到.axf文件,也就生成不了bin文件


总结:

Bootloader里面主要是

1、设置bootloader和app的空间

2、接收编译好的app的bin文件,写入flash

3、实现跳转


App里面主要修改的地方是

1、 ROM起始地址和分配的空间大小

2、 重定向中断向量

3、 生成bin文件


这里就是整个程序执行的流程


关键字:stm32  IAP  bootloader  APP 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic501785.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32启动文件选择的区别
下一篇:STM32学习之使用库函数编写串口通信

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

Ubuntu下安装Stm32的Eclipse的开发环境(1)
下使用的stm32工程,也尝试使用了makefile去编译运行它吗,那么我们现在来看看eclipse下怎么编译它吧。点击新建工程 C project 或 C++ project ,选择一个空工程,toolchain设置为 cross arm gcc。并在project name 的地方给工程起个名字。之后选择工具链设置其位置,并选择编译配置模板。最后点击finish完成。在完成设置后,我们会在工作区看到一个空的工程。这是我们在工程上点击右键选择 import ,选择导入文件结构。并在选择中工程文件夹勾选它后点击finish 进行导入操作。设置编译参数在我们导入后可能会看到很多的报错和警告,我们先不要理会他们,首先我们要做
发表于 2020-06-07
关于STM32CubeMx printf重定向,及报错。"FILE" is undefined
PFP *//* USER CODE BEGIN 0 */PUTCHAR_PROTOTYPE{    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);    return ch;}/* USER CODE END 0 */ 这样写会报错"FILE" is undefined  添加头文件 stdio.h即可
发表于 2020-06-06
【STM32】keil MDK下重定向printf到串口(基于STM32CubeMX)
概述在keil MDK环境下重定向printf与keil C51不同,由于本人使用了STM32CubeMX生成工程模板,HAL_USART_Transmit函数即是模板里串口输出的函数。由于printf最终是调用fputc输出数据,fputc是一个弱引用(weak)函数,覆写即可重定向printf。代码清单extern USART_HandleTypeDef husart1;int fputc(int ch, FILE *f) {    HAL_USART_Transmit(&husart1, (uint8_t *)&ch, 1, 0xFFFF);    return ch
发表于 2020-06-06
STM32CubeMx启动串口调试功能Printf调试
## 概述项目中往往需要调试信息,调试stm32的时候,需要标准库里面的printf函数。在keil MDK环境下重定向printf与keil C51不同,由于本人使用了STM32CubeMX生成工程模板,HAL_USART_Transmit函数即是模板里串口输出的函数。由于printf最终是调用fputc输出数据,fputc是一个弱引用(weak)函数,覆写即可重定向printf。代码清单/* USER CODE BEGIN Includes */#include "FreeRTOS.h"#include "task.h"#include "queue.h"
发表于 2020-06-06
STM32CubeMx启动串口调试功能Printf调试
STM32F1xx HAL库中文版——USART篇
38.1 UART Firmware driver registers structures //串口固件驱动寄存器结构38.1.1 UART_InitTypeDefUART_InitTypeDef被定义在stm32f1xx_hal_uart.h头文件中数据字段:• uint32_t BaudRate 波特率• uint32_t WordLength 字长• uint32_t StopBits 停止位• uint32_t Parity 奇偶校验位• uint32_t Mode 模式• uint32_t HwFlowCtl 硬件流控制• uint32_t OverSampling 过采样字段的文档:• uint32
发表于 2020-06-06
Stm32-输入捕获
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)中。1. 相关寄存器介绍1) 捕获/比较模式寄存器 (TIMx_CCMRx) 当在输入捕获模式下使用的时候,对应上图的第二行描述,从图中可以看出,TIMx_CCMR1 明显是针对 2 个通道的配置,低八位[7:0]用于捕获/比较通道 1 的控制,而高八位[15:8]则用
发表于 2020-06-06
Stm32-输入捕获
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved