写这段程序之前参考了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)相关推荐

  1. 基于CANoe的Bootloader上位机软件 下位机为飞思卡尔MC9S12G128MLL

    基于CANoe的Bootloader上位机软件 下位机为飞思卡尔MC9S12G128MLL ID:6850668870980676Max_Min

  2. 基于UDS的BootLoader上位机源代码,支持ISO15765通信,支持PeakCAN , ZJG CAN等CAN卡, 支持S-record格式的二进制文件解析; 可二次开发或扩展应用

    基于UDS的BootLoader上位机源代码(C#) 基于UDS的BootLoader上位机源代码,支持ISO15765通信,支持PeakCAN , ZJG CAN等CAN卡, 支持S-record格 ...

  3. 基于UDS的BootLoader设计——架构设计及规范

    1 BootLoader概述         1.1 Boot Loader设计目的         1.2 Boot Loader基本功能     2 BootLoader基本需求设计        ...

  4. 基于S32DS实现CAN、LIN基础结合芯片UJA1075的功耗模式切换设置(Standby、Normal、Sleep)

    经过较长时间的调试,UJA1075实现进入到Sleep模式了,目标就是实现V1和V2电源的关闭,但目前这个V1的硬件电压没有实现完全关断(已经实现关断),借着查看手册的机会,整理一下UJA1075的芯 ...

  5. STM8基于CAN协议bootloader实现方案

    目录 一.引言 二.STM8的Bootloader介绍 三.Bootloader激活流程图 四.CAN设置 五.Bootloader命令集 5.1 Get指令 5.2 Read存储器命令 5.3 Er ...

  6. 基于S32K的油门踏板检测项目(基于CAN的Bootloader覆盖升级、回滚升级)

    文章目录 项目概述 要求 Bootloader介绍 原理设计 功能设计 硬件设计 软件设计 主机 主机流程 Xmodem协议 代码 从机 从机流程 升级方案 区域划分 Boot链接文件修改 APP A ...

  7. AUTOSAR从入门到精通100讲(三)-基于UDS服务的BootLoader架构和刷写流程

    基于UDS的BootLoader下载,可以支持ECU生命周期的无限次刷写,通过CAN网络进行无需拆壳和DEBUG口的应用程序刷写,本文介绍了刷写服务和是三个阶段的刷写流程.也可通过无线模块实现空中升级 ...

  8. 基于UDS的ECU bootloader

    CAN总线学习-3 最近学习基于UDS的bootloader,做一些总结. 1. 基于UDS的bootloader重要性 为了在不拆卸ECU的外壳的情况下也可以更新ECU的APP,我们需要有bootl ...

  9. 【基于UDS服务的BootLoader架构和刷写流程】

    基于UDS的BootLoader下载,可以支持ECU生命周期的无限次刷写,通过CAN网络进行无需拆壳和DEBUG口的应用程序刷写,本文介绍了刷写服务和是三个阶段的刷写流程.也可通过无线模块实现空中升级 ...

最新文章

  1. qpython手机版-QPython,一个在手机上运行Python的神器
  2. TMG2010 之创建访问规则
  3. android设备局域网中快速搜索之cling方式
  4. python pyecharts_基于Python的数据可视化库pyecharts介绍
  5. numpy 创建加一行_数据科学|可视化图解Python科学计算包Numpy
  6. 【华为云技术分享】大数据容器化,头部玩家尝到了甜头
  7. Codeforces Round #565 (div. 3)
  8. docker镜像的使用及相关
  9. servlet原理详解
  10. 最新web打印控件 破解版 下载地址
  11. java扫描条形码的两种方式
  12. mt6573的DSI 接口
  13. 2015062002 - 赵云
  14. 中国数字经济投资态势分析及发展前景深度评估报告2022-2028年版
  15. BOOT ROM 初始化内容、启动设备、镜像烧写
  16. 办公室电脑如何修改IP地址、设置共享、连接打印机
  17. 三极管驱动和MOS管驱动的区别
  18. 计算机专业的相关英语词汇,计算机专业英语单词大全
  19. 2、快速选择工具和魔棒工具
  20. sql与nosql_NoSQL与SQL:选择数据管理解决方案

热门文章

  1. 2021年特种设备电梯修理(全国特种设备-T电梯修理模拟考试题库一)安考星
  2. QProcess文档
  3. FPGA知识汇集-FPGA设计开发需要熟悉哪些EDA工具呢?
  4. 计算机等级考试是按顺序考吗,计算机等级考试报名顺序是考试顺序吗
  5. SQL SERVER高级语法之T-SQL
  6. 你的NAS被勒索病毒攻击了怎么办?
  7. 长期用电脑人士要多吃樱桃
  8. 【路径规划】基于matlab蚁群算法机器人栅格地图最短路径规划【含Matlab源码 1580期】
  9. 有道词典的划词搜索功能加入生成的百度链接
  10. 链叨叨直播间丨Dimitra专注分散农业,为全球农户提供区块链生产力支持