【dsPIC33E】内部Flash读写

2024-05-24 06:18
文章标签 读写 flash 内部 dspic33e

本文主要是介绍【dsPIC33E】内部Flash读写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于某些安全考虑或者降成本,我们不希望使用外部存储器件,但有时我们由需要记录一下参数,确保断电不丢失,这时,富余的内部代码存储Flash就派上用场了。

不同于外部存储器,几乎所有的内部Flash读写都十分麻烦,甚至需要使用到汇编。

下面我们将讲述dsPIC33E如何读写内部Flash,此处以dsPIC33EP256GP506为例。

 

示例代码下载:https://download.csdn.net/download/u010875635/10821230

 

在操作Flash之前,我们有必要下了解一下Flash的结构,注意以下几点:

1、dsPIC33E/PIC24E闪存程序存储器被分段为页和行,每页1024个指令字,每行128个指令字,部分器件不支持行

2、dsPIC33E/PIC24E闪存程序存储器支持128/2个保持寄存器以一次对存储器的一行/双指令字进行编程

3、dsPIC33E/PIC24E每个指令字为24位,占2个16为,最高8位为虚字节

4、 dsPIC33E/PIC24E每个指令字占2个地址,例如0x000000和0x000001都是表示第一个指令字

5、对于大多数应用,24位中的高8位不用于存储数据,建议便成为NOP指令或者非法操作码值

6、地址总是偶数呈现,读取奇数地址获取到的与前一个偶数时一致的,所以读取奇数地址没有意义

 

dsPIC33E/PIC24E操作Flash相关的几个寄存器。

1、TBLPAG:表地址页位,8位表地址页位与W寄存器组组合形成23位有效程序存储器地址加上一个字节选择位

2、 每个地址数据由2个字合并而成,由以下四个寄存器操作

        TBLRDL:表读低位字

        TBLWTL:表写低位字

        TBLRDH:表读高位字

        TBLWTH:表写高位字

 

程序存储器分为很多个表页,表页地址为TBLPAG,占据地址高8位(共24位),表页不同于Flash的擦除页。表页内部地址为16位的有效地址,占据低16位,所以一个表页大小为0x010000

 表操作地址生成,有TBLPAG和来自Wn的16位组合成24位的有效地址,7-->0  15------>0

读相关操作较为简单,只需要写入TBLPAB和TBLRDL或TBLRDH然后读取即可

写相关操作较为复杂,允许一次擦除1页(8行),运行一次编程1行,或者编程2个指令字字。

注意擦除和编程都是边沿对齐的,从存储器起始开始,分别以1024指令字和128或2指令字作为边界,即,擦除的地址单位长度为0x400,例如擦除0-0x0003ff,0x000400-0x0007ff;编程的地址单位长度为0x80或者0x04,例如,编程0-0x00007f,0x000080-0x0000ff或者0x000080-0x000083

 在程序存储器的最后一页上执行页擦除操作会清零闪存配置字,从而使能代码保护。因此,用户应避免在程序存储器的最后一页上执行页擦除操作。

要执行编程操作,必须先将其对应的整页(1024个指令字)全部擦除,然后重新编程,所以一般操作流程如下:
                     1、读取闪存程序存储器的一页,并将其作为数据镜像存储到RAM中,RAM镜像必须从1024字程序存储器的偶地址边界读取
                      2、用新的数据更新RAM中的数据镜像
                      3、擦除闪存存储器页
                                 a)设置NVMCON寄存器以擦除一页
                                 b)禁止中断
                                 c)将要擦除页的地址写入NVMADRU和NVMADR寄存器(可以是该页任意地址)
                                 d)将秘钥序列吸入NVMKEY寄存器,以使能擦除
                                 e)将NVMCON<15>的WR位置1,启动擦除周期
                                 f)擦除周期结束时WR位清零
                                 g)允许中断
                       4、用表写操作将128或者2个指令字的一行或双指令字从RAM装入写锁存器
                       5、对一行或者2个指令字进行编程
                                 a)设置NVMCON以编程一行
                                 b)禁止中断
                                 c)将要编程行或第一个字的地址写入NVMADRU和NVMADR寄存器
                                 d)将秘钥序列吸入NVMKEY寄存器,以使能编程周期
                                 e)将NVMCON<15>的WR位置1,启动编程周期
                                  f)编程周期结束时WR位清零
                                  g)允许中断
                      6、重复4-6步骤,对多个数据进行编程,直到一页编程完成
                      7、根据需要,重复1-6,对多页进行编程

关联寄存器如下:
              NVMCON:主控制寄存器,选择执行擦出还是编程操作
              NVMKEY:只写寄存器,防止闪存被误写或者误擦除,编程或擦除前必须执行解锁序列,解锁期间禁止中断,①将0x55写入NVMKEY;②将0xAA写入NVMKEY;③执行2条NOP指令④一个周期中写入NVMCON寄存器

 

写锁存器长度与器件有关,要参考对应器件的Datasheet。

dsPIC33E通用flash存储结构如下:

 

 

dsPIC33EP256GP506存储结构如下:

这篇关于【dsPIC33E】内部Flash读写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/997607

相关文章

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

10. 文件的读写

10.1 文本文件 操作文件三大类: ofstream:写操作ifstream:读操作fstream:读写操作 打开方式解释ios::in为了读文件而打开文件ios::out为了写文件而打开文件,如果当前文件存在则清空当前文件在写入ios::app追加方式写文件ios::trunc如果文件存在先删除,在创建ios::ate打开文件之后令读写位置移至文件尾端ios::binary二进制方式

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

什么是 Flash Attention

Flash Attention 是 由 Tri Dao 和 Dan Fu 等人在2022年的论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 中 提出的, 论文可以从 https://arxiv.org/abs/2205.14135 页面下载,点击 View PDF 就可以下载。 下面我

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,