s32k144 bootloader
阅读原文时间:2023年07月10日阅读:3

                s32k144 bootloader升级

mcu       : s32k144

can_tool : kvaser

摘要:实现can升级app程序,现在网上大多是CAN_FD升级bootloader 的程序,CAN_FD在消费型轿车可能已经使用,而队友许多大型汽车,目前用的还是can通讯,所以实现can升级制定mcu的app程序就显得尤为重要。本次发送的是摩托罗拉公司定义的s19文件(srec),上位机解析文件,发送。CAN_FD一帧数据能发64个字节,而CAN一帧数据只能发送8个字节(不包括ID等其他信息),而s19文件除了第一行可能超过64个字节外,其他行一般小于64个字节,所以CAN_FD的方式会很简单,而can的方式会很麻烦。本文分为三个部分:boot loader、app、上位机软件。

(1)bootloader主要实现功能:

        

(2)分析一下跳转部分:

① s32k的栈顶地址为0x00000000,而stm32的栈顶地址一般为0x08000000。复位向量表起始地址 = 栈顶地址+4 ;我们平时复位地址就是这个地址。各部分程序映射地址如下图

图中使用的APP地址偏移量是0x00004000(8k)的大小,通过查看要烧录的文件发现2k字节的大小是完全足够的,我们此次就是用的地址为0x00002000

②单片机的函数名就是地址,运行函数其实就是将PC指针跳到函数的入口去执行程序

typedef void (*bootloader_fun)(void); /*定义函数指针类型*/
bootloader_fun jump2app; /*定义函数指针*/
……….
/* 函数指针指向app的复位向量表的地址。注意将地址强转成函数入口地址 */
jump2app = (bootloader_fun)*(uint32_t*)(APP_ADDR + );
/* 设置栈顶指针*/
MSR_MSP(APP_ADDR);
/*将pc指针指向入函数地址(app地址)运行*/
jump2app();

PS.在跳转之前还得can_deinit()和关闭全部的中断 __asm volatile ("cpsid i" : : : "memory");

(3)其他注意要点

  ① bootloader中提供的外部接口:

    Ⅰ.缓存buff的size

    Ⅱ.bootloader的等待值

Ⅲ.app的栈顶地址

    Ⅳ.和上位机通信的can帧ID

    Ⅴ.要擦除app扇区的数量

  ②bootloader 注意:

    Ⅰ.没有使用独立看门狗,s32k144的独立看门狗从上电复位到掉电只能被初始化一次,所以app使用,bootloader没有使用。以后版本会使用到

    Ⅱ.进行flash操作的时候,不可能处理完一行的srec的值就写入flash中,可以用一个buff缓存,这个buff的大小直接决定了更新速度。下面两点要注意:

      □ 为提高flash写入速度,app扇区在第一次写flash时就擦出全部app扇区,这个地方要注意擦除的地址要小于自己配的eeprom的地址,不然会将以前的数据擦除。

                 □ 在进行flash操作的时候不能被中断打断,所以返回上位机一条忙碌的信息,使其阻塞。

      □ 缓存buff必须动态分配,跳转前必须释放

(1).修改app的链接文件

keil的话直接在output选项卡中修改栈顶地址就行,而我此次用的是S32DS,需要修改工程的链接文件如下图  

(2).在主函数中设置中断向量表的偏移地址,并打开全局中断

/* 此处偏移地址必须和bootloader中的一样 */
S32_SCB->VTOR = 0x00002000 ;
/* 关闭全局中断*/
__asm volatile ("cpsie i" : : : "memory");

(3).添加CAN特殊ID

当接收到的帧ID是某一特定ID时,判断接收到的值 unsigned char resetmcu[] ={0x52,0x45,0x53,0x45,0x54,0x4d,0x43,0x55};这些值对应RESETMCU的asicii码对应的十六进制值

当正确时复位看门狗,mcu重新从0x00000000_开始运行,完成更新软件复位,从而更新程序_

(4).app至少需要的接口 :引起看门狗复位的CAN_ID__

(1)主要功能如下图:

(2)提供外部接口: 与MCU通讯的帧ID

   PS :控制好一键复位和发送第一帧数据的时间间隔,太快就会丢失这一帧,太慢,bootloader已经跳到app中去了

出厂第一次烧录的时候必须将bootloader 的srec文件和app的srec文件合成一个srec文件,并用J-FLASH烧录到MCU,J-FLASH可以合并文件和分段烧录是一个比较非常好用的工具,非常方便

体会:本次发现C#是很好用的,以后可能用到着,一切皆工具

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章