OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3659|回复: 0

STM32L4,实现APP进入官方ISP升级模式,无需外部设置boot0

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-4-28
在线时间
3 小时
发表于 2021-7-3 11:29:09 | 显示全部楼层 |阅读模式
STM32L4,APP进入官方ISP升级模式,实现usb dfu升级

最近项目要用到固件升级,自己写bootloader还要调试,实现太慢。搜集资料后决定用st官方的isp升级方式。ST官方的isp升级,默认实现方式是通过更改BOOT0引脚为高电平、BOOT1为低电平,芯片复位后进入系统存储区启动,进入官方的ISP模式。详见AN2606.

经各位网络大神的资料汇总后,可通过代码方式,app接收到特殊指令后,直接跳入ISP模式,无须更改外部BOOT引脚。这个方式很适合产品组装后升级。
官方isp支持多种升级方式,常用的有uart、usb(dfu)、i2c等,具体参考AN2606文档,本次使用USB DFU升级方式。


准备工具:




ST官方编程器:STM32CubeProgrammer
下载地址:STM32CubeProg - 用于STM32产品编程的STM32CubeProgrammer软件 - STMicroelectronics
STM32L4开发板

上代码:
/*
2.    ******************************************************************************************************
3.    *    函 数 名: JumpToBootloader
4.    *    功能说明: 跳转到系统BootLoader
5.    *    形    参: 无
6.    *    返 回 值: 无
7.    ******************************************************************************************************
8.    */
void JumpToBootloader(void)
{
                uint32_t i=0;
                void (*SysMemBootJump)(void);        /* 声明一个函数指针 */
                __IO uint32_t BootAddr = 0x1FFF0000; /* STM32L4的系统BootLoader地址 */

                /* 关闭全局中断 */
                __disable_irq();  /* 禁止全局中断*/


                /* 关闭滴答定时器,复位到默认值 */
                SysTick->CTRL = 0;
                SysTick->LOAD = 0;
                SysTick->VAL = 0;

                /* 设置所有时钟到默认状态,使用HSI时钟 */
                HAL_RCC_DeInit();
                /* 关闭所有中断,清除所有中断挂起标志 */
                for (i = 0; i < 8; i++)
                {
                        NVIC->ICER=0xFFFFFFFF;
                        NVIC->ICPR=0xFFFFFFFF;
                }
                /* 设置系统flash memory重定向到0x000000,也可通过单片机复位后通过外部boot0/1自动获取 */
                /*不同mcu寄存器不同,注意查看用户手册,stm32l4用此寄存器*/
                SYSCFG->MEMRMP = 0x01;


                /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
                SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));

                /* 设置主堆栈指针 */
                __set_MSP(*(uint32_t *)BootAddr);

                /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
                __set_CONTROL(0);

                /* 跳转到系统BootLoader */
                SysMemBootJump();

        /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
        while (1)
        {

        }
}


几个注意点:
1、BootAddr 的地址设置。查看手册里,system memory首地址即可。

2、系统flash memory重定位到0,不同型号mcu,寄存器操作不同,参考用户手册

SYSCFG->MEMRMP = 0x01;
3、使用USB DFU时,app执行跳转到ISP后,电脑连接板子的USB,电脑上显示一个STM32 BOOTLOADER的设备,如没有或驱动不正确,
由于STM32CubeProgrammer在安装过程中会自动安装驱动,尝试重装此软件或单独更新驱动。

4、电脑上正常显示后,就可以用STM32CubeProg下载固件了。

软件下载设置如下:




下载完成后,板子重新上电,即可自动进入新的APP。

参考:
关于STM32如何在应用程序中跳转到ISP固件升级_cooper1024的博客-CSDN博客
【STM32H7教程】第68章 STM32H7的系统bootloader之USB DFU方式固件升级 - 安富莱电子 - 博客园 (cnblogs.com)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 08:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表