Advertisement

AT45 系列 Flash 读写

  • 5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:TXT


简介:
AT45系列Flash读写速度相较于前代版本显著提升;其支持在2.8V的低电压工作状态中稳定运行,并具备高度的稳定性保障;适用于对性能要求极高的存储系统设计。#### 一、AT45DB Flash简介 AT45DB系列Flash存储器是由美国Atmel公司推出的串行闪存芯片,遵循SPI(Serial Peripheral Interface)通信协议,在需要大容量、非易失性存储的应用场景中发挥重要作用。该系列存储器提供多种基本操作功能,包括读取、编程和擦除,并配备两个内部缓存单元,显著提升了数据处理的灵活性和效率。 #### 二、SPI接口及通信协议 SPI采用同步式串口协议实现低延迟的高速数据通信。在 SPI 系统中,主设备与辅助设备之间通过特定信道进行数据传输。AT45DB 单片机与其配套电路构成 SPI 接口中,具体工作方式如下: - **主输出/从输入模式**:主设备向辅助设备传输数据。 - **双向通信模式**:支持单向或双向的数据传递。 - **时钟同步机制**:通过 SCK 信号实现设备间的精确时间对准。 - **选件控制功能**:SS 信号可配置辅助设备的运行状态。 #### 三、AT45DB081读写控制 具体型号是AT45DB081,属于AT45DB系列。该芯片的容量为8Mbit。详细说明该芯片的读写控制命令及其实现机制: - **DF_RESETP4&=~0x10; P4|=0x10**:将AT45DB081设为复位状态。 - **DF_RDY_BUSY**:通过读取P4端口的特定位来判断AT45DB081是否处于忙碌状态。 - **DF_CHIP_SELECT**:激活AT45DB081芯片的选中功能。 - **DF_CHIP_NOSELECT**:关闭AT45DB081芯片的选中功能。 - **BUFFER_1_WRITE (0x84)**:使用字节序号0x84将数据存储至Buffer 1中。 - **BUFFER_2_WRITE (0x87)**:通过字节序号0x87将数据存储至Buffer 2中。 - **BUFFER_1_READ (0x54)**:使用字节序号0x54获取Buffer 1中的数据。 - **BUFFER_2_READ (0x56)**:通过字节序号0x56获取Buffer 2中的数据。 - **B1_TO_PAGE_WITH_ERASE (0x83)**:将缓冲区的数据复制到主存页中,并带有清除指令。 - **B2_TO_PAGE_WITH_ERASE (0x86)**:将缓冲区二的数据复制到主存页中,并带有清除指令。 - **B1_TO_PAGE_WITHOUT_ERASE (0x88)**:将缓冲区一的数据复制到主存页中,未带清除指令。 - **B2_TO_PAGE_WITHOUT_ERASE (0x89)**:将缓冲区二的数据复制到主存页中,未带清除指令。 - **PAGE_PROG_THROUGH_B1 (0x82)**:利用缓冲区B1将数据输入到主存页。 - **PAGE_PROG_THROUGH_B2 (0x85)**:利用缓冲区B2将数据输入到主存页。 - **AUTO_PAGE_REWRITE_THROUGH_B1 (0x58)**:通过缓冲区B1自动更新主存页。 - **AUTO_PAGE_REWRITE_THROUGH_B2 (0x59)**:通过缓冲区B2自动更新主存页。 - **PAGE_TO_B1_COMP (0x60)**:比较主存页与缓冲区B1中的数据内容。 - **PAGE_TO_B2_COMP (0x61)**:比较主存页与缓冲区B2中的数据内容。 - **PAGE_TO_B1_XFER (0x53)**:将主存页的数据传输至缓冲区B1。 - **PAGE_TO_B2_XFER (0x55)**:将主存页的数据传输至缓冲区B2。 - **STATUS_REGISTER (0x57)**:读取状态寄存器的当前信息。 - **MAIN_MEMORY_PAGE_READ (0x52)**:从主内存中获取特定页面的数据内容。 第四章 SPI数据发送功能```c void SendSPIByte(unsigned char ch) { SPIF = 0; SPI0DAT = ch; while (SPIF == 0); 等待数据发送完成 } ``` 该功能利用 SPI 接口传输一个字节的数据。通过配置_SPIF_置为 0 实现发送过程的初始化;随后将待发送的数据存储至 _SPI0DAT_ 寄存器中;最后执行循环操作以等待 _SPIF_ 状态变为 1,表示数据已成功传送完毕。通过研究AT45DB081的SPI总线读写控制功能,深入理解了该微控制器具备一系列强大的功能指令集。这些指令具体包括支持队列操作、主存储器的读写操作以及数据对比功能。通过这些指令能够高效地实现对闪存的读写管理,适用于多种实际需求场景。同时,基于 SPI 接口的通讯模块设计能够确保数据传输过程快速且具有可靠性。

全部评论 (0)

还没有任何评论哟~
客服
客服
  • TMS570LSFlash操作
    优质
    简介:TMS570LS系列提供高效可靠的闪存存储解决方案,涵盖多种Flash读写操作功能。此系列微控制器支持灵活的数据处理与安全特性,适用于汽车电子和其他嵌入式系统。 ### TMS570LS系列FLASH读写操作 #### 知识点概述 本段落档针对在调试TMS570LS系列微控制器读写片内FLASH BANK0时遇到的问题进行了详细的分析与解决。TMS570LS是德州仪器(TI)推出的一款高性能安全微控制器,广泛应用于汽车电子、工业自动化等领域。该系列微控制器集成了多种安全特性,并提供了丰富的外设资源,包括片上闪存。在进行固件开发的过程中,正确地管理和操作片内闪存对于确保系统的稳定性和安全性至关重要。 #### 问题现象及原因分析 在对TMS570LS系列中的不同型号进行测试时,发现了一个共同的问题:当尝试读写BANK0时,首次执行erase操作就会触发“undefEntry”异常,导致程序异常终止。进一步分析后确定了以下几点: - **测试3137**:该型号具有BANK0和BANK1两个闪存区,其中BANK1的操作一切正常,但BANK0在初次执行erase操作时出现问题。 - **测试1224**:这款型号仅包含BANK0,在进行BANK0的第一次erase操作时出现同样的错误。 - **原因**:根据TI提供的文档(SPNU501.pdf)第2.3.4节所述,使用F021 Flash API无法直接操作自身所在的位置,即BANK0。 #### 解决方案详解 为了解决上述问题,需要对编译链接器脚本进行调整,以便将Flash API相关的代码移动到RAM中执行。具体的解决方案分为以下几个步骤: 1. **增加FLASH API内容空间分配**:在编译链接器脚本(cmd文件)中添加了新的段`FLASH_API`,用于存储Flash API相关的代码。此段定义如下: ```plaintext MEMORY { VECTORS(X): origin=0x00000000 length=0x00000020 FLASH_API(RX): origin=0x00000020 length= 6KB FLASH1(RX): origin=... // 具体大小根据微控制器型号而定 SRAM(RW): origin=... STACK(RW): origin=... } SECTIONS { .intvecs:{} >VECTORS flashAPI: { ..DebugupdatesrcFapi_UserDefinedFunctions.obj(.text) ..Debugupdatesrcbl_flash.obj(.text) --library=..updatelibF021_API_CortexR4_BE.lib< FlashStateMachine.IssueFsmCommand.obj FlashStateMachine.SetActiveBank.obj FlashStateMachine.InitializeFlashBanks.obj FlashStateMachine.EnableMainSectors.obj Init.obj Utilities.CalculateEcc.obj Utilities.WaitDelay.obj Utilities.CalculateFletcher.obj Read.MarginByByte.obj Read.Common.obj Read.FlushPipeline.obj Async.WithAddress.obj Program(obj>(.text) } load=FLASH_API, run=SRAM, LOAD_START(api_load), RUN_START(api_run), SIZE(api_size) .text>FLASH1 .const>FLASH1 .cinit>FLASH1 .pinit>FLASH1 .data>SARM .bss>SARM } ``` 这里定义了`FLASH_API`段的起始地址为0x00000020,长度不超过6KB,并将所有Flash API相关的对象文件和库文件链接到这个段。 2. **实现从FLASH复制API到RAM的汇编函数**:为了确保Flash API能够顺利执行,在`sys_core.asm`文件中添加一个用于将Flash API从闪存复制到RAM中的汇编函数`_copyAPI2RAM_`。具体实现如下: ```assembly ;------------------------------------------------------------------------------- ; Copy the Flash API from flash to SRAM. ; .def _copyAPI2RAM_ .asmfunc _copyAPI2RAM_ .ref api_load flash_load.word api_load .ref api_run flash_run.word api_run .ref api_size flash_size.word api_size ldr r0, =flash_load ldr r1, =flash_run ldr r2, =flash_size add r2, r1, r2 copy_loop1: ldr r3, [r0], #4 str r3, [r1], #4 cmp r1, r2 blt copy_loop1 bx lr .endasmfunc ;------------------------------------------------------------------------------- ``` 此函数通过循环从闪存中的`api_load`地址复制数据到RAM中的`api_run`地址,直到复制完`api_size`指定的大小为止。 3. **在启动代码中调用复制函数**:最后一步是在系统启动代码(`sys_startup.c`)中调用上述定义的`_copyAPI
  • STM32G4芯片的FLASH函数
    优质
    本文档介绍了针对STM32G4系列微控制器的Flash存储器进行读取和写入操作的函数实现方法及注意事项。 STM32G4系列片上FLASH读写函数已经封装好。可以对任意连续地址进行读写操作,并支持跨页读写功能。在数据写入过程中,会自动判断待写的区域是否为空,对于非空的区域将自行擦除该页的内容,而其他未被修改的数据则会被保留下来。由于G4系列每次写入都是以8字节为单位进行的,因此其读取函数也遵循同样的原则:所有读写操作地址必须是8的倍数。因为涉及较多判断逻辑,可能存在疏漏之处,请在发现问题时及时反馈以便后续修正和更新。
  • STM32F1内部FLASH操作
    优质
    本文介绍了如何在STM32F1系列微控制器上进行内部Flash存储器的读取和写入操作,包括编程接口、注意事项及示例代码。 STM32F1系列是意法半导体(STMicroelectronics)推出的基于ARM Cortex-M3内核的微控制器,在嵌入式系统设计领域广泛应用。该系列芯片内部配备非易失性存储器——FLASH,用于存放程序代码、配置数据和用户信息等。因此,掌握如何在STM32F1上对内部FLASH进行读写操作是开发过程中的重要技能之一。 一、STM32F1系列内部FLASH结构 通常情况下,STM32F1系列的内部FLASH被划分为多个扇区,每个扇区大小不一(如:16KB、32KB和64KB)。这些扇区间相互独立,支持单独擦除与写入操作。值得注意的是,在执行读写之前必须确保目标扇区已经正确地完成擦除步骤。 二、读取内部FLASH 从指定地址直接读取存储在STM32F1系列芯片内部FLASH中的字节是实现数据读取的基本方式。具体操作包括: 1. 配置Flash寄存器:通过设置控制寄存器(如:FLASH_ACR),可以优化读速度,例如启用预取缓冲和等待状态。 2. 指定地址范围:确定要访问的数据所在的具体内存位置,并确保该地址位于有效的内部FLASH区域内。 3. 读取数据内容:利用内存映射机制从指定的存储单元中直接获取信息。 三、写入内部FLASH 向STM32F1系列芯片内部FLASH写入数据涉及到擦除和编程两个步骤。由于其采用EPROM技术,仅支持将“1”变为“0”的操作模式,因此在进行任何写入前必须先执行扇区的完全擦除: 1. 执行擦除:通过设置Flash控制寄存器(如:FLASH_CR)中的相关标志位来启动整个扇区的清除过程。此步骤完成后需要等待一段时间。 2. 实施编程:完成上述操作后,可以开始将预先准备好的数据写入内存缓冲区域,并使用相应的编程指令进行存储更新。同样地,在这个阶段也需要监控状态寄存器以确认所有任务已经成功执行完毕。 3. 锁定与保护:为了防止意外修改或误操作导致的数据丢失问题发生,可以通过设置Flash控制寄存器中的锁定标志来限制特定区域内或者整个FLASH的访问权限。 四、示例代码 通常情况下,在开发资料中会提供一些用于演示如何实现上述功能的样例程序。这些程序包括初始化函数、擦除函数、写入函数和读取函数等,开发者可以根据自身需求对其进行调整以适应不同的应用场景。 五、重要提示 1. 在执行任何写操作之前,请务必确认目标扇区已经被正确地清除。 2. 当进行编程或擦除时应尽量避免中断发生,确保整个过程的完整性和可靠性。 3. 由于内部FLASH具有一定的使用寿命限制,在实际应用中应当合理规划数据存储策略以减少不必要的擦写次数。 4. 在操作过程中要保证稳定的电源供应条件,以免因电压不稳而导致程序失败或丢失重要信息。 综上所述,熟悉并掌握STM32F1系列芯片的内部FLASH读写机制对于开发者来说至关重要。通过学习和实践提供的示例代码可以帮助更好地理解和应用这些知识来解决实际问题。
  • NOR Flash 指南
    优质
    《NOR Flash读写指南》是一份全面介绍如何操作和管理NOR Flash存储设备的技术文档,涵盖基础概念、读写方法及应用技巧。 该文档详细区分了不同bit的NOR_FLASH在擦除、读取和写入操作上的区别。
  • STM32 内部 FLASH
    优质
    本教程详解如何在STM32微控制器上进行内部FLASH存储器的读取与写入操作,涵盖配置步骤及代码示例。适合嵌入式开发人员参考学习。 ### STM32内部FLASH详解 #### 一、概述 STM32是一款广泛应用的微控制器,以其高性能、低功耗及丰富的外围设备而受到青睐。在众多STM32系列中,STM32F103(俗称“蓝胖”)更是因其良好的性价比而成为开发者的首选。其中,内部FLASH作为STM32的重要组成部分之一,对于存储代码和数据至关重要。 #### 二、内部FLASH的作用 内部FLASH主要负责存储用户编写的程序代码,并通过下载器将编译后的代码烧录到内部FLASH中。当STM32上电或复位时,可以从内部FLASH加载并执行代码。此外,内部FLASH还支持运行时的读写操作,可用于存储掉电后需要保留的关键数据。 #### 三、内部FLASH的结构 STM32的内部FLASH由以下三个部分组成: 1. **主存储器**:这是最主要的存储区域,用于存放用户程序代码。根据不同的STM32型号,主存储器的容量也会有所不同。例如,STM32F103ZET6(大容量hd版本)拥有512KB的FLASH,分为256个页,每个页大小为2KB。在写入数据之前,需要先进行擦除操作,这一特性与常见的外部SPI-FLASH类似。 2. **系统存储区**:这部分位于地址范围0x1FFFF000至0x1FFFF7FF之间,共2KB,主要用于存储固化的启动代码,负责实现诸如串口、USB以及CAN等ISP(In-System Programming)烧录功能。这部分内容用户通常无法访问和修改。 3. **选项字节区域**:这部分位于地址范围0x1FFFF800至0x1FFFF80F之间,共有16字节。主要用于配置FLASH的读写保护、待机停机复位、软件硬件看门狗等相关设置。 #### 四、内部FLASH的管理 内部FLASH的管理涉及以下几个方面: - **页擦除**:在向内部FLASH写入新数据之前,必须先执行擦除操作。擦除操作是以页为单位进行的,这意味着如果需要修改某个位置的数据,则必须擦除整个页,并重新写入数据。 - **数据写入**:数据写入也需按照页进行。需要注意的是,一旦数据写入,除非执行擦除操作,否则无法修改该页中的数据。 - **数据读取**:读取操作则不受上述限制,可以直接访问任意地址的数据。 #### 五、读写内部FLASH的应用场景 1. **存储关键数据**:由于内部FLASH的访问速度远高于外部SPI-FLASH,在紧急状态下存储关键记录是非常实用的选择。 2. **加密与安全**:为了保护应用程序不被盗版或破解,可以在第一次运行时计算加密信息并记录到内部FLASH的特定区域,之后删除部分加密代码,以此来增强程序的安全性。 3. **配置存储**:可以将一些经常需要读取但很少更改的配置信息存储在内部FLASH中,以减少对外部存储器的依赖,并提高系统响应速度。 #### 六、注意事项 - 在进行内部FLASH操作时,务必确保遵循正确的操作流程,避免误操作导致的数据丢失。 - 对于不同型号的STM32,其内部FLASH的具体配置(如页大小、总容量等)可能有所差异,在具体操作前应仔细查阅相应的规格书或参考手册。 STM32内部FLASH不仅承担着存储程序代码的任务,还能在运行时提供灵活的数据存储解决方案,是STM32强大功能不可或缺的一部分。
  • STM32F103C8T6 内部FLASH.zip
    优质
    本资源包含STM32F103C8T6微控制器内部Flash读写操作详细说明及示例代码,适用于需要对该芯片进行程序存储和数据管理的开发者。 STM32F103C8T6 读写内部FLASH.zip 这个文件包含了关于如何使用STM32F103C8T6微控制器进行内部Flash存储器的读取和写入操作的相关资料。
  • STM32H743内部FLASH.rar
    优质
    本资源提供STM32H743微控制器内部Flash存储器读写操作的相关资料与示例代码,适用于进行嵌入式开发和测试。 STM32H743+内部FLASH读写.rar
  • STM32F013的Flash操作
    优质
    本简介详细介绍了如何在STM32F013微控制器上执行Flash存储器的读取和写入操作,包括必要的编程步骤和技术细节。 STM32F103读写内部Flash的软件经过测试,每页读写最大为1024半字或512字,均无问题。
  • STM32L4xx_内部FLASH.rar
    优质
    本资源包含STM32L4xx系列微控制器内部Flash存储器的读写操作详细介绍及示例代码,适用于嵌入式开发人员学习和参考。 使用STM32L4xx读写内部FLASH时,本人采用的是STM32L452RET6芯片,并且已经通过LL库成功配置了寄存器;由于大部分代码都是基于寄存器的设置,因此在切换到HAL库后只需稍作修改即可继续使用。后来调试了一款新的STM32L471VETx芯片时发现擦除页操作无法正常进行,经过排查最终确定问题是该系列芯片内部FLASH页面编号不连续导致的问题;解决方法是需要调整擦除函数中的页码参数设置后才能成功执行擦除操作。需要注意的是此解决方案并不适用于STM32L4x1系列的其他型号(因为它们可能有不同的内存布局),所以在使用时需针对特定型号进行相应的代码修改。