ECU BootLoader开发——Flash编程

ops/2025/3/15 7:50:29/

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。

老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师:

简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身边有这样灵性的人,一定要好好珍惜他们眼中有神有光,干净,给人感觉很舒服,有超强的感知能力有形的无形的感知力很强,能感知人的内心变化喜欢独处,好静,清静,享受孤独,不打扰别人不喜欢被别人打扰,在自己人世界里做着自己喜欢的事。

时间不知不觉中,来到新的一年。2024结束,2025开始新的忙碌。成年人的我也不知道去哪里渡自己的灵魂,独自敲击一些文字算是对这段时间做一个记录。

在这里插入图片描述

一、背景信息

在介绍ECU BootLoader开发组成时,提到了Flash编程程序开发是Bootloader开发的重要一环,本文主要总结一下Flash编程相关的内容和注意点。

1、Flash模块

与其他底层控制驱动开发一样,Flash编程开发也依赖具体芯片的Flash模块,因此在Flash编程前需了解编程芯片Flash模块各寄存器的相关内容。

通常来说,对Flash模块寄存器的操作有模块配置、读写操作、中断处理等。例如MC9S12类芯片FCLKDIV寄存器用于时钟配置,FCCOBHI、FCCOB、FSTAT等寄存器用于读写操作控制, FERCNFG、FERSTAT等寄存器用于中断处理等。

Flash编程开发依赖于特定芯片的Flash模块。因此,在开发之前,必须深入了解目标芯片的Flash模块及其寄存器。这些寄存器通常用于模块配置、读写操作控制以及中断处理等。

寄存器操作

模块配置寄存器:如MC9S12类芯片的FCLKDIV寄存器,用于配置Flash模块的时钟。

读写操作控制寄存器:如FCCOBHI、FCCOB(Flash Command Code Buffer High/Low,Flash命令代码缓冲区高/低)和FSTAT(Flash Status,Flash状态)等,用于控制Flash的读写操作。

中断处理寄存器:如FERCNFG、FERSTAT(Flash Error Configuration/Status,Flash错误配置/状态)等,用于处理Flash操作中的中断。

2、Flash模块配置

Flash模块配置主要完成对Flash模块的时钟配置,一般按芯片用户手册定义的Flash模块时钟工作范围配置时钟分频相关值即可。

但需要注意的是有些芯片需要配置Flash等待周期相关的寄存器,一般在芯片用户手册里有Flash等待周期和时钟频率、电压范围的关系配置说明,相关配置必须符合要求,否则Flash读写操作可能会出错,甚至导致芯片运行死机。

Flash模块的配置主要涉及时钟配置和等待周期配置。

时钟配置

按照芯片用户手册中定义的Flash模块时钟工作范围,配置时钟分频相关值。这是确保Flash模块能够正常工作的基础。

等待周期配置

有些芯片需要配置Flash等待周期相关的寄存器。等待周期的配置与时钟频率和电压范围密切相关。在芯片用户手册中,通常会提供Flash等待周期与这些参数的配置说明。如果配置不当,Flash读写操作可能会出错,甚至导致芯片运行死机。

二、刷写数据

1、Flash数据读取

Flash数据读取一般直接通过地址就可以读取数据。

Flash数据读取操作相对简单,通常只需要通过指定的地址即可直接访问并读取存储在该地址的数据。这种直接访问的方式使得读取Flash数据变得高效且直接。然而,值得注意的是,尽管读取操作看似简单,但在实际应用中仍需考虑数据的完整性和一致性,特别是在多线程或多任务环境下,可能需要采取额外的同步措施来避免数据冲突。

2、Flash数据写入

对于有Flash保护机制的芯片需要先进行Flash解锁操作才可以写入数据,Flash解锁操作每个芯片都不太一样,需要按芯片用户手册操作进行。完成解锁后通过命令写入Flash数据的流程一般为:

-> 1、通过状态寄存器检查Flash状态是否为空闲状态;

-> 2、通过Flash命令操作控制寄存器写入对应命令值来激活Flash编程;

-> 3、通过地址寄存器和数据寄存器写入Flash数据或通过Flash地址直接写入数据,具体芯片操作方式会有差异,但是都需要注意写入的数据字节长度,一般有1、2、4、8等不同的字节长度配置;

-> 4、通过状态寄存器等待写入操作完成并通过状态标志位判断是否成功。

Flash解锁:

对于有Flash保护机制的芯片,在进行数据写入之前,必须先进行解锁操作。这一步骤是为了防止未经授权的写入操作对Flash内容造成破坏。解锁操作的具体流程因芯片而异,通常需要按照芯片用户手册中的指导进行。

检查Flash状态:

在写入数据之前,必须首先通过状态寄存器检查Flash是否处于空闲状态。如果Flash正在执行其他操作(如擦除或编程),则必须等待其完成后再进行写入。

激活Flash编程:

一旦确认Flash处于空闲状态,就可以通过操作控制寄存器来写入对应的命令值,从而激活Flash编程模式。这一步骤是写入数据前的必要准备。

写入数据:

在激活Flash编程模式后,就可以通过地址寄存器和数据寄存器将数据写入Flash。不同芯片在写入数据时的具体操作方式可能会有所不同,但通常都需要注意写入数据的字节长度。常见的字节长度配置包括1字节、2字节、4字节和8字节等。在写入数据时,必须确保数据的长度与芯片的要求相匹配,以避免写入错误。

等待写入完成并检查状态:

写入数据后,必须等待写入操作完成。这通常可以通过轮询状态寄存器来实现。一旦写入操作完成,就可以通过检查状态标志位来判断写入是否成功。如果写入失败,可能需要根据芯片用户手册中的指导进行相应的错误处理。

例如按word类型字节长度进行Flash数据写入的函数大致内容如下,虽然不同芯片寄存器会有差异,但流程差异不大。

byte FlashWriteWord(word address,word data)
{
if(当前Flash无操作)
{
关闭其他中断
ErrorFlag标志位 = 操作Mask; // 清零所有Error标志位

    ......// 配置相关寄存器,如有些芯片需先写入命令寄存器序列命令寄存器 = 写操作命令值;     // 将写操作命令值写入对应的操作命令寄存器Flash地址寄存器 = address;    // 将要进行Flash编程的地址写入对应地址寄存器Flash数据寄存器 = data;       // 将要进行Flash编程的数据写入对应数据寄存器Status寄存器 = 操作Mask;      // 清除Flash操作状态寄存器,有些芯片会同时触发写入操作while (!Status寄存器完成标志位); // 等待以上操作完成 打开其他中断return (FLASH_OK);             // 写入操作成功完成 
}
else
{return (FLASH_BUSY);           // 当前Flash状态忙
}

}

3、Flash数据擦除

芯片的Flash数据的擦除操作一般和写入操作类似,只是使用的寄存器和命令值不同,一般采用按Block或按Sector方式来擦除Flash数据。

需要注意的是Flash数据写入或擦除操作时,不要进行Flash数据读取操作,因为容易出现操作处理阻塞从而造成运行异常。

Flash数据擦除

Flash数据的擦除操作是Flash编程中的另一个重要环节。与写入操作类似,擦除操作也需要通过特定的寄存器和命令值来完成。不同之处在于,擦除操作通常是按照Block(块)或Sector(扇区)的方式来进行的。

擦除方式:按Block或Sector擦除是Flash擦除操作的两种主要方式。Block通常包含多个Sector,而Sector则是Flash存储单元的基本擦除单位。开发者需要根据具体的应用需求选择合适的擦除方式。

擦除流程:擦除Flash数据的流程与写入操作相似,包括检查Flash状态、激活擦除命令、等待擦除完成以及检查擦除状态等步骤。在擦除过程中,同样需要注意不要进行Flash数据读取操作,以避免操作处理阻塞和运行异常。

注意事项:在进行Flash擦除操作时,务必确保擦除区域不包含重要数据或已做好数据备份。因为一旦擦除操作完成,被擦除区域的数据将无法恢复。

4、Flash中断处理

一般芯片对于Flash模块都有操作状态切换中断和错误检测中断。

对于操作状态切换中断,可以用来跳出擦写等待状态,当然也可以通过轮询查看标志位来退出等待。

对于错误检测中断,Flash数据写入和擦除操作前应打开相关中断,这样结合错误检测中断就可以处理擦写过程中出现的异常。

Flash模块的中断处理对于确保Flash操作的稳定性和可靠性至关重要。芯片通常提供操作状态切换中断和错误检测中断来处理Flash操作中的各种情况。

操作状态切换中断:此中断可用于跳出擦写等待状态。当Flash操作状态发生变化时(例如,从擦写状态切换到空闲状态),中断将被触发。开发者可以利用此中断来及时响应Flash操作状态的变化,从而优化程序的执行效率。

错误检测中断:在Flash数据写入和擦除操作前,应打开相关错误检测中断。这样,一旦在擦写过程中出现异常(如电源故障、编程错误等),错误检测中断将被触发,开发者可以在中断处理函数中采取相应的错误处理措施。

中断标志位清除:在中断处理函数中,务必及时清除相关中断标志位。这是为了确保中断系统能够正常工作,避免因为中断标志位未被清除而导致后续中断无法被正确触发。

关闭不必要的中断:在Flash数据擦写操作期间,建议关闭其他不必要的中断。这是为了避免因其他中断的干扰而引起Flash操作时序错误,从而影响Flash操作的稳定性和可靠性。

需要注意在相关中断处理函数中需及时清除相关中断标志位。另外,在Flash数据擦写操作期间应关闭其他不必要的中断,避免因其他中断引起Flash操作时序错误。

其他注意点

-> 1)Bootloader对APP程序进行Flash编程后,如APP程序启动地址发生变化,需更新对应APP程序的启动地址。

-> 2)Bootloader进行Flash编程时一般不需要进行地址转换,但是对于一些有分页型号的芯片和外部Flash,需要先将逻辑地址转换为物理地址再操作。

-> 3)Flash编程应注意合理配置看门狗时间,避免看门狗设置不合理造成Flash数据擦写过程出现异常复位。

-> 4)Flash擦写次数有限,应注意编程次数,避免过度使用。

Flash编程操作与芯片底层强相关,虽然各芯片Flash编程的流程都差不多,但在进行Flash编程前一定要确认编程的Flash各寄存器的具体要求和限制。

在这里插入图片描述

搁笔分享完毕!

愿你我相信时间的力量

做一个长期主义者


http://www.ppmy.cn/ops/165882.html

相关文章

MongoDB集合(表)自动创建机制

开发项目时,要整理上线涉及的表,MongoDB里新创建的表是不用整理发给运维的,因为代码中插入数据时,MongoDB会自动创建哦 MongoDB 中的集合(表)是在插入数据时自动创建的。当你第一次向一个不存在的集合插入…

vue-next-admin修改配置指南

目录 1.如何开启侧边栏logo 2.修改侧边栏顶部的logo与文字 3.修改侧边栏路由logo 4.浏览器标题栏图标与文字修改 5.修改侧边栏的背景颜色、顶部导航栏背景颜色、字体颜色、激活时颜色等 6.去除或添加修改右上方放大、信息、头像昵称(登录获取之后存储进行修改图…

网络安全——SpringBoot配置文件明文加密

XTHS:第一步、XTHS:第二步、XTHS:第三步、XTHS:第四步 !就可以实现了。(但是前提,你要先对你的文本进行加密,然后按照ENC(加密文本),放到配置文件中) 一、前言…

自学网络安全(黑客技术)2025年 —90天学习计划

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“…

路由器配置命令

路由器配置命令 小明啊,你不是学计算机的嘛,叔叔家的路由器坏了,可以过来帮叔叔看看吗 命令可以用缩写,造就一堆容易造成歧义的缩写,比如add是address的缩写,sh是shutdown的缩写。 视图模式介绍 普通视…

Dask:Python高效并行计算利器

Dask:Python高效并行计算利器 Dask是一个开源的Python并行计算库,旨在扩展Python常用工具(如NumPy、Pandas、Scikit-learn等)的功能,使其能够处理更大规模的数据集和更复杂的计算任务。它通过动态任务调度和分布式计算…

测试微店商品详情接口(micro.item_get)返回数据的完整指南

在电商开发中,确保接口的稳定性和返回数据的准确性是至关重要的。微店的 micro.item_get 接口允许开发者通过商品 ID 获取商品的详细信息,包括标题、价格、库存、描述、图片等。本文将详细介绍如何测试该接口的返回数据,包括测试流程、代码实…

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前,工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网,当大模型开始设计蛋白质结构,这个驱动大国重器研发的核心领域,却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…