文章目录
- 原创声明
- 前言
- 一、Bootloader 是什么?
- 二、BootLoader 的实现
- 2.1 生成 bin 文件
- 2.2 确认应用程序的起始位置
- 2.3 编写引导程序
- 三、App 的实现
- 3.1 修改 IROM1 的位置
- 3.2 修改向量表
- 3.3 加入 App 循环打印提示
- 四、演示效果
- 总结
- 授权须知
原创声明
本文为 HinGwenWoong 原创,如果这篇文章对您有帮助,欢迎转载,转载请阅读文末的【授权须知】,感谢您对 HinGwenWoong 文章的认可!
前言
嵌入式的设备,或多或少都需要对设备进行更新已适配更多的需求,如果未出货的设备还可以使用下载线去下载,但是如果出货之后到了客户那里,客户没有下载线而且不是专业人员,无法对设备进行升级,这时候,bootLoader
的重要性就凸显出来了,bootLoader
的设计就是为了设备能够进行远程升级或者只用指令升级,极大简便了升级需要的步骤,做到傻瓜式升级,极大增强了产品的后续维护性。
下面我来介绍写如何快速实现 STM32 BootLoader 的引导
,帮助正在读文章的您更快将此技术运用起来!
我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!
一、Bootloader 是什么?
Bootloader
是在应用程序开始前运行的一个小程序,里面可以进行一些初始化操作,升级引用程序等,在嵌入式设备中很常见。
二、BootLoader 的实现
我这里做了一个简单的 BootLoader 程序,只能进行引导,还没有对升级进行编写,升级是对约定好的应用程序
的 Flash
进行擦+写,比较常用的升级方式是通过 TFTP 的方式进行升级,您可以在 STM32官方的这个例程找到答案: 基于LwIP TCP/IP栈通过以太网进行STM32F4x7应用内编程(IAP)(AN3968)
2.1 生成 bin 文件
- 使用 Cube 生成出来后,打开工程的设置选项,填入如下命令
fromelf --bin -o ".\bin_file\@L.bin" "#L"
- 编译之后,可以看到
bin_file
文件夹里面生成了 bin
文件,并可以知道其大小,我们根据其大小约定应用程序
在 Flash
的起始位置
2.2 确认应用程序的起始位置
-
升级的过程被称为 IAP(In Application Programming)
,每个芯片的 Flash
的扇区不同,我这里使用的是 STM32F767
,上官网查看有关资料:STM32F76xxx and STM32F77xxx advanced Arm®-based 32-bit MCUs.pdf 里面有关于 Flash
扇区的地址信息:
-
在步骤2.1
已经知道 BootLoader
的 bin
文件大小是22 KB
,我们可以根据上面的 Flash 扇区进行分配,我将应用程序的起始位置定在 扇区1
,起始地址为 0x0800 8000
2.3 编写引导程序
#include "stm32f7xx.h"
typedef void (*pFunction)(void);
void jump_to_app(uint32_t app_addr)
{
pFunction jump_to_application;
uint32_t jump_address;
if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)
{
jump_address = *(__IO uint32_t*) (app_addr + 4);
jump_to_application = (pFunction) jump_address;
__set_MSP(*(__IO uint32_t*) jump_address);
jump_to_application();
}
}
#define FLASH_JUMP_ADDR (0x08008000)
int main(void)
{
if(((FLASH_JUMP_ADDR+4)&0xFF000000)==0x08000000)
{
jump_to_app(FLASH_JUMP_ADDR);
}
while(1)
{
}
}
三、App 的实现
3.1 修改 IROM1 的位置
根据约定好的 Flash 起始位置进行更改,上面步骤 2.2
已经确定好是 0x08008000
3.2 修改向量表
搜索宏定义 VECT_TAB_OFFSET
,将 0x00
改为距离 0x08000000
的偏移量
#define VECT_TAB_OFFSET 0x8000
3.3 加入 App 循环打印提示
void StartDefaultTask(void const * argument)
{
segger_rtt_init("APP enter!");
for(;;)
{
print_log("You are in App now !!\n");
osDelay(1000);
}
}
四、演示效果
总结
以上是使用 快速搭建 STM32 Bootloader 的引导程序,希望能够帮助正在读文章的您更快将此技术运用起来!
更多阅读推荐
- 【嵌入式实战】STM32+Lwip 实现 DHCP+HostName(超详细) : 在 DHCP 的基础上 Ping 域名的方式获取 DHCP 的 IP
- 【嵌入式实战】STM32+Lwip 实现 SNTP 网络授时(超详细)
- 【嵌入式实战】STM32+FreeRTOS+LWIP+WolfSSL 实现 HTTPS(超详细)
- 【嵌入式小技巧】stm32 实现 Segger RTT 打印(超详细)
- 【嵌入式实战】STM32+Lwip 实现 MQTT(超详细步骤+代码注释,内含避坑提示)
我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!
授权须知
- 原创文章在推送两天后才可进行转载
- 转载文章,禁止声明原创
- 不允许直接二次转载,转载请根据原文链接联系作者
- 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。
作者:HinGwenWoong
一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
CSDN: HinGwenWoong
原文链接:【嵌入式实战】STM32 Bootloader 快速实现(超详细)
- 若需要修改文章的排版,请根据原文链接联系作者
- 再次感谢您的认可,转载请遵守如上转载须知!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)