精华内容
下载资源
问答
  • 平台:STM32103 Bootloader用于应用程序.BIN文件的升级,支持XMODEM XMODEM_1K协议.易上手,可缩短开发周期.
  • STM32F1xx系列BootLoader示例,可以尝试移植使用,希望能有帮助。
  • 概要 准备工作 编写Bootloader 编写APP

    概要

    准备工作

    编写Bootloader

    编写APP

    展开全文
  • STM32例程之Bootloader

    热门讨论 2013-12-30 10:15:11
    通过串口方式实现bootloader功能(非ISP)。 可以直接下载hex文件将程序下载到指定Flash存储区。 文件传输用Xmodem协议。 串口命令输入执行相关动作。
  • 我是 AidenHinGwenW,本文介绍如何快速实现 STM32 BootLoader 的引导。 嵌入式的设备,或多或少都需要对设备进行更新已适配更多的需求,`bootLoader` 的设计就是为了设备能够进行远程升级或者只用指令升级,极大简便...

    原创声明

    本文为 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已经知道 BootLoaderbin文件大小是22 KB,我们可以根据上面的 Flash 扇区进行分配,我将应用程序的起始位置定在 扇区1,起始地址为 0x0800 8000

    2.3 编写引导程序

    #include "stm32f7xx.h"
    
    typedef  void (*pFunction)(void);
    
    /*!
    * @brief 跳转到应用程序段
    *        执行条件:无
    * @param[in1] : 用户代码起始地址.
    *
    * @retval: 无
    */
    void jump_to_app(uint32_t app_addr)
    { 
        
        pFunction jump_to_application;
        uint32_t jump_address;
        
        /* Check if valid stack address (RAM address) then jump to user application */
        if (((*(__IO uint32_t*)app_addr) & 0x2FFE0000 ) == 0x20000000)
        {
          /* Jump to user application */
          jump_address = *(__IO uint32_t*) (app_addr + 4);
          jump_to_application = (pFunction) jump_address;
          /* Initialize user application's Stack Pointer */
          __set_MSP(*(__IO uint32_t*) jump_address);
          jump_to_application();
        }    
        
    }
    
    #define FLASH_JUMP_ADDR							(0x08008000)
    
    int mian(void)
    {
    	/* 
    		初始化程序省略.....  
    	*/
    	
    	if(((FLASH_JUMP_ADDR+4)&0xFF000000)==0x08000000) //Judge if start at 0X08XXXXXX.
    	{
    		jump_to_app(FLASH_JUMP_ADDR); // Jump to  APP
    	}
    	
    	while(1)
    	{
    	
    	}
    }
    
    

    三、App 的实现

    3.1 修改 IROM1 的位置

    根据约定好的 Flash 起始位置进行更改,上面步骤 2.2 已经确定好是 0x08008000
    在这里插入图片描述

    3.2 修改向量表

    搜索宏定义VECT_TAB_OFFSET,将 0x00 改为距离 0x08000000 的偏移量

    /*!< Uncomment the following line if you need to relocate your vector Table in    Internal SRAM. */
    /* #define VECT_TAB_SRAM */
    #define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.
                                      This value must be a multiple of 0x200. */
    
    

    3.3 加入 App 循环打印提示

    void StartDefaultTask(void const * argument)
    {
    	/* USER CODE BEGIN StartDefaultTask */
    	segger_rtt_init("APP enter!");
    	/* Infinite loop */
    	for(;;)
    	{
    		print_log("You are in App now !!\n");
    		osDelay(1000);
    	}
    	/* USER CODE END StartDefaultTask */
    }
    

    四、演示效果

    • 确认烧录过程是 Erase Sectors
      在这里插入图片描述

    • 打开 RTT 窗口,连接 RTTSTM32 ,依次烧录 BootLoaderApp 的程序;
      如何使用 JLink 实现 Segger log 可以按参考我之前的文章: 【嵌入式小技巧】stm32 实现 Segger RTT 打印(超详细)

    • 烧录完 App 程序之后,可以在 RTT窗口 看到正确引导到 App成功!!!
      在这里插入图片描述

    总结

    以上是使用 快速搭建 STM32 Bootloader 的引导程序,希望能够帮助正在读文章的您更快将此技术运用起来!


    更多阅读推荐

    我是 HinGwenWoong ,一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,码字不易,如果帮到您,请帮我在屏幕下方点赞 👍 ,您的点赞可以让技术传播得更远更广,谢谢!


    授权须知

    1. 原创文章在推送两天后才可进行转载
    2. 转载文章,禁止声明原创
    3. 不允许直接二次转载,转载请根据原文链接联系作者
    4. 若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
      但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

    作者:HinGwenWoong
    一个有着清晰目标不停奋斗的程序猿,热爱技术,喜欢分享,共同进步!
    CSDN: HinGwenWoong
    原文链接:【嵌入式实战】STM32 Bootloader 快速实现(超详细)

    1. 若需要修改文章的排版,请根据原文链接联系作者
    2. 再次感谢您的认可,转载请遵守如上转载须知!

    展开全文
  • stm32在做好bootloader之后,应用程序在编写的时候需要有几点注意的地方,结合本人的移植经验,编写了该文档,列举了几个需要注意的地方
  • Stm32bootloader和App的编写

    万次阅读 2018-09-19 16:59:06
    一、流程: 1、 怎么分配bootloader和app的空间 2、 怎么得到数据和写入flash 3、 怎么从bootloader跳转到app 4、 怎么设置App的中断向量 ...因为我用的是stm32f103c8t6,它的flash的大小是64k,所以把它分...

    一、流程:

    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();

             }

    }

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

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

     

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

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

             NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x9800);

    这个函数就是重定向了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 实现 BootLoader功能(奉上源码)

    千次阅读 多人点赞 2020-01-17 15:14:11
    本文主要是用以实现 STM32 BootLoader 功能。支持串口命令行功能,可用于引导内核、带boot 参数区,支持串口升级内核等功能。 代码下载路径:https://github.com/lza1205/n_boot 先说原理: 片上flash空间分配: ...

    本文主要是用以实现 STM32 BootLoader 功能。支持串口命令行功能,可用于引导内核、带boot 参数区,支持串口升级内核等功能。

    代码下载路径: https://github.com/lza1205/n_boot 

    先说原理:

    片上flash空间分配:

    STM32 片上flash,一般地址是在 0x8000000 。上电后系统会从 0x8000000 地址开始读取程序并执行。

    所以我们的 BootLoader 放在 0x8000000 地址上,0x8003000 存放我们的 boot 参数。然后我们 的 内核(AP)程序可以放到 0x8003800 地址。所以整个片上flash 的构造如下:

     

    boot参数区的内容:

    /* boot 系统参数 */
    struct boot_var{
    	INT32U start_timeout;		//内核启动延时
    	INT32U mach;				//机器ID
    
    	INT32U boot_addr_base;		//boot地址
    	INT32U boot_size;			//boot代码段大小
    	INT32U boot_var_addr_base;	//boot 参数地址
    	INT32U boot_var_size;		//boot参数段大小
    	INT32U kernel_addr_base;	//AP 内核地址
    
    };

    STM32 boot 跳转到 0x8003800 启动程序代码:

    /************************************************************************
    时间:2014.3.23
    作者: lza1205
    
    	基于stm32 的boot 该文件是cpu相关的代码,不同平台需要修改
    
    ************************************************************************/
    uint8_t __cpu_goto_app(uint32_t Addr)
    {
    	pFunction Jump_To_Application;
    	__IO uint32_t JumpAddress; 
    
    	if (((*(__IO uint32_t*)Addr) & 0x2FFE0000 ) == 0x20000000)
    	{ 
    		/* 地址要偏移4 */
    		JumpAddress = *(__IO uint32_t*) (Addr + 4);
    		Jump_To_Application = (pFunction) JumpAddress; 
    
    		/* 使用app的栈 */
    		__set_MSP(*(__IO uint32_t*) Addr);
    
    		/* 跳转到用户函数入口地址 */
    		Jump_To_Application();
    	}
    	return 1;
    }
    

    代码目录文件说明:

    boot.c —— 是整个 stm32 BootLoader 的 核心代码。其中最核心的函数是 n_boot_memu ,它是整个 boot 的入口,我们可以通过理解整个函数来了解整个boot过程

    cpu_c.c —— 是具体芯片相关的,CPU 相关代码,需要移植,主要实现 uint8_t __cpu_goto_app(uint32_t Addr) 函数,用于跳转到内核

    command.c —— 实现串口命令行功能,类似于 uboot 一样,可以输入一些串口命令,实现我们的操作。目前支持的串口命令如下:

    flash.c ——实现 片上flash 相关操作,读写擦除等

    xmodem.c 、xmodem_crc.c  、xmodem_hw.c ——实现串口升级 内核的功能。

    可以在串口按住回车键,然后上电,之后输入 s ,启动传输bin文件升级功能。secureCRT选择send Xmodem。之后选择内核文件,点击发送即可升级。

    展开全文
  • 一步一步实现STM32-FOTA系列教程之Bootloader编写 文章系列链接 《一步一步实现STM32-FOTA系列教程之bin文件生成》 《一步一步实现STM32-FOTA系列教程之STM32-FLASH分区说明》 《一步一步实现STM32-FOTA系列教程...
  • 设计一款STM32BootLoader

    万次阅读 多人点赞 2018-07-13 12:01:33
    之前很想做一个属于STM32BootLoader,但是想想没什么实际用处就没有下手,但是当前的项目遇到的麻烦事情要我改变了这种看法。比如说我开发了一个产品需要测试,把一个样品送到客户手里去测试使用,但是客户在使用...
  • 基于野火STM32F429,利用STM32CUBEMX+keil MDK,编写STM32bootloader程序,可实现通过串口下载程序的功能
  • STM32+BootLoader+SecureCRT(Y) @Eric_Jarsionge 一、BootLoader bootloader其实就是一段启动程序,它在芯片启动的时候首先被执行,它可以用来做一些硬件的初始化,当初始化完成之后跳转到对应的应用程序中去。...
  • 官方提供的STM32基于USART的Bootloader通信协议,有很详细的通信流程 本人在做项目过程中根据此文档完成了bootloader
  • 基于STM32F103的Bootloader程序,开发环境Keil5。本人编写的一个项目的软件的一部分,在STM32F103RC上运行。
  • 基于STM32编写BootLoader基础框架
  • STM32 Bootloader基于ymodem传输协议串口IAP升级详解

    千次阅读 多人点赞 2019-12-31 23:54:35
    预备知识 基于标准外设库(STM32F10x_StdPeriph_Lib_V3.5.0)的IAP升级相关资料可以...本文需要实现STM32Bootloader基于ymodem协议通过串口进行固件升级。 硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0
  • stm32f103RCT6 BOOTLOADER IAP程序在(0x8000000)地址, 经测试实现从IAP自动跳转到高地址APP(0x8003000)
  • STM32F030 HAL Bootloader

    2019-04-17 14:46:36
    STM32F030 IAP升级,参考ST官方例程修改为使用HAL库,采用Ymodem通信,关于Ymodem的说明手册在http://pauillac.inria.fr/~doligez/zmodem/ymodem.txt网站上可以查看。修改了一下官方EOT后不回复NAK的问题,上位机...
  • 本章主要使用汇编语言编写STM32F103(以下称为“该芯片”)的启动代码。具体结构如图: 启动模式  该芯片可以通过设置BOOT0和BOOT1两个引脚,选择不同的启动方式,正常情况下BOOT0=0,BOOT1=0(0为低电平)。...
  • 文章目录stm32 boot 程序编写IAP简介流程图ReadAppPro();Quit_IAP_Process(); 跳转到应用程序区APP 程序.APP 程序起始地址设置方法中断向量表的偏移量设置方法 stm32 boot 程序编写 IAP简介 IAP(In Application ...
  • STM32L151_IAP_Bootloader.rar

    2020-07-23 15:52:25
    本例程是编写STM32L151_IAP远程实际时的测试程序,已经实现串口接收、FLASH擦写、跳转到APP程序,希望对大家有所帮助。
  • stm32最简单的实现BootLoader

    万次阅读 多人点赞 2018-04-28 12:58:39
    BootLoader大家应该都知道是干什么的,简单的来说就是程序开始运行前的一段程序。 在成熟的产品中,通常都是采用BootLoader方式来升级产品的程序。也就是IAP升级。 在了解完基本的实现原理后,可以做到用上位机升级...
  • STM32 BOOTLOADER

    千次阅读 2019-01-20 09:51:14
    不需要拆机就能对产品进行固件升级是很多人想要的效果,不仅...下面来浅析STM32Bootloader设计。 首先谈谈stm32的ISP和IAP区别和联系。 ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程...
  • STM32单片机bootloader扫盲

    千次阅读 多人点赞 2021-10-21 22:25:29
    STM32单片机BootLoader扫盲 BootLoader和APP之间的关系 APP就是平时写的单片机上的应用程序,而BootLoader本质上和APP一样,也是平时写的应用程序。BootLoader只不过是拥有从外部接收数据,更新Flash(也就是APP),...
  • stm32 bootloader跳转

    千次阅读 2018-09-04 10:09:30
    stm32执行完loader程序后如何跳转到应用程序呢,一共有四件事要做: 第一,关闭外设中断,关闭外设时钟,失能外设功能,如果不关闭,跳转到app区后会产生各种奇怪的问题 第二,重设中断向量表位置,设置在app程序...
  • STM32CubeMX、TrueSTUDIO、J-Flash V6.32f 芯片:STM32L072KBUx 二、使用CubeMx新建工程与配置说明 使用CubeMX通过芯片型号新建工程。需要配置如下内容: 配置系统时钟 下载程序的SWD口 一个定时器(开启中断) 一...
  • Stm32 Bootloader整理

    千次阅读 2017-08-09 17:32:35
    Stm32 Bootloader整理 热度 2已有 1485 次阅读2015-4-26 17:41 | Cortex-M3, stm32bootloader 一. 基本概念 1.IAP IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在...
  • STM32 Bootloader原理和设计

    千次阅读 2017-07-18 16:44:57
    不需要拆机就能对产品进行固件升级是很多人想要的效果,不仅方便而且...下面来浅析STM32 Bootloader设计。 首先谈谈stm32的ISP和IAP区别和联系。 ISP(In-System Programming)在系统可编程,指电路板上的空白器
  • 关于Stm32 BootLoader其他博客有很多介绍,这里只做重点摘要的介绍并附带上Stm32F103C8的BootLoader和App工程供下载。 1、Stm32F103C8 64k Byte的Flash内存分配。一部分做BootLoader,一部分做用户(App)工程。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,285
精华内容 514
关键字:

stm32bootloader编写