STM32-OTA升级-基于STM32CubeMX+STM32F103(一)基础知识

这篇具有很好参考价值的文章主要介绍了STM32-OTA升级-基于STM32CubeMX+STM32F103(一)基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 引言

对于一个项目而言,往往将远程升级作为程序的最后一步(基本所有功能都开发完成之后再考虑)。但是在我看来,我们在写单片机的程序之前,就要规划好FLASH的使用情况,因为code、全局变量等重要信息都是放在FLASH(常说的闪存)中的,SRAM是程序运行时的存放位置。

  • 关于OTA部分已经有很多前辈分享过经验了,这篇博客我只是从我个人的角度以及做过的实验出发,将自己学到的一些经验和收获做一下分享。
  • 后面我也想把 STM32CubeMX + KEIL + 常见外设使用 总结成一个专栏,记录下自己踩的坑,帮助大家少走点弯路。

关于OTA参考的博客、视频如下(感谢前辈们):

  • STM32CubeMx开发之路—在线升级OTA
  • STM32F103的存储器映射&寄存器映射
  • 正点原子-第197讲 提高篇 IAP
  • 本篇博客采用的单片机型号为:STM32F103ZET6;软件IDE: keil + STM32CubeMX

1 预备知识

在讲述OTA之前,我们必须要知道STM32存储器映射、程序是怎样开始运行的、串口的IAP是如何实现的,下面我们开始解释(有些借鉴了正点原子网课老师的):

1.1 STM32存储器映射:

此知识点可参考下面的网站(写的都非常好):

  • STM32单片机不同boot模式的本质
  • STM32F1(Cortex M3内核)存储器映射

对于内核为ARM Cortex-M3的单片机,其存储器映射如下图所示:
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

M3内核是上述的那样,供给不同厂家进行开发,比如以ST公司的STM32F1系统为例,其规定的存储器映射关系为:
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机
我们的代码以及全局变量的一些值就是放在FLASH中最下面的那部分,
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

另外需要注意的一些点:
(1)32为单片机可以有32根地址线(每根导线:0 or 1), 所以内存2^32 = 4GB,故寻址范围是0x0000 0000 - 0xFFFF FFFF;
(2)单片机内存访问的地址是按字节编址的(而不是bit);

1.2 程序是如何开始执行?

1、问题1:我们在看程序的时候是从main函数开始看起的,但是单片机是如何从main开始运行的呢?
答:STM32的分为3种启动模式:

stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

我们需要把这两个图对照着看:

  • 根据硬件所接的电平确定启动模式(我们平时的boot1和boot0在硬件中都是接地的):
    • 主闪存存储器启动:从内置的FLASH中启动,我们平时通过JLink或者SWD下载程序时就是现在到这里面 (直接在Keil IDE里面下载)
    • 系统存储器启动:从系统存储器(0x1FFF F000 ~ 0x1FFF F7FF,就是那个2K的厂家的bootloader程序),ST自带的这个bootloader引导程序可以帮助用户通过串口下载到系统的FLASH中;
    • 片上SRAM启动:因为本身它是没有存储能力的,所以一般用于程序调试。

2、问题2:说到这个地方大家可能还会有一些疑问:对于Block 0 中的FLASH或系统存储器别名区这个是啥,怎么给他分配那么大的内存?

参考: 基于STM32从零写操作系统系列—bootloader

  • 这段区域在ST提供的数据手册中表示Boot MemorySpace(Aliased to Flash or systen memory depending onBOOT pins),注意这块区域是预留的,不存数据,在不同的启动模式下,这块区域会被映射到其他区域:
    • 只有SRAM、主闪存存储器、系统存储器是真实存在的实体,而Aliased memory并不是存储器,它只是一个地址空间,根据不同的BOOT启动方式,系统将另外三个映射过来。
    • 例如,如果BOOT方式是从【Main Flash memory】启动,则CPU访问0x0000 0000处的一个字就等于访问0x0800 0000处的一个字,访问0x0000 0004处的一个字节就等于访问0x0800 0004处的一个字。。。所以从本质上来说,无论哪种启动模式,CPU总是在0x00000000处找到中断向量表,取出向量表的第一元素(32bits)作为MSP(main stack pointer)的值, 取出第二个元素(32bits)作为PC(程序计数器)寄存器的值,而中断向量表的第二个元素总是复位(Reset)异常的中断处理函数,因此CM3单片机上电后总是会先执行Reset_Handler函数。三种启动模式只是将各自存储空间映射到地址 0x0000 0000 。也并不是将实际存储器的内容拷贝到【Aliasd memory】,而是【Aliasd memory】是对应存储器的一个别名,访问【Aliasd memory】就等价于访问他们。(https://blog.csdn.net/luliplus/article/details/124392543)
    • 中断向量表到底在哪里,你说在0x00000000处绝对没问题,而当BOOT方式选择从Main Flash memory启动时,你说在0x08000000也是没问题的。

在实际运行过程中,程序在偏移到main函数之前做了很多操作,所以我们需要了解STM32的启动过程:
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

3、问题3:那能不能用程序说明,系统就是这样运行的呢?
答:其启动的流程如下图所示:
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机
如何会到达main函数那里?
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机
中断服务函数定义:
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

堆栈定义:

  • 堆(Heap):程序员分配和释放,如malloc、calloc、realloc等;
  • 栈(Stack):编译器自动分配和释放,存放函数参数和局部变量等;
    stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

故整体的步骤如下所示:
单片机复位后,初始化堆栈指针MSP = _initial_sp, PC = Reset_Handler; 然后执行Reset_Handler函数,在这个函数中配置系统时钟,最后调用C库函数__main(main函数并不是main函数)初始化堆栈,从而最终调用用户编写的main函数
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

1.3 什么是IAP(In Application Programming, 在应用编程)

使用用户的应用程序(自定义bootloader程序)对FLASH进行烧录。该应用程序需要通过某种通信接口对闪存进行烧录,通常用于远程升级等。在无IAP程序升级时,STM32程序启动过程如下图所示:
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

有了IAP部分后,STM32启动过程如下图所示,一开始系统还是会执行到main函数上面,其中IAP的部分是指 :在main函数中开始接收新文件,并把新的文件存到FLASH的其他位置。新程序的复位中断向量需要进行偏移中断向量表的起始地址,从而重新执行上图中的过程。但是这是需要注意的是如果发生了中断请求还是跳转到原来为偏移的中断向量表中,然后再根据我们设定的中断向量表的偏移实现中断。
stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

就是需要自己写bootlaoder程序,然后还有app1程序。

  • bootloader程序中:跳转代码
  • app1程序中:中断向量表偏移
1.4 OTA升级

对于OTA起始就是IAP的升级版,思路基本相同,下面这位前辈已经讲的非常清楚了,请参考:

  • STM32CubeMx开发之路—在线升级OTA

他是采用了Ymodem串口传输协议实现升级,当然我们可以采用Wi-Fi,蓝牙等各种协议,只要能收到文件并将其写道FLASH中即可。

推荐给大家的学习方法是:先去上面这个博客里面看懂OTA的原理,然后跟着我下面的博客去做实验验证即可。文章来源地址https://www.toymoban.com/news/detail-763998.html

2 后续

  • 小张也快到找工作的时间,前面断更时间太久了(后台有些私信因为太忙忘记回了),从今天开始认真整理,希望和明年秋招有意向嵌入式软开的小伙伴们一起努力,小张也申请了一个博客网站:格子格鸽的个人博客,后面再CSDN和博客网站上会同步更新的。
  • 在这个网站我会分享的技术栈知识(嵌入式软件开发岗位)
    • C语言基础(小张还没考计算机二级,今年9月份必拿下);
    • C++基础(后面的算法选的语言);
    • 408: 计算机网络(结合LWIP来学习);操作系统(结合freeRTOS、MIT 6.S081课程);数据结构与算法(看B站视频和刷题);计算机组成原理(ARM Cortex-M3、ARM Cortex-M4内核相关)
    • STM32外设和Cortex内核相关的东西,结合小张看到的面经
    • 项目相关(最近对很想玩墨水瓶等东西,会分享做一些好玩的小东西),做一些电子人专属浪漫的事情。
    • 个人的技术周总结、月总结等。
  • 现在整体形势确实不好,我非常理解大家的焦虑因为很多时候我也是这种状态,认识我觉着我们还是要把心沉下来,脚踏实地,当我们把一个一个小的点做好,结果不会差的。我老师经常告诫我的一句话分享给大家“不要太看重一天内做的事情,但也不要忽略1个月能做的事”。小张希望自己和小伙伴们一起坚持、一起成长,不断成长为一个技术更好、视野更广阔的嵌入式软件开发工程师
  • 我的博客是:[格子格鸽的个人博客](https://xichenzhang.com/)
    stm32 ota,1-STM32单片机,stm32,嵌入式硬件,单片机

到了这里,关于STM32-OTA升级-基于STM32CubeMX+STM32F103(一)基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于STM32F103ZET6使用STM32CubeMX配置FSMC模块驱动LCD屏(基于正点原子历程)

    在学习STM32的过程中,刚好学到了LCD屏,我使用的是STM32F103ZET6,屏幕是正点原子的。但是在我自己新建工程点亮显示LCD屏时遇到了很多问题。解决之后分享在此,希望能帮助到遇到此困惑的朋友。 想要快速驱动LCD屏请直接跳转到CubeMX配置 FSMC全名叫可变静态存储控制器(Fle

    2024年02月15日
    浏览(58)
  • gd32f103vbt6 串口OTA升级5-combin部分

    本文主要是bin文件的组成进行一些简单介绍,方便理解升级的过程。 2.1 rk3399cpu+gd32f103 2.2 连接方式:串口(115200,8N1)或者iic(本文没有介绍iic) 3.1 单片机端分两个部分:iap(用于升级)和app(自己的应用)部分(这两个部分本文不做介绍)。 3.2 linux端做一个升级的app软件

    2024年02月16日
    浏览(56)
  • gd32f103vbt6 串口OTA升级3-linux端的部分

    本文主要是对linux端升级单片机程序的功能部分做一些介绍,包括一些软件流程。 2.1 rk3399cpu+gd32f103 2.2 连接方式:串口(115200,8N1)或者iic(本文没有介绍iic) 3.4.1  0 ~(0x5c00-1) : iap程序区,用于存放iap程序 3.4.2  0x5c00~(0x6000-1) : 这个1k用于存放一些标志位,以及程序的

    2024年02月17日
    浏览(70)
  • STM32-02-STM32基础知识

    STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片,而 Cortex M内核 使用的是 ARM v7-M架构 ,是为了替代老旧的单片机而量身定做的一个内核,具有低成本、低功耗、实时性好、中断响应快、处理效率高等特点。 架构 、 内核 、 芯片 的关系: 架构 : (ARMv7-M)

    2024年02月03日
    浏览(41)
  • 2.基于正点原子STM32F103的定时器中断实验(HAL库实现)(cubeMX)

      基本上每一款MCU都会配备定时器这个外设,STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 同样,STM32F1系列的定时器功能也很强大,包括: TIM1和TIM8两个高级定时器; TIM2~TIM5是个通用寄存器; TIM7,TIM8,两个基本定时器。 由于本次实验适用于新手入门

    2023年04月26日
    浏览(162)
  • 【STM32】基础知识 第二课 初识 STM32

    ARM 公司: 只做内核设计和 IP 授权, 不参与芯片设计. 对比项 Cortex-A (Application) Cortex-R (Real-time) Cortex-M (Microcontroller) 特点 高时钟频率, 长流水线, 高性能 较高时钟频率, 较长的流水线, 实时性强 时钟频率较低, 通常较短的流水线, 超低功耗 应用场景 移动计算, 智能手机, 平板电脑

    2024年02月02日
    浏览(45)
  • 【STM32】基础知识 第五课 C 语言基础知识

    stdint.h 是从 C99 中引进的一个标准 C 库的文件. 路径: “D:MDK5.34ARMARMCCinclude” 运算符 含义 运算符 含义 按位与 ~ 按位取反 | 按位或 左移 ^ 按位异或 右移 按位与: num1 运算符 num2 结果 0 0 0 1 0 0 0 1 0 1 1 1 按位或: num1 运算符 num2 结果 0 | 0 0 1 | 0 1 0 | 1 1 1 | 1 1 按位异或: num1 运算符

    2024年02月13日
    浏览(74)
  • STM32 OTA远程升级

    前言:OTA全称是over the air,主要应用于物联网设备作为更新代码使用,其原理在不同芯片上相通,应用较为广泛。 一、OTA硬件组成 ​ 对于OTA硬件来讲,常用的硬件组成是无线芯片+MCU,常用的无线模块有WIFI、4G、LORA甚至是蓝牙等具有无线传输功能的设备,MCU则是例如51,STM3

    2024年02月11日
    浏览(47)
  • 使用stm32进行ota升级

    主要方案: 1、硬件方案:只使用mcu内部flash,没有外置flash。 2、数据传输协议:ymodem,如果不了解ymodem值得去了解下。 3、bootloader和app存放方案:将mcu内部flash分为两块内存,分别存放bootloader和app。 4、ota流程:使用uart进行数据更新,并运行新的程序。 实施: 1、下载“S

    2024年02月13日
    浏览(37)
  • stm32中断的基础知识

    某些事件可能需要CPU暂停目前的程序优先处理 实现CPU暂停当前的程序并优先处理某一事件的机制称作中断 处理这一事件的程序叫做中断服务程序(Interrupt Handler) 中断的硬件实现 内部或外部信号产生中断 —程序跳转到某一特定地址(中断向量) —程序从中断向量跳转到对

    2023年04月24日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包