STM32 IAP 固件升级设计/U盘升级固件

发布者:WanderlustHeart最新更新时间:2017-02-05 来源: eefocus关键字:STM32  IAP  固件升级设计  U盘升级固件 手机看文章 扫描二维码
随时随地手机看文章

固件升级的基本思路是: 将stm32 的flash划分为两个区域:

          1.Bootloader区:存放bootloader的代码,bootloader代码完成的主要功能就是,判断外部条件,如果需要更新固件,则从指定位置(外接的U盘?板子上的外置存储器如 SD卡,NandFlash等)读取bin文件,然后写入到stm32 Flash的APP区,完成后跳转到APP区执行更新过的代码; 如果不需要更新,则直接跳转到APP区执行主程序代码。

          2.APP区:存放应用程序代码,就是我们产品的固件了。

 

目做了两个升级方式,都是USB的:

          一个是USB host:开机进boot,boot检测是否有U盘插入,U盘中是否包含APP的bin文件,包含则更新并跳转到APP;           一个是USB device:在APP区,做了usb device的代码,将板上的nandflash作为U盘的存储器,通过USB线链接PC,则PC显示U盘,将APP的bin文件复制到U盘里,并设置一个标志文件,下次开机进boot会判断nandfalash里是否有需要更新的固件,如果有,则将nandflash里存放的APPbin文件写入stm32 flash的APP区,完成更新后跳转。

 

bootloader代码要点:

 

1. 需要包含USB Host和 nandflash以及  fatfs文件系统的驱动代码。(这部分是需要仔细研究做好的,就不多说了)

 

2.关于Bootloader区: 我使用stm32f429,bootlaoder代码编译下来有50K左右,所以使用flash 0x80000000  ~ 0x8000FFFF这块共64K的区域,注意Bootloader代码一定要从 flash的起始地址0x80000000开始,这样一开机就首先运行boot程序。

具体在keil 中的设置是   target中设置好flash的起始地址和size; debug中settings,flash选择1M的(我的429是1Mflash)然后在下面的开始和结束地址中输入正确地址;

 

3.关于APP区: 使用剩下的0x80010000~0x800FFFFF 区域,keil具体设置和2一样。

 

4.关于读取并写入bin文件到flash:  如上面所说,这个比较灵活,可以从外部U盘中读取bin文件到 内存buf然后写入flash,也可以从板上已有的外设存储器读取bin文件到内存buf然后写入flash,具体代码可以参考官方固件库中的例子。

 

5.关于跳转: 可以看到官方代码

 

pFunction Jump_To_Application;

uint32_t JumpAddress;

 

JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);

Jump_To_Application = (pFunction) JumpAddress;

/* Initialize user application's Stack Pointer */

 __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);

Jump_To_Application();

具体分析可以看网上别人的详细解释,这里我遇到的问题是:经常跳转之后就直接死机,可能有以下几种情况:

1. APP代码main函数中第一句必须要

 NVIC_SetVectorTable (NVIC_VectTab_FLASH, 0x10000);

__enable_irq();

将向量表偏移地址设置为我们的0x10000;

 

2.关于中断,可能跳转之前,某些外设中断是开启的,跳转之后,中断产生了,但是APP代码中没有处理对应该中断的中断处理函数,所以就直接死机了;

对应网上的一些方法是  跳转之前,关闭所有中断:  __disable_irq();

在APP中偏移地址设置完毕后,再次开启所有中断:    __enable_irq();

有些人发现跳入APP之后,很多中断都不响应了,可能就是跳转之前,关了中断但是APP中没有再次开启。

我一开始这样用,每次从U盘更新完固件之后跳转就死机了,从nandflash跳转就不会有问题,参考了一些网上的资料,

推测可能还是 __disable_irq()没有把USB中断关闭,或者关闭之后,USB的某个中断仍旧是置位的,APP中再次开启中断后,直接寻找USB中断服务程序,找不到就死机了。

这里为了更加稳妥,我决定在跳转之前,将所有boot中用到的外设都关闭,但是只用了一句

NVIC_DisableIRQ(OTG_FS_IRQn);

之后,就一切OK了。

 

但是建议大家在写boot的时候,跳转之前还是把所有用到的外设时钟关闭,中断也禁止。


关键字:STM32  IAP  固件升级设计  U盘升级固件 引用地址:STM32 IAP 固件升级设计/U盘升级固件

上一篇:Stm32 Bootloader整理
下一篇:STM8|STM32 看门狗使用

推荐阅读最新更新时间:2024-03-16 15:32

STM32串口唤醒STOP模式的实现
前言 STM32常见的低功耗模式有三种:睡眠模式、STOP模式以及待机模式,STM32L系列还有其他低功耗模式。这里主要讲的是STOP模式,STOP模式可以通过外部中断或事件唤醒,但是不能通过串口中断唤醒,因为串口中断本身不是外部中断,那么如何才能实现串口唤醒STOP模式呢? 因为我这里只是为了做验证,为了快速验证,我也就没有用RT-Thread的PM电源管理组件进入STOP模式,感兴趣的读者可以用RT-Thread的电源管理组件去实现进行STOP模式。 一、为什么要串口唤醒STOP模式? 想象一下,在某些场合,如果你有一个无线通信模块(例如ESP8266、SIM800C)和STM32通过串口发送AT命令来对接服务器实现
[单片机]
<font color='red'>STM32</font>串口唤醒STOP模式的实现
STM32开发环境】Linux下开发stm32(四) | 固件库工程开发
st官方固件库是在寄存器操作之上的,但是使用寄存器操作的话,需要注意的地方很多,需要对照参考手册一个一个赋值,稍有不慎便会出错,所以固件库将外设的初始化封装成初始化结构体,将外设的操作封装在函数中,将寄存器赋值的操作都封装起来,我们只需要调用API就可以,这样一来既提高了开发效率,也减少了代码量,如果还不能在MDK里熟练使用固件库编程,建议先补基础~接下来,我们在上一节寄存器工程的基础上,添加固件库,使用固件库进行开发。 1.创建固件库工程 将上一节的寄存器工程复制过来,改名为03-template-lib,然后再其中创建如下目录结构,便于工程管理: startup:存放启动文件 cmsis:stm32固件库中的cmsi
[单片机]
【<font color='red'>STM32</font>开发环境】Linux下开发<font color='red'>stm32</font>(四) | <font color='red'>固件</font>库工程开发
STM32时钟系统学习
时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。 下面是从网上找的一个STM32时钟框图,比《STM32中文参考手册》里面的是中途看起来清晰一些: 重要的时钟: PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚; 1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时
[单片机]
<font color='red'>STM32</font>时钟系统学习
STM32 FSMC学习笔记+补充(LCD的FSMC配置)
FSMC全称 静态存储器控制器 。 使用FSMC控制器后,可以把FSMC提供的FSMC_A 作为地址线,而把FSMC提供的FSMC_D 作为数据总线。 (1)当存储数据设为8位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b) 地址各位对应FSMC_A ,数据位对应FSMC_D (2)当存储数据设为16位时,(FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b) 地址各位对应FSMC_A ,数据位对应FSMC_D FSMC 包括4个
[单片机]
<font color='red'>STM32</font> FSMC学习笔记+补充(LCD的FSMC配置)
STM32对于U盘访问的硬件/软件实现
一些应用中,涉及到对存储设备的数据访问,例如USD卡、U盘。具备USB OTG控制器的STM32,可以实现对U盘访问的支持。本文介绍STM32对于U盘访问的硬件/软件实现。介绍如何利用STM32CubeMX,一步一步实现STM32访问U盘。仅需简单的几个步骤, 实现U盘访问的应用开发。 MSC类简介 MSC (Mass Storage Class) 是USB规范提供的一种USB大容量存储设备类,允许一个USB接口的设备与USB主机相连接,以便在两者之间传输文件。USB MSC传输协议分为CBI (Control / Bulk / Interrupt) 和 BOT (Bulk-only Transfer)。BOT协议在不影响功能
[单片机]
<font color='red'>STM32</font>对于<font color='red'>U盘</font>访问的硬件/软件实现
关于STM32的基础知识
本文参考:原子和野火STM32教学视频 1、STM32是“意法半导体”生产的基于“ARM公司Cortex-M3内核”的32位高性能MCU。 ST----意法半导体,即SOC厂商(芯片制造商)。ARM----IP厂商,负责芯片内核设计的公司 M-----Microelectronics的缩写,指微控制器。微处理器通常指计算机CPU。 32------指它是一个32位的微控制器。 注意:51单片机是5V工作电压而STM32是3.3V工作电压 2、STM32和ARM7的关系 ARM7和STM32的内核都是由ARM公司设计的。ARM7内核采用的是冯诺依曼结构(也就是计算机CPU采用的结构)而STM32采用的是哈佛结构。STM32是
[单片机]
STM32中将常量存储在FLASH中(CONST关键字)
今天在写程序时,想把一个字符串常量存储在STM32的FLASH中,看了一会儿别人的例子程序,知道是用const这个关键字,但第一次没有成功。 前提:我用的是STM32F103ZE单片机, FLASH的存储范围为:0x08000000~0x0807ffff, RAM的存储范围:0x20000000~0x200007ff 失败例子: #include..... 。。。。 int main(void) { u8 const c = somen ; while(1); } 通过调试,查看c 数组的存储位置为0x200*****的位置,常量仍旧处在RAM中。 成功的例子: #include..... u
[单片机]
STM32开发笔记93: SX1268驱动程序的移植1
单片机型号:STM32L053R8T6 本文详述将SX1268官方驱动程序,移植到C++程序设计框架的方法。 1、文件结构 在系统中加入以下文件。 2、屏蔽和硬件相关的数据类型 sx126x.h文件,屏蔽以下语句。暂时屏蔽,后续需要解决。 typedef struct SX126x_s { // Gpio_t Reset; // Gpio_t BUSY; // Gpio_t DIO1; // Gpio_t DIO2; // Gpio_t DIO3; // Spi_t Spi; PacketParams_t PacketParams; PacketStatus
[单片机]
<font color='red'>STM32</font>开发笔记93: SX1268驱动程序的移植1
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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