第30章 STM32F429的系统bootloader之串口IAP固件升级

发布者:guqian999最新更新时间:2022-04-06 来源: eefocus关键字:STM32F429  串口IAP  固件升级 手机看文章 扫描二维码
随时随地手机看文章

30.1 初学者重要提示

学习本章节前,务必优先学习第28章。


本章用到的相关软件和文档下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=96573 。


本章节的串口IAP下载软件使用STM32CubeProg,此软件实现了之前的DfuSe,STLINK小软件和Flashloader三合一,并且支持外部EEPROM,NOR Flash,SPI Flash,NAND Flash等烧写,也支持OTA编程。


使用系统bootloader做串口IAP升级时,MicroUSB接口不要接线到电脑端,因为这会导致系统bootloader工作在USB DFU模式,无法再使用串口IAP。


30.2 跳转到系统bootLoader的程序设计

程序设计如下,基本是按照第28章3.2小节的方法进行设计


1.    /*

2.    ******************************************************************************************************

3.    *    函 数 名: JumpToBootloader

4.    *    功能说明: 跳转到系统BootLoader

5.    *    形    参: 无

6.    *    返 回 值: 无

7.    ******************************************************************************************************

8.    */

9.    static void JumpToBootloader(void)

10.    {

11.        uint32_t i=0;

12.        void (*SysMemBootJump)(void);        /* 声明一个函数指针 */

13.        __IO uint32_t BootAddr = 0x1FF09800; /* STM32F4的系统BootLoader地址 */

14.    

15.        /* 关闭全局中断 */

16.        DISABLE_INT(); 

17.    

18.        /* 关闭滴答定时器,复位到默认值 */

19.        SysTick->CTRL = 0;

20.        SysTick->LOAD = 0;

21.        SysTick->VAL = 0;

22.    

23.        /* 设置所有时钟到默认状态,使用HSI时钟 */

24.        HAL_RCC_DeInit();

25.    

26.        /* 关闭所有中断,清除所有中断挂起标志 */

27.        for (i = 0; i < 8; i++)

28.        {

29.            NVIC->ICER[i]=0xFFFFFFFF;

30.            NVIC->ICPR[i]=0xFFFFFFFF;

31.        }    

32.    

33.        /* 使能全局中断 */

34.        ENABLE_INT();

35.    

36.        /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */

37.        SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

38.    

39.        /* 设置主堆栈指针 */

40.        __set_MSP(*(uint32_t *)BootAddr);

41.        

42.        /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */

43.        __set_CONTROL(0);

44.    

45.        /* 跳转到系统BootLoader */

46.        SysMemBootJump(); 

47.    

48.        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */

49.        while (1)

50.        {

51.    

52.        }

53.    }


这里把程序设计中的几个关键地方做个说明:


  第12行,声明一个函数指针。

  第13行,这个要特别注意,F4的系统Bootloader地址。

  第19到21行,设置滴答定时器到复位值。

  第24行,此函数比较省事,可以方便的设置F4所有时钟到复位值,内部时钟使用HSI。

  第27到31行,清除所有中断挂起标志并关闭中断,这里是直接通过一个for循环设置了NVIC所有配置位,共8组。

  第37行,将系统bootloader的地址映射到0x0000 0000。这点非常重要,根本原因是F4的系统bootloader要从0x00000000地址读取中断向量。

  第40行,将系统bootLoader的中断复位服务程序的入口地址赋给第12行声明的函数,用户执行这个函数时,就会直接跳转过去。

  第43行,设置主堆栈指针位置,即系统bootloader的首地址存储的就是栈地址。

  第46行,这个设置在RTOS应用程序中比较重要,因为基于Cortex-M内核的RTOS任务堆栈基本都是使用线程堆栈指针PSP。但系统bootLoader使用的是主堆栈指针MSP,所以务必要设置下,同时让M内核工作于特权级。此寄存器的作用:

第46行,跳转到系统BootLoader。


30.3 STM32CubeProg的安装说明

STM32CubeProg的安装比较简单,如果大家的电脑中缺少JAVA环境,会提示安装,按照提示操作即可。


这里特别注意USB DFU驱动的安装,如果大家的电脑上安装了DfuSe软件,那边板子工作在系统bootLoader模式时,电脑端的设备管理器识别出来的标识是这样的:

如果用STM32CubeProg的话,务必要将此驱动删掉,鼠标右击此标识,选择卸载,弹出如下对话框:

卸载完毕后,重启电脑,然后运行STM32CubeProg安装目录里面的STM32Bootloader.bat即可,最后插上设备就可以正常识别了。识别后的标识:

30.4 STM32CubeProg的程序下载说明

这里把两种下载方式都做个说明,一种是设置外部bot引脚进行下载,另一种是设置程序跳转到系统botloader进行下载。


30.4.1 选择好用的串口线

(注:MicroUSB接口不要接线到电脑端,因为这会导致系统bootloader工作在USB DFU模式,无法再使用串口IAP)


选择好用的USB线很重要,比如我们开发板赠送的那根USB转RS232串口线是不可以用在这里做串口IAP的,这根线只能用于一般的串口通信和串口打印功能。

当前我这里是用的我们H7-TOOL的USB转TTL输出,注意交叉方式连接,即RX接TX,TX接RX。


GNG接GND。

注,我这里没有接共地线,推荐大家接上,3.3V可以不接。


30.4.2 设置boot引脚跳转到系统botLoader

第1步:板子上电前按住右下角的BOOT引脚。


第2步:板子上电3秒左右,松手。

在电脑端设备管理器就可以看到已经识别出来:

30.4.3 应用程序跳转到系统bootloader

应用程序跳转到系统bootLoader比较方便,无需用户操作外置的boot引脚了,只需调用本章第2小节的程序就可以跳转。本章配套的例子是用户按下按键K1后执行跳转程序,大家可以根据需要实现各种触发跳转的方式。跳转成功后,在电脑端设备管理器里面也会看到bootloader标识:

30.4.4 STM32CubeProg下载程序设置

识别成功后就可以下载程序了。


  第1步,选择UART方式,配置使用的串口号,串口波特率115200和偶校验,点击Connect按钮。

识别成功后的效果如下:

第2步,添加要下载的hex文件,勾选需要设置的选项,点击启动编程。

Start address选项不填的话,默认会下载到内部Flash的首地址,保险起见,大家也可以填上首地址0x0800 0000,或者其它要下载的地址。


Run after programming选项可以根据需要勾上,如果勾上此选项后,下载完毕程序后,会自动断开连接,并弹出一些列窗口,最终弹出下面这个窗口:

弹出这个窗口并不是表示下载失败了,而是下载完成后退出了系统bootloader,启动用刚刚下载的程序了。


第3步,完成下载后的效果如下:

下载完成后板子重新上电就可以看到程序已经成功下载了。


30.5 串口方式系统Bootloader驱动移植和使用

系统bootloader的移植比较简单,仅需添加本章第2小节的程序到自己工程里面即可。里面有个开关中断API,是在bsp.h文件里面定义的:


/* 开关全局中断的宏 */

#define ENABLE_INT()    __set_PRIMASK(0)    /* 使能全局中断 */

#define DISABLE_INT()    __set_PRIMASK(1)    /* 禁止全局中断 */

30.6 实验例程设计框架

通过程序设计框架,让大家先对配套例程有一个全面的认识,然后再理解细节,本次实验例程的设计框架如下:

第1阶段,上电启动阶段:


这部分在第14章进行了详细说明。

  第2阶段,进入main函数:


  第1部分,硬件初始化,主要是HAL库,系统时钟,滴答定时器和LED。

  第2部分,应用程序设计部分,K1按键按下后跳转到系统bootloader。。

30.7 实验例程说明(MDK)

配套例子:


V6-010_基于系统bootloader的串口IAP方式固件升级


实验目的:


学习基于系统bootloader的串口IAP方式固件升级。

实验内容:


STM32的系统存储区自带bootLoader,可以方便的实现串口,I2C,CAN,SPI,USB等接口方式的程序升级。

如果使用系统bootLoader支持的接口升级方式,基本就不需要用户自己做bootLoader了。

除了通过boot引脚控制启动地址,也可以直接从应用程序里面跳转到系统存储区。

实验操作:


K1键按下,跳转到系统BootLoader。

上电后串口打印的信息:


波特率 115200,数据位 8,奇偶校验位无,停止位 1。

程序设计:


  系统栈大小分配:

  硬件外设初始化


硬件外设的初始化是在 bsp.c 文件实现:


/*

*********************************************************************************************************

*    函 数 名: bsp_Init

*    功能说明: 初始化所有的硬件设备。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。只需要调用一次

*    形    参:无0

*    返 回 值: 无

*********************************************************************************************************

*/

void bsp_Init(void)

{

    /* 

       STM32H429 HAL 库初始化,此时系统用的还是F429自带的16MHz,HSI时钟:

       - 调用函数HAL_InitTick,初始化滴答时钟中断1ms。

       - 设置NVIV优先级分组为4。

     */

    HAL_Init();


    /* 

       配置系统时钟到168MHz

       - 切换使用HSE。

       - 此函数会更新全局变量SystemCoreClock,并重新配置HAL_InitTick。

    */

    SystemClock_Config();


    /* 

       Event Recorder:

       - 可用于代码执行时间测量,MDK5.25及其以上版本才支持,IAR不支持。

       - 默认不开启,如果要使能此选项,务必看V5开发板用户手册第8章

    */    

#if Enable_EventRecorder == 1  

    /* 初始化EventRecorder并开启 */

    EventRecorderInitialize(EventRecordAll, 1U);

    EventRecorderStart();

#endif

    

    bsp_InitKey();        /* 按键初始化,要放在滴答定时器之前,因为按钮检测是通过滴答定时器扫描 */

    bsp_InitTimer();      /* 初始化滴答定时器 */

    bsp_InitUart();        /* 初始化串口 */

    bsp_InitExtIO();    /* 初始化扩展IO */

    bsp_InitLed();        /* 初始化LED */    

    BEEP_InitHard();    /* 初始化蜂鸣器 */

}

  主功能:


主程序实现如下操作:


  启动一个自动重装软件定时器,每100ms翻转一次LED2。

  K1键按下,跳转到系统BootLoader。

/*

*********************************************************************************************************

*    函 数 名: main

*    功能说明: c程序入口

*    形    参: 无

*    返 回 值: 错误代码(无需处理)

*********************************************************************************************************

*/

int main(void)

{

    uint8_t ucKeyCode;    /* 按键代码 */


    

    bsp_Init();        /* 硬件初始化 */

    PrintfLogo();    /* 打印例程名称和版本等信息 */

    PrintfHelp();    /* 打印操作提示 */

    

    bsp_StartAutoTimer(0, 100);    /* 启动1个100ms的自动重装的定时器 */

    

    while (1)

    {

        bsp_Idle();        /* 这个函数在bsp.c文件。用户可以修改这个函数实现CPU休眠和喂狗 */


        /* 判断定时器超时时间 */

        if (bsp_CheckTimer(0))    

        {

            /* 每隔100ms 进来一次 */  

            bsp_LedToggle(2);

        }


        /* 按键滤波和检测由后台systick中断服务程序实现,我们只需要调用bsp_GetKey读取键值即可。 */

        ucKeyCode = bsp_GetKey();    /* 读取键值, 无键按下时返回 KEY_NONE = 0 */

        if (ucKeyCode != KEY_NONE)

        {

            switch (ucKeyCode)

            {

                case KEY_DOWN_K1:            /* K1键按下,K1键按下,跳转到系统BootLoader */

                    JumpToBootloader();

                    break;

                    

                default:

                    /* 其它的键值不处理 */

                    break;

            }

        }

    }

}

30.8 实验例程说明(IAR)

配套例子:


V6-010_基于系统bootloader的串口IAP方式固件升级


实验目的:


学习基于系统bootloader的串口IAP方式固件升级。

实验内容:


STM32的系统存储区自带bootLoader,可以方便的实现串口,I2C,CAN,SPI,USB等接口方式的程序升级。

如果使用系统bootLoader支持的接口升级方式,基本就不需要用户自己做bootLoader了。

除了通过boot引脚控制启动地址,也可以直接从应用程序里面跳转到系统存储区。

实验操作:


K1键按下,跳转到系统BootLoader。

上电后串口打印的信息:


波特率 115200,数据位 8,奇偶校验位无,停止位 1。


程序设计:


  系统栈大小分配:

  硬件外设初始化


硬件外设的初始化是在 bsp.c 文件实现:


/*

*********************************************************************************************************

[1] [2]
关键字:STM32F429  串口IAP  固件升级 引用地址:第30章 STM32F429的系统bootloader之串口IAP固件升级

上一篇:第31章 STM32F429的SPI总线基础知识和HAL库API
下一篇:第29章 STM32F429的系统bootloader之USB DFU方式固件升级

推荐阅读最新更新时间:2024-11-16 21:49

第9章 STM32F429重要知识点数据类型,变量和堆栈
9.1 初学者重要提示 1、如果对C语言不熟练的话,可以阅读C语言书:C Primer Plus(第五版)中文版.pdf 论坛下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=91219。 2、为了更好的学习本章知识点,可以看之前做的视频教程第10章,针对H7也将在今年发布视频教程: http://www.armbbs.cn/forum.php?mod=viewthread&tid=15408 。 9.2 数据类型 了解数据类型之前要对ANSI C和ISO C的发展史有个了解,特别是C89,C99和C11的由来。 9.2.1 ANSI C和ISO C历史
[单片机]
第9章 <font color='red'>STM32F429</font>重要知识点数据类型,变量和堆栈
STM32F429 >> 6. RCC-使用HSE, HSI 配置时钟
本工程板级支持包文件适用于野火stm32f429 开发板。 编程要点 开启HSE/HSI,并等待HSE/HSI 稳定 设置AHB, APB2, APB1 的预分频因子 设置PLL 的时钟来源,设置VCO 输入时钟分频因子PLL_M,设置VCO 输出时钟倍频因子PLL_N,设置PLLCLK 时钟分频因子PLL_P,设置OTGFS, SDIO, RNG 时钟分频因子PLL_Q 开启PLL,并等待PLL 稳定 把PLLCLK 切换为系统时钟SYSCLK 读取时钟切换状态位,确保PLLCLK 被选为系统时钟 bsp_clk.c /** ************************************************
[单片机]
<font color='red'>STM32F429</font> >> 6. RCC-使用HSE, HSI 配置时钟
STM32F429 >> 20. CAN 通讯(Code)
本工程配置CAN 为回环模式。 编程指南 1. can 基本模式配置; 2. can 筛选器配置; 3. 发送数据结构体配置并发送; 4. 接收数据结构体配置并接收; 若采用中断进行数据读取,则加入中断配置,并在中断中进行数据接收即可。 bsp_can.h /** ****************************************************************************** * @file bsp_can.h * @author Waao * @version V1.0.0 * @date 21-Feb-2019 * @brief This file co
[单片机]
STM32F429 >> 20. CAN 通讯(二)
STM32 的 CAN 外设简介 STM32 的芯片中具有 bxCAN 控制器 (Basic Extended CAN),它支持 CAN 协议 2.0A 和2.0B 标准。 该 CAN 控制器支持最高的通讯速率为 1Mb/s;可以自动地接收和发送 CAN 报文,支持使用标准 ID 和扩展 ID 的报文;外设中具有 3 个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间;具有 2 个 3 级深度的接收 FIFO,可使用过滤功能只接收或不接收某些 ID 号的报文;可配置成自动重发;不支持使用 DMA 进行数据收发。 STM32 的 CAN 架构剖析 STM32 的有两组 CAN 控制器,其中 CAN1 是主
[单片机]
<font color='red'>STM32F429</font> >> 20. CAN 通讯(二)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved