• s32k144 bootloader


                    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:    

    (1)bootloader主要实现功能:

            

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

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

     

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

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

    1 typedef void (*bootloader_fun)(void);          /*定义函数指针类型*/
    2 bootloader_fun jump2app;                       /*定义函数指针*/
    3 ..........      
    4 /* 函数指针指向app的复位向量表的地址。注意将地址强转成函数入口地址 */
    5  jump2app = (bootloader_fun)*(uint32_t*)(APP_ADDR + 4);      
    6 /* 设置栈顶指针*/
    7 MSR_MSP(APP_ADDR);   
    8   /*将pc指针指向入函数地址(app地址)运行*/
    9   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必须动态分配,跳转前必须释放

    2.app

     (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

    3.kavser 上位机软件

      (1)主要功能如下图:

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

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

     4.量产烧录

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

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

                       

                                 

  • 相关阅读:
    如何操作3D中的摄像机
    软件开发的未来,是MDA/MDD/面向模式/Plugin IDE吗?[转]
    Hibernate3一个不错的入门介绍
    C#中的== Equals 与 Java 的== Euqals
    The Attributes property of a ListItem control only works within an HtmlSelect control
    WebWork 与 Struts
    会计基本流程
    常用 js 函数
    SQL中的sysobjects与syscolumns
    一个Struts2的的辅助工具
  • 原文地址:https://www.cnblogs.com/st-home/p/10906581.html
Copyright © 2020-2023  润新知