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、上位机软件。
① 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");
① bootloader中提供的外部接口:
Ⅰ.缓存buff的size
Ⅱ.bootloader的等待值
Ⅲ.app的栈顶地址
Ⅳ.和上位机通信的can帧ID
Ⅴ.要擦除app扇区的数量
②bootloader 注意:
Ⅰ.没有使用独立看门狗,s32k144的独立看门狗从上电复位到掉电只能被初始化一次,所以app使用,bootloader没有使用。以后版本会使用到
Ⅱ.进行flash操作的时候,不可能处理完一行的srec的值就写入flash中,可以用一个buff缓存,这个buff的大小直接决定了更新速度。下面两点要注意:
□ 为提高flash写入速度,app扇区在第一次写flash时就擦出全部app扇区,这个地方要注意擦除的地址要小于自己配的eeprom的地址,不然会将以前的数据擦除。
□ 在进行flash操作的时候不能被中断打断,所以返回上位机一条忙碌的信息,使其阻塞。
□ 缓存buff必须动态分配,跳转前必须释放
keil的话直接在output选项卡中修改栈顶地址就行,而我此次用的是S32DS,需要修改工程的链接文件如下图
/* 此处偏移地址必须和bootloader中的一样 */
S32_SCB->VTOR = 0x00002000 ;
/* 关闭全局中断*/
__asm volatile ("cpsie i" : : : "memory");
当接收到的帧ID是某一特定ID时,判断接收到的值 unsigned char resetmcu[] ={0x52,0x45,0x53,0x45,0x54,0x4d,0x43,0x55};这些值对应RESETMCU的asicii码对应的十六进制值
当正确时复位看门狗,mcu重新从0x00000000_开始运行,完成更新软件复位,从而更新程序_
PS :控制好一键复位和发送第一帧数据的时间间隔,太快就会丢失这一帧,太慢,bootloader已经跳到app中去了
出厂第一次烧录的时候必须将bootloader 的srec文件和app的srec文件合成一个srec文件,并用J-FLASH烧录到MCU,J-FLASH可以合并文件和分段烧录是一个比较非常好用的工具,非常方便
体会:本次发现C#是很好用的,以后可能用到着,一切皆工具
手机扫一扫
移动阅读更方便
你可能感兴趣的文章