历史上的今天
返回首页

历史上的今天

今天是:2025年01月08日(星期三)

正在发生

2020年01月08日 | STM8L052R8T6串口IAP在线升级相关总结(IAR编译环境)

2020-01-08 来源:eefocus

1.关于BootLoader程序的设定


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,

       };


关于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程序的跳转和数据接收

跳转到用户程序

根据官方的例程跳转到指定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相关操作

关于内存块的划分,对于STM8L052R8T6如下图:

在这里插入图片描述

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


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的中断可正常工作。


推荐阅读

史海拾趣

Herotek Inc公司的发展小趣事

在消费电子领域,Henkel的粘合剂技术同样发挥着重要作用。随着智能手机、平板电脑等终端设备的不断迭代升级,对结构粘接、散热等方面的要求也越来越高。Henkel针对这些需求,提供了定制化的粘合剂解决方案。例如,其导热凝胶和导热垫片产品能够有效提升设备的散热性能,确保设备在高强度使用下依然保持稳定的性能。此外,Henkel还针对全面屏、折叠屏等新型屏幕技术,推出了专门的聚氨酯热熔胶解决方案,帮助手机厂商提高屏占比和用户体验。

场效应半导体(Cmos)公司的发展小趣事

英特尔(Intel)作为半导体行业的领军企业,早在上世纪70年代就开始了对CMOS技术的研究。随着技术的不断成熟,英特尔成功地将CMOS技术应用于其处理器产品中,极大地提高了产品的性能和可靠性。英特尔的CMOS处理器因其卓越的性能和出色的功耗控制而广受好评,为公司赢得了大量市场份额。此后,英特尔不断投入巨资进行CMOS技术的研发和创新,使其在全球半导体市场上保持领先地位。

C.K Magma公司的发展小趣事

为了进一步提升技术水平和市场竞争力,C.K Magma公司积极寻求国际合作。他们与国外的知名科研机构和企业建立了战略合作关系,共同开展技术研发和市场拓展。这些合作不仅为公司带来了先进的技术和管理经验,还拓宽了公司的国际视野,为公司的长远发展奠定了坚实基础。

Harwin公司的发展小趣事

随着通讯技术的快速发展,射频微波电缆的需求日益增长。Harbour Industries凭借其深厚的电缆制造经验和先进的技术实力,成功研发出了一系列高性能的射频微波电缆。这些电缆在微波射频领域展现出了优异的性能,广泛应用于通讯网络、广播电视、卫星通信等领域。Harbour的射频微波电缆不仅在国内市场占有一席之地,还远销海外多个国家和地区,进一步提升了公司的国际影响力。

Elcoma公司的发展小趣事

Elcoma公司在其早期发展阶段,就致力于电子技术的研发和创新。他们成功研发出一种新型高效能的电子芯片,这一突破性的技术大大提高了电子设备的性能和效率。这一创新技术迅速在行业内引起了广泛关注,许多大型电子设备制造商纷纷与Elcoma合作,希望将这一技术应用到他们的产品中。Elcoma凭借这一技术突破,逐渐在电子行业中崭露头角。

Formosa MS公司的发展小趣事

随着公司业务的不断发展,Elcoma意识到要进一步拓展市场,必须与国际同行建立合作关系。他们积极寻求与全球知名电子企业的合作机会,通过技术交流和合作研发,不断提升自身的技术水平和市场竞争力。同时,Elcoma还积极参与国际电子展会和论坛,展示公司的最新技术和产品,吸引了众多国际客户的关注。这些国际合作不仅为Elcoma带来了更多的商业机会,也进一步提升了公司的国际影响力。

问答坊 | AI 解惑

protel dxp中为什么没有intel的元件

protel dxp中为什么没有intel的元件,到那可以下载到啊,谁能告诉我一下。    另外,在99se中有元件库Intel Databooks.ddb,怎么把他导入dxp中使用。…

查看全部问答>

模拟传感器系统的抗干扰措施

一、前言      模拟传感器的应用非常广泛,不论是在工业、农业、国防建设,还是在日常生活、教育事业以及科学研究等领域,处处可见模拟传感器的身影。但在模拟传感器的设计和使用中,都有一个如何使其测量精度达到最高的问题。而众多的 ...…

查看全部问答>

Altium Designer Summer 08 集成库 pcb封装 sch封装

这是Altium Designer Summer 08 集成库 是三年用这个软件自己做的所有封装,里面基本上涵盖了所有的常用元件,单片机封装,很实用。对于单片机学习者相当的有帮助! [ 本帖最后由 water1987 于 2010-1-11 10:40 编辑 ]…

查看全部问答>

我看了ADS下的stratup.s怎么移植到KEIL下?

我看了ADS下的stratup.s怎么移植到KEIL下? 请教高手 …

查看全部问答>

DT930显示中文

有谁知道DT930程序如何显示中文,注册了自定义字体后还需什么代码吗?…

查看全部问答>

想做GPRS数据采集,发送,应该选用什么GPRS产品?

现在想做一个加油站的加油数据采集和无线传输,数据采集和数据传输功能需要哪些设备?特别是无线数据传输这块,预计采用GPRS网络进行传输,不知道完成这个传输功能应该采用什么设备? 1.是基于GPRS网卡的二次开发? 2.直接使用GPRS DTU,这个价格 ...…

查看全部问答>

关于51单片机的地址

我在课件上看到,STC89C52RC单片机的地址,只有80H-FFH这段地址能用程序来控制, 这就是在REG52.H头文件中被定义了,至于00H-7EH这段是被称为\"直接或间接寻址寄存器\", 一共分为四个区的,请问这四个区, 既然不能被程序控制,那么它是用在存放什么数据的 ...…

查看全部问答>

寻STM32FUSB接口电路

                                 坛子里哪位大仙儿用过STM32F通过USB接口连接计算机USB的成熟的电路图给俺一份借鉴下,或者万利的电路图也行,等待 ...…

查看全部问答>

android

有用Basic4android进行开发的吗?…

查看全部问答>

抄了一块超声波电子白板原理图,帮忙分析下前端运放

前段时间抄了一块超声波电子白板的原理图,现在样品也做出来了,不过对超声波信号接收总是存在波动。估计是前端接收到的超声波信号放大处理存在问题,请哪位大神帮我分析下下面超声波信号的放大处理电路。 1.MK是超声波接收头,频率40K。 2.DS1 ...…

查看全部问答>