基于KEAZ128的bootloader实现(LIN)
写这段程序之前参考了NXP官网的《AN5400:KEA bootloader》
源代码可下载我发布的资源。编译器使用S32DS。
1、简述:boot loader的实现可以简单理解为在MCU的程序存储区分为两个部分,BOOT和APP。
上电执行BOOT,如有下载请求就下载程序,没有就跳转到APP程序。在实际编程中应该创建两个工程,APP与BOOT。
2、向量地址。
我们要把FLASH区分为两个部分,那自然要要分配不同的起始地址。由于单片机硬复位后PC指针会默认指向0x0000,所以BOOT部分必须以地址0起始,我这里为BOOT预留的地址空间是0x0000-0x4000.由于使用默认地址,所以LD文件不需要修改。
FLASH_1 (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
FLASH_CONFIG (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010
FLASH_2 (RX) : ORIGIN = 0x00000410, LENGTH = 0x0001FBF0
APP的工程需修改为
FLASH_1 (RX) : ORIGIN = 0x00004000, LENGTH = 0x00000400
FLASH_CONFIG (RX) : ORIGIN = 0x00004400, LENGTH = 0x00000010
FLASH_2 (RX) : ORIGIN = 0x00004410, LENGTH = 0x0001BBF0
关于LD文件的位置:工程文件夹里
3、FLASH的读写。
KEAZ128的FLASH擦写操作并不会占用总线(见手册),所以不需要将FLASH的操作程序段放在内存中。直接执行即可,但需注意的是,需要在执行操作时关闭中断,且不能操作正在执行程序的扇区。下面介绍下FLASH的读写方法。
3.1设置保护区以防止误操作。
//Flash Protection Operation Enable
FTMRE->FPROT |= FTMRE_FPROT_FPOPEN_MASK;
//Flash Protection Higher Address Range Disable
FTMRE->FPROT |= FTMRE_FPROT_FPHDIS_MASK;
//Flash Protection Lower Address Range Disable
FTMRE->FPROT &= ~FTMRE_FPROT_FPLDIS_MASK;
//Flash Protection Lower Address Size, from 0 to 0x3FFF
FTMRE->FPROT |= FTMRE_FPROT_FPLS_MASK;
3.2初始化
retError |= FLASH_Init(20000000);
3.3擦除扇区 :在向FLASH区写入数据之前要先执行擦除,而擦除是按照扇区执行的,每扇区512字节。
FLASH_EraseSector(add);
FLASH_EraseVerifySection(add, w);
add 扇区的地址
w 要验证的字数。注:此处为长字,即1个字四个字节
例如: FLASH_EraseSector(0x4000);
FLASH_EraseVerifySection(0x4000, 128);
擦除了0x4000-0x41ff的内容。
3.4写入:下面这段的意思是向地址flash_app_addr连续写入512字节,内容为数组hcBuff[]
需注意的是无论擦除还是写入都需关闭中断。
__disable_irq();
int error1=FLASH_Program(flash_app_addr, hcBuff, 512);
__enable_irq();
3.5读值 直接使用uchar型指针指向就可以。
x=*((uint8_t*)(flash_app_addr));
4、如何跳转:在没有请求或者下载完成后需跳转到APP部分。跳转方法为函数指针:
typedef void(*JumpToPtr)(void); //函数指针类型 别名JumpToPtr
#define APP_IMAGE_START 0x4000
for(i=0;i<8;i++)
UART_DisableInterrupt(UART0, i); //跳转前关闭所有打开的外设,这里使用了串口
/*这里禁用所有中断,就不举例了*/
JumpToPtr jump2app; /*定义函数指针*/
jump2app = (JumpToPtr)*(uint32_t*)(APP_IMAGE_START + 4);
jump2app(); //跳转
while(1);
PS:其实”在内存中执行函数“也是利用函数指针,只是把指针指向了存储着函数机器码的数组的首地址。
5、烧写的内容
BOOT接受到下载请求下载程序,将程序烧写0x4000起始的位置。程序信息是由16进制的机器码形式保存的,也是就是用APP工程编译出BIN文件中的内容。
6、关于通信。
BOOT中的通信与正常编程是相同的,只是需要在跳转前关闭在BOOT中打开的外设。
源代码中使用的通讯方式是LIN总线。19200波特率 帧间隔20ms。关于客户协议的部分就不赘述了,我想对于大家来说这都不是难题。
对于刚接触bootloader的工程师来说需要的无非就那么几点,如何在C语言中跳转PC指针、FLASH的操作接口、在哪里设置向量地址、以及总线条件不允许时如何在内存中执行程序等。简单写一下算是抛砖引玉,欢迎交流。
基于KEAZ128的bootloader实现(LIN)相关推荐
- 基于CANoe的Bootloader上位机软件 下位机为飞思卡尔MC9S12G128MLL
基于CANoe的Bootloader上位机软件 下位机为飞思卡尔MC9S12G128MLL ID:6850668870980676Max_Min
- 基于UDS的BootLoader上位机源代码,支持ISO15765通信,支持PeakCAN , ZJG CAN等CAN卡, 支持S-record格式的二进制文件解析; 可二次开发或扩展应用
基于UDS的BootLoader上位机源代码(C#) 基于UDS的BootLoader上位机源代码,支持ISO15765通信,支持PeakCAN , ZJG CAN等CAN卡, 支持S-record格 ...
- 基于UDS的BootLoader设计——架构设计及规范
1 BootLoader概述 1.1 Boot Loader设计目的 1.2 Boot Loader基本功能 2 BootLoader基本需求设计 ...
- 基于S32DS实现CAN、LIN基础结合芯片UJA1075的功耗模式切换设置(Standby、Normal、Sleep)
经过较长时间的调试,UJA1075实现进入到Sleep模式了,目标就是实现V1和V2电源的关闭,但目前这个V1的硬件电压没有实现完全关断(已经实现关断),借着查看手册的机会,整理一下UJA1075的芯 ...
- STM8基于CAN协议bootloader实现方案
目录 一.引言 二.STM8的Bootloader介绍 三.Bootloader激活流程图 四.CAN设置 五.Bootloader命令集 5.1 Get指令 5.2 Read存储器命令 5.3 Er ...
- 基于S32K的油门踏板检测项目(基于CAN的Bootloader覆盖升级、回滚升级)
文章目录 项目概述 要求 Bootloader介绍 原理设计 功能设计 硬件设计 软件设计 主机 主机流程 Xmodem协议 代码 从机 从机流程 升级方案 区域划分 Boot链接文件修改 APP A ...
- AUTOSAR从入门到精通100讲(三)-基于UDS服务的BootLoader架构和刷写流程
基于UDS的BootLoader下载,可以支持ECU生命周期的无限次刷写,通过CAN网络进行无需拆壳和DEBUG口的应用程序刷写,本文介绍了刷写服务和是三个阶段的刷写流程.也可通过无线模块实现空中升级 ...
- 基于UDS的ECU bootloader
CAN总线学习-3 最近学习基于UDS的bootloader,做一些总结. 1. 基于UDS的bootloader重要性 为了在不拆卸ECU的外壳的情况下也可以更新ECU的APP,我们需要有bootl ...
- 【基于UDS服务的BootLoader架构和刷写流程】
基于UDS的BootLoader下载,可以支持ECU生命周期的无限次刷写,通过CAN网络进行无需拆壳和DEBUG口的应用程序刷写,本文介绍了刷写服务和是三个阶段的刷写流程.也可通过无线模块实现空中升级 ...
最新文章
- qpython手机版-QPython,一个在手机上运行Python的神器
- TMG2010 之创建访问规则
- android设备局域网中快速搜索之cling方式
- python pyecharts_基于Python的数据可视化库pyecharts介绍
- numpy 创建加一行_数据科学|可视化图解Python科学计算包Numpy
- 【华为云技术分享】大数据容器化,头部玩家尝到了甜头
- Codeforces Round #565 (div. 3)
- docker镜像的使用及相关
- servlet原理详解
- 最新web打印控件 破解版 下载地址
- java扫描条形码的两种方式
- mt6573的DSI 接口
- 2015062002 - 赵云
- 中国数字经济投资态势分析及发展前景深度评估报告2022-2028年版
- BOOT ROM 初始化内容、启动设备、镜像烧写
- 办公室电脑如何修改IP地址、设置共享、连接打印机
- 三极管驱动和MOS管驱动的区别
- 计算机专业的相关英语词汇,计算机专业英语单词大全
- 2、快速选择工具和魔棒工具
- sql与nosql_NoSQL与SQL:选择数据管理解决方案