ECU BootLoader开发——Flash编程

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

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

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

时间不知不觉中,来到新的一年。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.rhkb.cn/news/33385.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NetLink内核套接字案例分析

一、基础知识 Netlink 是 Linux 系统中一种内核与用户空间通信的高效机制,而 Netlink 消息是这种通信的核心载体。它允许用户态程序(如网络配置工具、监控工具)与内核子系统(如网络协议栈、设备驱动)交换数据&#xff…

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址,每次启动虚拟机服务都是不一样的 IP,因此要配置静态 IP 地址避免每次都发生变化,下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念: 动态 IP…

开源:LMDB 操作工具:lmcmd

目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB(Lightning Memory-Mapped Database)是一种高效的键值存储数据库,基于内存映射(memory-mapping)技术,提供…

进程管理:前后台切换

前后台切换 [rootxxx ~]# yum install -y xclock #安装xclock(这里是用来解释前后台) [rootxxx ~]# xclock -update 1 #前台运行(如果把1改成2,就是秒针两秒走动一次) [rootxxx ~]# xclock -update 1…

【CF】Day6——Codeforces Round 942 (Div. 2) BC + Codeforces Round 941 (Div. 2) C

B. Coin Games 题目: 思路: 虽然标签是博弈论,但我感觉更像一个找规律的思维题 由于题目告诉我们每次只能选U,那我们不妨来考虑选U会造成什么情况(以下都为选中间U) ①.UUU -3*U 此时选了U会导致两侧…

视频推拉流EasyDSS案例分析:互联网直播/点播技术与平台创新应用

随着互联网技术的快速发展,直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域,互联网直播/点播平台与技术的应用,不仅为用户带来了全新的购物体验,也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

鸿蒙初级考试备忘

Module类型 Module按照使用场景可以分为两种类型: Ability类型的Module: 用于实现应用的功能和特性。每一个Ability类型的Module编译后,会生成一个以.hap为后缀的文件,我们称其为HAP(Harmony Ability Package&#x…

【QT】文件系统相关 -- QFile

一、Qt 文件概述 🔥 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库,提供了跨平台的文件操作能力。Qt 提供了很多关于⽂件的类,通过这些类能够对文件系统进行操作,如文件读写、文件信息获取、文件制或重命名等 二、输…

EasyCVR安防视频汇聚平台助力工业园区构建“感、存、知、用”一体化智能监管体系

在现代工业园区的安全管理和高效运营中,视频监控系统扮演着不可或缺的角色。然而,随着园区规模的扩大和业务的复杂化,传统的视频监控系统面临着诸多挑战,如设备众多难以统一管理、数据存储分散、智能分析能力不足、信息利用率低下…

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中,配置useNormalizedOHMUrl属性为true (我这项目创…

Tcp网络通信的基本流程梳理

先来一张经典的流程图 接下介绍一下大概流程,各个函数的参数大家自己去了解加深一下印象 服务端流程 1.创建套接字:使用 socket 函数创建一个套接字,这个套接字后续会被用于监听客户端的连接请求。 需要注意的是,服务端一般有俩…

Nexus File类型Blob Stores迁移至Minio操作指南(下)

#作者:闫乾苓 文章目录 迁移步骤停止nexus3服务备份nexus原始数据修改Blob Stores中元数据文件中类型为s3将Blob Stores中的二进制构件文件数据复制s3(minio)存储修改OrientDB中相关Blob Stores的属性修复OrientDB的文件权限开启nexus3服务迁…

mapbox基础,使用线类型geojson加载symbol符号图层,用于标注文字

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️symbol符号图层样式1.4 ☘️line线图层…

《C语言中“输入魔法师”:scanf函数的奥秘与技巧》

🚀个人主页:fasdfdaslsfadasdadf 📖收入专栏:C语言 🌍文章目入 一、引言二、scanf函数的基本语法三、格式说明符的种类及用法(一)整数输入(二)浮点数输入(三&…

Quickwit+Jaeger+Prometheus+Grafana搭建Java日志管理平台

介绍 生产服务应用可观测性在当下比较流行的方案,其中出现了大量高性能、开箱即用、易上手的的开源产品,大大丰富了在可观测性领域产品的多样性,本文讲述基于OTLP协议推送Java项目遥测数据(日志、指标、链路)到后端存储…

Unity Timeline 扩展

这里认为大家已经会timeline的基本使用了,只介绍怎么自定义扩展。 第一步.自定义Track 首先要自定义一条轨道。剪辑是要在轨道里跑的,系统自带的轨道我们加不了自定义剪辑,得新建自己用的。这个很简单。 [TrackClipType(typeof(TransformTw…

文生图技术的演进、挑战与未来:一场重构人类创造力的革命

摘要 文生图(Text-to-Image Generation)技术作为生成式人工智能(Generative AI)的核心分支,正在以颠覆性力量重塑内容生产范式。本文系统梳理文生图技术从早期实验到多模态大模型的演进路径,分析其在设计、…

如何手动使用下载并且运行 QwQ-32B-GGUF

首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…

SPring 学习积累1 关于下载相关jdk maven 版本

3.15.1 注意下载的版本 有些是不适配的,官网有提示; 3.15.2 注意配置环境变量时需要注意admistartor 中的java路径和系统变量是否一致,一行要一致,不然后续安装maven之后,使用命令 mvn -version时会显示以下错误&…

Excel(函数篇):Vlookup函数 详细用法

目录 Vlookup函数基础用法精确查找易错问题员工信息查询表 进阶用法近似匹配(模糊查找)结合通配符查找反向查找 高级技巧多条件查找动态列查询 错误处理屏蔽错误值处理数字/文本格式问题注意事项常见错误解决方案 拓展用法跨表与跨工作簿查找查找返回多列…