0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

YTM32B1MD1微控制器的boot swap机制和用法

安芯教育科技 来源:安德鲁的设计笔记本 2024-07-25 10:39 次阅读

Introduction

Pricinple & Machenisim

Application

基本的boot swap用例

不更新bootloader的情况

更新bootloader的情况

Conclusion

Introduction

客户在开发量产型的ECU软件时,大多会考虑实现OTA(在线更新)的功能,方便在将ECU设备装车之后,可以利用通信过程更新固件。OTA的实现技术中,为了提升更新过程的安全性,避免在更新过程中因意外中断导致整个ECU软件系统崩溃,通常会考虑备份更新的方式,如果本次更新固件的过程被意外中断,MCU仍可启动至最近一次能够正常运行的固件中,故而在MCU的片内flash中实际会存放至少两份程序,A程序和B程序。

这两份程序存放在不同的存储区,在创建这些application程序时,需要分别调整linker地址,让A程序和B程序映射到指定对应不同的地址区才能正常运行。芯片在上电启动后进入bootloader,经过信息安全检查、完整性检查、有效性检查等一些列判定条件之后,有选择地跳转到存放在不同地址的application程序。而在更新程序的时候,也要分别更新不同区域的程序。

为了简化开发者和用户区分application程序的A / B版本,有些专用于ECU的MCU,设计了硬件支持flash存储的AB面交换功能(boot swap),对应于两块独立的但地址连续拼接的flash存储器(pflash0和pflash1),可以通过软件配置,指定哪块flash存储区被映射到0x0000_0000开始的位置。如此,将用于更新的固件application工程,其linker可以不做调整,始终为一份工程。在bootloader更新固件的过程中,将实际运行地址空间的程序,先写到备份flash存储区(例如flash的后半段)中,在更新成功完毕后,再执行boot swap命令,将备份flash存储区映射到实际运行的地址空间(例如,flash地址区间的前半段)。复位芯片后,就会从备份转正的flash启动,执行新的application了。如此,两个独立的存储区可互为备份。

Pricinple & Machenisim

以YTM32B1MD1微控制器为例,介绍boot swap的机制和用法。

YTM32B1MD1微控制片上集成了2片容量为256KB的flash,称为pflash0和pflash1,总计512KB。默认情况下,pflash0被映射在0x0000_0000开始的地址空间,pflash1拼接在pflash0之后。当执行了boot swap命令后,复位,pflash1的物理存储被映射到0x0000_0000开始的地址空间,pflash0拼接在pflash1之后。

执行boot swap命令的具体操作,就是向EFM模块的CMD寄存器中,写入boot swap的命令码0x30。如图x所示。

0f3392ca-4a1b-11ef-b8af-92fbcf53809c.png

图x boot swap的命令码

而在,EFM模块的STS寄存器中,可以通过查看BOOT_INFO标志位,判定当前0x0000_0000开始的区域映射到哪块pflash上。如图x所示。

0f56bdc2-4a1b-11ef-b8af-92fbcf53809c.png

图x boot_info标志位

切记,只有当芯片复位之后,新的设置才能生效。通常开发者可以在软件中,执行boot swap命令后,再调用NVIC_SystemReset()函数复位生效。

当然,如果不适用boot swap机制,两块拼接在一起的pflash存储器,也可以作为一个地址连续的大存储器。仍然可以适配一些使用回滚策略或者使用复制方式实现的FOTA等机制。

Application

这里提供了一个可运行的用例,展示boot swap的用法。同时还讨论了一些同boot swap功能相结合的bootlaoder方案的策略。

基本的boot swap用例

在展示boot swap基本用法的用例中,在main()函数中编写用例,在同一份代码中,查看BOOT_INFO标志位,然后打印出来,告知开发者当前的程序(总是从0x0000_0000开始)运行在哪块pflash上。

在运行用例时,需要进行两次下载:第一次下载程序,下载到从0x0000_0000开始的pflash0中,运行程序后,0x0000_0000地址切换到pflash1上,此时,还需要再下载一次程序,程序会覆盖到pflash1上。注意,第一次下载程序后运行,从pflash1开始启动,pflash1此时没有可执行的程序,可能会出现“卡死”的状态。

/*main.c*/

#include"board_init.h"

/*
*Functions.
*/
intmain(void)
{
BOARD_Init();

printf("efm_swap_bool_flash.
");

if(0u==(EFM_FLAG_BOOT_INFO&EFM_GetStatusFlags(BOARD_EFM_PORT)))
{
printf("bootfrompflash0.
");
}
else
{
printf("bootfrompflash1.
");
}

printf("pressanykeytolaunchtheEFM_SwapBootFlash()...
");
uint8_tch=getchar();
putchar(ch);/*echotocheckinput.*/

/*switchthebootflash.*/
EFM_SwapBootFlash(BOARD_EFM_PORT);

printf("EFM_SwapBootFlash()done.
");

printf("NVIC_SystemReset()

");
NVIC_SystemReset();

while(1)
{
}
}

进行了两次下载之后,pflash0和pflash1上都存放了相同的一份程序。但运行时,每个pflash的程序会查阅BOOT_INFO标志位,从而打印不同的信息。如此相互交替。如图x所示。

0f65eefa-4a1b-11ef-b8af-92fbcf53809c.png

图x 运行efm_swap_boot_flash

不更新bootloader的情况

在支持A / B面的平台上,设计bootloader + application的存储结构。为了确保程序总是从bootloader开始执行,实际上是在两个pflash的开始位置存放了两个相同的bootloader,对应跳转到自己专属的application。如图x所示。如此,在一个pflash中执行更新另一个pflash中的程序时,仅更新其中application的区域。在执行boot swap和复位操作后,将会直接跳转到相同的一份bootloader,并进一步跳转到新的application,从而实现仅更新application的效果。

0f99c4e6-4a1b-11ef-b8af-92fbcf53809c.png

图x 带有bootloader的AB面存储规划

这里还讨论了一种使用片上flash存放参数(模拟eeprom)的情形。当存放数据(以地址映射方式访问)在pflash0上后,若执行boot swap命令后,实际存放数据的内存区域,其地址映射发生了变化。但在程序中,若仍使用原来的地址访问数据,则不会访问到正确的存储区。此时,如果仍想用一份固定的代码,以“自适应”的方式访问之前存放数据的区域,一种可行的方式,是借助于BOOT_INFO标志位进行判断。

uint32_teep0_base_addr=(BOOT_INFO=1)?0x3C000:0x1C000;
uint32_teep1_base_addr=(BOOT_INFO=0)?0x3C000:0x1C000;

更新bootloader的情况

如果进一步考虑更新bootloader的情况,就需要在更新策略上,在其中一个pflash中执行更新另一个pflash程序的过程中,连带这另一个pflash中的bootlaoder部分一起更新掉。如此,在执行boot swap和复位操作后,将会直接跳转到新的bootloader,从而实现更新bootloader的效果。

Conclusion

在有A / B分区的存储平台上,设计boot swap是为了实现备份程序和提升更新固件提供了便利。操作简单,效果明显。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    16608

    浏览量

    347187
  • FlaSh
    +关注

    关注

    10

    文章

    1594

    浏览量

    147298
  • 存储器
    +关注

    关注

    38

    文章

    7351

    浏览量

    162964
  • ecu
    ecu
    +关注

    关注

    14

    文章

    849

    浏览量

    54186

原文标题:YTM32的flash存储器boot-swap功能详解

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    YTM32的LIN通信协议引擎LinFlexD外设模块详解

    YTM32微控制器的LINFlexD外设模块,实现了LIN协议控制器的功能,可以支持LIN总线协议的主机和从机功能。
    的头像 发表于 10-08 11:15 1556次阅读
    <b class='flag-5'>YTM</b>32的LIN通信协议引擎LinFlexD外设模块详解

    贸泽电子开售面向便携式电子应用的 英飞凌EZ-PD PMG1-B1 USB Type-C高压微控制器

    Type-C™微控制器。EZ-PD PMG1-B1微控制器为工程师提供一种集成式单芯片解决方案,适用于需要灵活安全的MCU和更少物料的高压USB-C应用,如电动工具、小家电、电动自行车等。   贸泽电子供应
    发表于 04-18 16:29 651次阅读
    贸泽电子开售面向便携式电子应用的 英飞凌EZ-PD PMG<b class='flag-5'>1-B1</b> USB Type-C高压<b class='flag-5'>微控制器</b>

    Cortex-M1微控制器和FPGA问答

    问答选编问:Cortex-M1微控制器有哪些接口资源?答:Cortex-M1处理挂在AHB总线上,AHB总线通过桥接逻辑可以挂APB总线,APB总线上可以挂的接口有IIC、UART、
    发表于 07-26 07:46

    微控制器IO口有什么用法

    微控制器(MCU)IO口的一些用法
    发表于 03-17 06:29

    STM32G0B1xB/xC/xE微控制器的相关资料分享

    本文档提供有关 STM32G0B1xB/xC/xE 微控制器的信息,例如描述、功能概述、引脚分配和定义、电气特性、封装和订购代码。
    发表于 11-24 06:44

    PSoC 1 使用外部微控制器对 PSoC® 1 器件编程 (HSSP)-AN44168

    PSoC 1 使用外部微控制器对 PSoC® 1 器件编程 (HSSP)-AN44168
    发表于 10-10 16:10 7次下载
    PSoC <b class='flag-5'>1</b> 使用外部<b class='flag-5'>微控制器</b>对 PSoC® <b class='flag-5'>1</b> 器件编程 (HSSP)-AN44168

    瑞萨电子推出的RL78/I1x系列微控制器是RL78微控制器系列

    RL78/I1x和RL78 / H1x系列微控制器是基于瑞萨电子RL78 CPU内核为核心构建而成,其中RL78 / I1A系列是高分辨率PWM输出的
    的头像 发表于 08-01 08:29 6030次阅读

    什么是微控制器?如何编程微控制器

    微控制器进行编程或刻录意味着“将程序从编译传输到微控制器的存储”。微控制器的程序通常是用C或汇编语言编写的,最后编译
    的头像 发表于 08-21 15:40 9823次阅读

    微控制器MG74PG1B08英文数据手册

    MG74PG1B08是一款基于高性能1-T架构80C51 CPU的单片微控制器,该CPU具有以1~7个时钟周期(约为标准8051设备的6-7倍)执行指令,并具有8051兼容的指令集。因
    发表于 07-01 09:13 0次下载
    <b class='flag-5'>微控制器</b>MG74PG<b class='flag-5'>1B</b>08英文数据手册

    微控制器CH32V1数据手册

    电子发烧友网站提供《微控制器CH32V1数据手册.pdf》资料免费下载
    发表于 09-09 15:11 2次下载
    <b class='flag-5'>微控制器</b>CH32V<b class='flag-5'>1</b>数据手册

    英飞凌EZ-PD PMG1-B1 USB Type-C微控制器介绍

    EZ-PD PMG1-B1微控制器是高度集成的单端口USB-C供电 (PD) 解决方案。这些高电压的可编程USB供电系统搭载集成式Arm Cortex (-M0/M0+) 处理、128KB闪存、16KB RAM和32KB RO
    发表于 04-18 16:32 566次阅读

    云途正式发布量产版本AUTOSAR MCAL驱动软件和配置工具

    云途MCAL软件包RTM v1.1.0包含了YTM32B1ME05 和YTM32B1MD1两个系列车规MCU的片上外设模块的驱动程序代码和MCAL驱动模块所需的相应桩模块(stub module)的示例代码,如Det、Dem、CanIf、LinIf、EcuC和EcuM等。
    的头像 发表于 07-19 15:29 2201次阅读
    云途正式发布量产版本AUTOSAR MCAL驱动软件和配置工具

    YTM32的HA系列微控制器启动过程详解

    HA系列微控制器基于Arm Cortex-M7处理内核,集成了Security Boot的功能。Security Boot的关键代码集成在BOOT
    的头像 发表于 07-15 09:24 219次阅读
    <b class='flag-5'>YTM</b>32的HA系列<b class='flag-5'>微控制器</b>启动过程详解

    stm32boot0和boot1对应哪个p引脚

    STM32系列微控制器是一种广泛应用于嵌入式系统领域的32位微控制器。在STM32系列微控制器中,BOOT0和BOOT1是两个重要的引脚,它
    的头像 发表于 08-22 09:40 568次阅读

    STM32引脚中的BOOT1在哪里

    STM32是STMicroelectronics(意法半导体)推出的一系列32位微控制器,广泛应用于嵌入式系统设计。关于STM32的BOOT1引脚,它主要与系统的启动模式有关。 BOOT1引脚功能
    的头像 发表于 08-22 09:43 352次阅读