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指针跳到函数的入口去执行程序
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必须动态分配,跳转前必须释放
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#是很好用的,以后可能用到着,一切皆工具
s32k144 bootloader的更多相关文章
- 自己用C语言写NXP S32K144 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader) 欢迎咨询或定制bootloader(在线升级程序). NXP S32K144 ...
- S32Kxxx bootloader之CAN bootloader
了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 最近完成了S32Kxx ...
- STM8如何使用自带的bootloader
1,首先确认你使用的STM8有没有自带的bootloader.参考下表 2,STM8空器件可以直接使用自带的bootloader. 3,STM8在使用SWIM烧录后,要想继续使用自带的bootload ...
- Android Bootloader LittleKernel的两篇文章 【转】
转自:http://blog.csdn.net/loongembedded/article/details/41747523 2014-12-05 14:37 3599人阅读 评论(2) 收藏 举报 ...
- 斐讯k1路由器刷Breed BootLoader(不死UBoot)教程
刷入Breed BootLoader: 因为这个K1路由器可以开启telnet服务,所以此处刷Breed可以不使用编程器刷Flash芯片的方法进行. 1.打开K1路由器的Telnet服务. 电脑通过有 ...
- Linux学习 : 自己写bootloader
一.bootloader 目标:启动内核 基本功能: ①初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH ②image比较大需要重定位到SDRAM ②将内核从NAND FLA ...
- How to acquire an Android phone with locked bootloader?
As we know that some devices come with locked bootloaders like Sony, HUAWEI, hTC...If you try to unl ...
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- Xmodem Bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 多年前玩Cisco交换 ...
随机推荐
- Java 教程(开发环境配置+基础语法)
Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.ora ...
- Linux 笔记 - 第二十章 配置 Nginx 反向代理和负载均衡
一.简介 由于 Nginx 的反向代理和负载均衡功能经常被提及,所以将这两个功能单独提出来进行讲解. Nginx 其实仅仅是作为 Nginx Proxy 反向代理使用的,因为这个反向代理功能表现的效果 ...
- Day 14 查找文件 find
find 查找方式 1.按照名称进行查找 [root@oldboyedu ~]# find ./ -name "*eth0" 2.按照名称查找(不区分大小写) [root@oldb ...
- 教你用java统计目录下所有文档的词频
本文是统计目录下所有文档的词频top10,非单个文档,包含中文和英文. 直接上代码: package com.huawei.wordcount; import java.io.BufferedRead ...
- 记一次处理mysql数据库无故锁表的经历
某日,生产环境上的用户表突然无故锁表,原以为只是偶发的bug.所以第一时间想到的解决方案简单粗暴:重启数据库(service mysqld restart).问题得以解决. 10min后,该表再次锁表 ...
- SpringBoot起飞系列-日志使用(四)
一.SpringBoot中的日志组件 日志是一个系统中不可缺少的组件.在项目中,我们常用的日志组件有JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.. ...
- .net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接
Hub的管理 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 代码请查看 using CTS.Signal ...
- HDU 2044——一只小蜜蜂...(DP)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044 题解 //递归思想,超时 #include<iostream> using namesp ...
- dede tag标签静态化
看回那2个文件夹即可,txt说明书我已经修改过. 下面说一下tag标签静态化之后在内容页.列表页中如何使用. 内容页中沿用之前的方法即可: {dede:tag sort='new' getall='0 ...
- 使用JavaScript·求数组的最大值和最小值
前言 在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法. 法一:其实利用 ...