首页 > 其他分享 >KeilMDK制作FlashDriver

KeilMDK制作FlashDriver

时间:2023-06-13 12:03:46浏览次数:39  
标签:__ flash FLASH WaitEraseAllComplete 地址 KeilMDK FlashDriver tpfFLASH 制作

一、前言

①在ECU OTA 程序升级过程中,需要执行一段比较特殊的代码,这段代码实现对自身flash的擦除与写入,又称flash driver;
②为了安全的考虑,会尽可能的避免在代码中固化有对flash空间进行擦除或写入的操作,主要为了避免在程序跑飞时误调用该部分代码,使软件代码部分受到破坏;
③在OTA开始后,会先传入flash driver到RAM中,再开始刷写APP
④在OTA完成之后,会执行11 01 MCU复位的操作,复位前会清除这部分RAM空间,或者重新给ECU上电后,flash driver就失能了。
⑤本文参考自github的SummerFalls:UDS_S32K144_FlashDriver
工程链接:https://github.com/SummerFalls/UDS_S32K144_FlashDriver

二、FlashDriver的生成

1、修改加载文件

1.1、定义FLASH空间的地址和大小:

这部分可以参考芯片手册(建议选一块单独的flash空间)

 

#define DAFLASH_START 0x01010000
#define DAFLASH_SIZE 0x00010000 /* 64KB */

 

1.2、定义函数存储的地址段同理,

这部分数据也可以自定义①RW_IROM_FlashDrvOffset :这部分用于存储偏移量地址,比如有擦除和写入两个函数,那么就是0x1010000 0x00000008,我这边有三个,所以是0x0000000C②RW_IROM_FlashDrv :这部分用于存储flash driver函数

 

LR_IROM3 DAFLASH_START DAFLASH_SIZE ; 定义加载空间地址和大小,对应工程设置的IROM3。LR_IROM3是加载空间的名称
{
RW_IROM_FlashDrvOffset 0x01010000 0x0000000C
{
  *(.Flash_Driver_Section_Offset)
}

RW_IROM_FlashDrv 0x0101000C 0x000005C4
{
  *(.Flash_Driver_Section)
}
}

 

2、定义相关结构体、数据类型和宏定义

 

 2.1、数据宏定义说明

#define FLASH_DRV_OFFSET (0x0101000C) //用于定位驱动函数起始地址段
#define CAL_OFFSET(funcPtr) ((uint32_t)(funcPtr) - FLASH_DRV_OFFSET) //用于定位驱动函数的起始地址

#define FLASH_DRIVER_SECTION __attribute__((section (".Flash_Driver_Section"))) //用于指定驱动函数存放的地址段
#define FLASH_DRIVER_SECTION_OFFSET __attribute__((section (".Flash_Driver_Section_Offset"))) //用于指定驱动函数偏移量存放的地址段

 

2.2、数据类型定义说明

这部分的三个函数,可以参考芯片的SDK库进行定义
typedef ResultStatus_t (*tpfFLASH_WaitCmdComplete) (flash_cb_t callBack);
typedef ResultStatus_t (*tpfFLASH_WaitEraseAllComplete) (flash_cb_t callBack);
typedef ResultStatus_t (*tpfFLASH_ExecuteCommandInt) (FLASH_CMD_t cmd);

 

 

 2.3、结构体定义说明

此部分三个函数指针,用于之后映射flash驱动函数

typedef struct
{
  tpfFLASH_WaitCmdComplete pfFLASH_WaitCmdComplete;
  tpfFLASH_WaitEraseAllComplete pfFLASH_WaitEraseAllComplete;
  tpfFLASH_ExecuteCommandInt pfFLASH_ExecuteCommandInt;
} tFlashDriverAPIInfo;

 

3、将驱动函数存放到指定区域


3.1、函数声明


将操作Flash的几个驱动函数存放到指定地址,注意这几个函数里边不能再包含其他函数或者全局变量,如果有调用其他函数的话,需要使用do...while语句进行展开

__attribute__((used)) FLASH_DRIVER_SECTION static ResultStatus_t FLASH_WaitCmdComplete(flash_cb_t callBack);
__attribute__((used)) FLASH_DRIVER_SECTION static ResultStatus_t FLASH_WaitEraseAllComplete(flash_cb_t callBack);
__attribute__((used)) FLASH_DRIVER_SECTION static ResultStatus_t FLASH_ExecuteCommandInt(FLASH_CMD_t cmd);

__attribute__((used)) NVM_DRIVER_SECTION_OFFSET static const tFlashDriverAPIInfo gs_FlashDriverAPI = {
  (tpfFLASH_WaitCmdComplete) CAL_OFFSET(FLASH_WaitCmdComplete),
  (tpfFLASH_WaitEraseAllComplete) CAL_OFFSET(FLASH_WaitEraseAllComplete),
  (tpfFLASH_ExecuteCommandInt) CAL_OFFSET(FLASH_ExecuteCommandInt),
};

 

3.2、编译后查看map文件,获取地址信息

 

 


可以看到3.1的3个函数地址已经明确了

3.3、提取hex文件


编译后,找到hex文件,利用hexview提取相应信息:
(这里我已经删除了其他地址的数据)

 

这里需要注意的是,map文件中的起始地址需要向前一位开始复制:

 
FuncionName Address 
FLASH_WaitCmdComplete 0x0101000C-0x0101004B
FLASH_WaitEraseAllComplete  0x0101004C-0x0101008B 
FLASH_ExecuteCommandInt 0x0101008C-0x010100C3 

 


3.4、提取hex文件数据


将对应地址的hex数据提取出来,存放到一个数组(注意需要对齐,可以参考__):

 


3.5、将函数指针重定向

将之前定义的函数指针进行重定向:

tpfFLASH_WaitCmdComplete FLASH_WaitCmdComplete = (WaitCmdComplete_Handler)(u8WaitCmdComplete + 1);
tpfFLASH_WaitEraseAllComplete FLASH_WaitEraseAllComplete = (WaitEraseAllComplete_Handler)(u8WaitEraseAllComplete + 1);
tpfFLASH_ExecuteCommandInt FLASH_ExecuteCommandInt = (ExecuteCommandInt_Handler)(u8ExecuteCommandInt + 1);


这里+1的原因是,在ARM体系结构中,指令的最低有效位(LSB)被用来区分ARM指令和Thumb指令。当LSB为0时,表示该指令是一个32位的ARM指令;当LSB为1时,表示该指令是一个16位的Thumb指令。
在某些情况下,为了兼容不同指令集的代码,在进行指令访问时可能会对地址进行微调。当访问Thumb指令时,将地址的最低位设置为1,以表示要访问的是Thumb代码;当访问ARM指令时,将地址的最低位设置为0,以表示要访问的是ARM指令。

 

3.6、Debug测试

开始Debug调试......:
先定义两个测试函数:

 

先把0x01010000开始的这部分地址数据擦掉:

这里后边有数据是因为最小写入16个字节

到这里就验证完了。

 

4、生成FalshDriver文件

4.1、用hexview操作


把提取到的文件在hexview中打开,然后在左上角窗口cut这部分数据

 

然后粘贴到指定地址(因为这部分数据是要传到RAM里边的,所以起始地址需要在RAM部分),我这里是存在了0x200039F0开始的地址

 


然后在keil里边利用之前创建的函数指针重定向这部分数据
先定义好函数的起始地址:

#define FLS_WAIT_CMD_ADD 0x200039FC
#define FLS_WAIT_ERASE_ADD 0x20003A3C
#define FLS_EXEC_CMD_INT_ADD 0x20003A7C

 


然后将函数指针重定向:

void FlashApiInit(){
  FLASH_WaitCmdComplete = (tpfFLASH_WaitCmdComplete)(FLS_WAIT_CMD_ADD + 1);
  FLASH_WaitEraseAllComplete = (tpfFLASH_WaitEraseAllComplete)(FLS_WAIT_ERASE_ADD + 1);
  FLASH_ExecuteCommandInt = (tpfFLASH_ExecuteCommandInt )(FLS_EXEC_CMD_INT_ADD + 1);
}

 

只需要在传入FlashDriver后,调用这个函数即可,注意存放这部分的RAM空间在这过程中应该是没有被其他代码使用的,不然可能会出错。

 

三、End

 

被这部分折磨了挺久,好在终于搞定了,如果对大家有帮助的话,点个赞把。

标签:__,flash,FLASH,WaitEraseAllComplete,地址,KeilMDK,FlashDriver,tpfFLASH,制作
From: https://www.cnblogs.com/peng1028/p/17477120.html

相关文章

  • 如何制作一个无标题栏且可拖拽的窗口
    如何制作一个无标题栏且可拖拽的窗口默认情况下,我们创建一个窗口自带有一个标题栏,标题栏上有程序的图标和标题,以及最小化、最大化、关闭按钮。默认标题栏的样式比较固定,有时候为了自定义样式,就需要先隐藏默认的标题栏,然后自己制作一个。同时有时还希望修改默认的拖拽窗口的方式......
  • 机器鱼的制作分享
    1.运动功能说明    本文示例将实现R330样机机器鱼胸鳍能够灵活的上下摆动的功能。2.结构说明    本样机采用舵机模块来进行仿生机器鱼结构的设计。胸鳍整机3.电子硬件    在这个示例中,我们采用了以下硬件,请大家参考:    电路连接:将舵机连接在Bigfis......
  • 报表制作很复杂?用了这款报表制作工具轻松完成报表制作
    在企业管理中,报表是非常重要的一环。然而,很多人对于报表制作却感到十分困难和繁琐。事实上,报表制作并不需要太高深的技能,只要掌握了一些基本的操作技巧和使用工具,就可以轻松地完成报表制作。而VeryReport报表制作工具则是一款非常适合初学者使用的报表制作软件。编辑搜图请点击输入......
  • Excel制作三级下拉菜单
    Excel中的数据有效性(数据验证)大家并不陌生,今天我们就来说说Excel中利用数据验证和名称管理器制作多级下拉菜单!一级下拉菜单一级下拉菜单比较简单,直接利用数据验证功能即可实现,如下图中,在A列实现下拉展示大区,选中A列单元格,依次选择【数据】—【数据验证】—验证条件选择"序列"—来源......
  • esp8266制作太空人天气时钟
    背景简单来说,就是最近太闲了,然后下班也无所事事,在B站上刷着一众up们的diy视频,一次又一次地激起了我应该做点啥的想法,于是在这一阵又一阵的激励下,我再次燃起了对diy硬件的兴趣,于是我便又一次把自己年前买到的一些硬件翻出来,开始自己的新一轮arduino之旅。材料准备本次项目的总......
  • 如何制作高质量的中视频内容
    为了打造受欢迎的中视频,运营者需要掌握适合的内容创作方法。以下重点介绍5种中视频内容的创作方法,帮助大家快速制作热门内容。一、原创视频:根据定位进行制作有中视频制作能力的运营者可以根据自身账号的定位创作原创中视频内容。在刚开始做原创中视频时,许多人可能不知道该拍摄什......
  • Python“制作”midi音乐“两只老虎”
    从网上找了很多谱子,可惜没有音乐细胞看不太懂,根据自己的理解改了好几遍,还是听不出来“两只老虎”的感觉,于是在标题上加了双引号。这样的话就只能了解本文思路了,算是抛砖引玉吧,重点是Python标准库winsound的Beep()函数可以发出37到32767赫兹之间频率的声音,其第二个参数为发声时长。f......
  • MDT部署Windows系列 (十二): 进阶篇—制作完美的Win10 22H2系统镜像模板之移除Windows
    前言由于工作等原因(借口),距离发布上一篇MDT系列的文章已经过去一年::twemoji:sweat::上一章我记录了基于MDT如何使用一个Task即可实现制作Windows基础wim镜像+DIY基础软件+捕捉镜像。传送门有好多同学一直咨询在制作捕捉镜像的时候遇到的常见的2个问题:如何彻底的移除掉Windows10中......
  • gif动图制作,gif动图制作软件推荐!​
    gif动图制作,GIF动图是一种通过在短时间内循环播放多张静态图片来实现动画效果的图像格式。GIF动图制作是指将多张静态图片合成为一个GIF动图的过程。这种制作方式可以用来创建有趣的表情包、漫画、广告等内容,那么很多小伙伴不知道该怎么制作,下面感兴趣的小伙伴一起来看看吧!选择:书单......
  • 专业角色动画制作-Character Animator 2023 win中文
    CharacterAnimator2023是Adobe公司推出的一款专业角色动画制作软件,它的主要功能是将用户的实时动作转换为角色动画,能够快速创建高质量的动画作品。→→↓↓载CharacterAnimator2023win 一、界面介绍CharacterAnimator2023的界面非常简洁,分为三个主要部分:舞台、面板和......