STM8L052R8T6串口IAP在线升级相关总结(IAR编译环境)

2024-03-14 00:10

本文主要是介绍STM8L052R8T6串口IAP在线升级相关总结(IAR编译环境),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM8L052R8T6串口IAP在线升级相关总结(IAR编译环境)

    • 1.关于BootLoader程序的设定
    • 2.关于UserAPP程序的设定
    • 3.BootLoader程序的跳转和数据接收
    • 3.Flash相关操作
    • 5.相关测试

声明:本博文只是仅仅实现调试模式下的IAP功能,其他逻辑及相关协议需要读者自行研究添加!

1.关于BootLoader程序的设定

  1. FLASH部分区域如下图:UBC protected area
    如图所示可以看出来,默认情况下0X8000-0X8080时中断向量表。假如我们准备给BootLoader的程序分配4KB的空间,即从0X8000-0X9000存储BootLoader程序。那么相应的中断向量也应该映射到0X9000-0X9080区域。根据ST官方例程当用户编程区选择的起始地址为0X9000时可在main.c 文件中声明以下代码将中断向量映射到0X9000-0X9080区域。但是注意如果中断向量映射过去后,BootLoader程序将无法使用中断。
 __root const long reintvec[]@".intvec"=  {   0x82008080,0x82009004,0x82009008,0x8200900c, 0x82009010,0x82009014,0x82009018,0x8200901c,0x82009020,0x82009024,0x82009028,0x8200902c,0x82009030,0x82009034,0x82009038,0x8200903c,0x82009040,0x82009044,0x82009048,0x8200904c,0x82009050,0x82009054,0x82009058,0x8200905c,0x82009060,0x82009064,0x82009068,0x8200906c,0x82009070,0x82009074,0x82009078,0x8200907c,};
  1. 关于IAR编译器的链接文件及工程设置
    工程链接文件需要我们自己定义,所示我们可以从编译器默认的位置复制一份,用记事本打开并做出如图的更改。在这里插入图片描述
    如果BootLoader的程序不超过4Kb,只需更改
    define block INTVEC with size = 0x100 { ro section .intvec };
    因为这是重新映射了中断向量的定义,默认0X80,不然编译会报错。
    然后重新在工程中设置使用刚才的链接文件如图:在这里插入图片描述
    用的是STM8L052R8T6,因此工程中还需要做如下改动,如图:在这里插入图片描述

2.关于UserAPP程序的设定

UserAPP的设定相当简单,只需要更改上述的链接文件即可,如图所示:在这里插入图片描述
STM8L052R8T6 是64KB的Flash,最大到0X17FFF
当然工程中勾选生成二进制bin也是必须的,后面我们会用到该文件写入Flash。如图所示:在这里插入图片描述

3.BootLoader程序的跳转和数据接收

  1. 跳转到用户程序
    根据官方的例程跳转到指定Flash地址在IAR编译器中推荐的汇编代码如下:
      asm("LDW X,  SP ");asm("LD  A,  $FF");asm("LD  XL, A ");asm("LDW SP, X ");asm("JPF $9000");

当然在main.c中最好申明#pragma SRC
2. 数据的接收
考虑到BootLoader不能用串口中断接收数据了,那现在我们只能用循环接收的方式来接收串口发来的数据,如果超时则程序退出循环,执行其他逻辑。可参考如下代码:

while(Delay_Time<0X10){Delay_Count++;if(USART_GetFlagStatus(USART3, USART_FLAG_RXNE)==SET){ Uart3_ReciveData[Size] = USART_ReceiveData8(USART3); Size++; } if(Delay_Count==0XFFF0){Delay_Count=0;Delay_Time++;}if(Size>3) break;  //收到一定数据跳出     跳出后可进行数据判断}if(Delay_Time==0X10)   //时间到{ JumptoUserMain();     } 

3.Flash相关操作

  1. 关于内存块的划分,对于STM8L052R8T6如下图:在这里插入图片描述
    从图中可以看出Flash program memory地址从0X8000-0X9000共64KB,共256页(Page),512块(Block),每个块128Bit。如果按图中的页地址或者块地址来划分BootLoader和UserAPP的区域的话有个很大的好处,就是可以利用库函数直接一块一块写,非常方便。如果按本例程Bootloader程序需要将UserAPP生成的.bin文件从地址0X9000开始写入Flash,利用库函数可以直接从第32个块开始写,直到写入到指定的块地址结束。

  2. UserAPP的工程文件生成.bin文件写入Flash
    为了简单的实现IAP的目的,未没加入任何协议和其他逻辑,只是为了单纯的实现这个功能。-.- 哈哈哈
    ①首先bin文件是个单纯的二进制文件,利用上位机获取.bin文件后发送升级指令及写入块的大小(升级MCU写入的块大小的字节长度为:

          if (file.Length % 128 == 0)    //刚好是128字节的整数倍{BlockNum = (int)file.Length / 128;     //BlockNum 即为写入的块数目}else{BlockNum = (int)file.Length / 128 + 1;//加一块 后面不足位补0}cmdbuf[2] = (byte)(BlockNum >> 8);cmdbuf[3]= (byte)(BlockNum&0XFF);        serialport.Write(cmdbuf, 0, 4);

),若MCU回应,则将.bin文件拆开每次按128bit的数据发送给MCU,最后一块不足128bit后位补0至128bit,因为STM8L052R8T6的Flash一块刚刚好128bit.
②当MCU每次接收到128bit的数据时,放入缓冲数组,按照上述直接从第32块开始写,写完重新接收再写,如此反复直至写入结束。库函数如下:
写入flash前:

FLASH_SetProgrammingTime(FLASH_ProgramTime_Standard);FLASH_Unlock(FLASH_MemType_Program);while (FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET)

写入flash:

   if(Size>=FLASH_BLOCK_SIZE) {Size=0;FLASH_ProgramBlock(BLOCK_OPERATION, FLASH_MemType_Program, FLASH_ProgramMode_Standard, Uart3_ReciveData);BLOCK_OPERATION++;    //写入起始块++/* Wait until End of high voltage flag is set*/while (FLASH_GetFlagStatus(FLASH_FLAG_HVOFF) == RESET)USART3_SendByte(BLOCK_OPERATION>>8);USART3_SendByte(BLOCK_OPERATION&0XFF);  }

写入flash结束后:

FLASH_Lock(FLASH_MemType_Program);
JumptoUserMain();

注意上位机每次发送数据应间隔一段时间。
③FLASH库函数的操作要注意以下几点:根据资料:
For IAR Compiler:
1- Use the __ramfunc keyword in the function declaration to specify that it
can be executed from RAM.
This is done within the stm8l15x_flash.c file, and it’s conditioned by
RAM_EXECUTION definition.
2- Uncomment the “#define RAM_EXECUTION (1)” line in the stm8l15x.h file, or
define it in IAR compiler preprocessor to enable the access for the
__ramfunc functions.

首先Flash的块操作必须在RAM中进行,这必须需要在stm8l15x_flash.c 文件中的flash块操作函数前加入 __ramfunc 关键字。

__ramfunc IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType, FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer))

其次,stm8l15x_flash.h中添加注释#define RAM_EXECUTION (1).

5.相关测试

经测试,在UserApp工程中生成的bin文件,通过上位机发送BootLoader并且写入Flash后 定时器TIM2的中断可正常工作。

希望有什么错误不足的地方,大家指正。哈哈

这篇关于STM8L052R8T6串口IAP在线升级相关总结(IAR编译环境)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/806656

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061