今日学习使用MSP432的片内flash存储相关内容
目录
MSP432片内存储资源:
添加头文件:
相关函数学习认识:
现在,我们看下存储器。在 MSP432P 系列的首个器件: MSP432P41R 上,内置的存储器Flash 容量为 256 KB 。该 Flash 的运行频率为 16MHz ,同时它还包含一个 128 位的缓冲区,并支持预取指机制,以实现执行性能的加速。此外, MSP432P41R 还附带 64 KB 的 SRAM 存储器。这 64 KB 存储器可划分为 8 个存储器区域,每个区域各 8 KB 的 SARM 。如此一来,您便可分别控制每个 SRAM 区域的供电,从 而优化整个系统的功耗。MSP432 还配有 32KB 的 ROM ,而 ROM 中则预存储了强大的 MSP432 外设驱动库 API 。这 些 API 通过相互集成,可有效地减小应用的空间。同时,从 ROM 存储器取值并运算所需的功率较低,同时它还能够提供最高 48MHz 的访问频率,因而调用存储在 ROM 中的外设驱动库可享受到上述诸多优点。此外, MSP432 还内置了引导加载程序(或称 BSL )。 BSL 会预编程到闪存中,但您也可选择使用自定义的 BSL 。尽管如此,出厂 的 BSL 仍支持共计三种串行通信接口,即 UART 、I2C 和 SPI 。因此,当无法进行 JTag 访问时,还可借助该串行通信机制来进行固件的现场更新。
首先,我们来看一下闪存。MSP432 所采用的闪存架构将闪存划分为两个区域。每个区域 的容量为 128KB 。同时,每个区域的闪存也被分为多个扇区,且每个扇区的大小为 4KB 。如此一来,用户便可以针对每个扇区,分别控制擦除和写入操作,也可分别对每个扇区进行保护或取消保护等操作。因此,您可以在对整个存储器执行大规模擦除操作时,轻松地单独保护某些重要的闪存扇区。由于闪存被划分为两个独立的区域,开发人员便可以实现两个闪存区域的交互工作,比如对某一个区域的闪存执行读取操作时,同时对另一个区域的闪存执行擦除或者编程操作。如此一来,用户的应用便不会在闪存的操作上浪费任何时间,可以在更新闪存内容的同时,并行地执行代码。
如前文所述,闪存能以最高 16MHz 的速度访问。因此当系统以高于此速度的频率(最高为 48MHz )运行时,便需借助缓冲器来提升闪存的有效访问速度。有鉴于此,我们实现了 128 位的缓冲器,以便 CPU 将指令预取指到缓冲器中,以便实现高于 16MHz 的执行速度
MSP432 共配有 64KB 的 RAM 存储器。 64KB 的 RAM 会划分为八个可动态配置的 RAM 组,每组为 8KB 内存。对于每个 RAM 组,均提供两种面向于优化功耗的选项:完全启用 / 禁用相关组:从而使能或者关断相关 RAM 组,以便在活跃模式下获得最佳功耗。保留 / 不保留相关组内容:在 LPM3 模式中,选择保留或不保留某一 RAM 组中的内容,从而尽可能降低 SRAM 的泄漏功耗。共计有八个 SRAM 分组可在活跃模式下处于工作状态,对于选择不保留内容的 SRAM 组,可在活跃模式下动态的忽略内容,并在器件进入 LPM3 模式后关闭相关的 SRAM 组。如此一来,便可降低该器件的 SRAM 泄漏功耗。最终,可显著降低器件的总功耗。
MSP432 遵循标准的 Cortex-M 内存映射机制。首先,位于存储器首地址 ( 0x00) 的是内置的闪存,此处包括中断向量表和用户的应用代码。继而是位于 0x01000000 地址的 ROM 存储器,其中存有 MSP432 的外设驱动程序库(即 DriverLib )。接下来的是位于 0x2000000 地址的 SRAM 存储器,该处存储器支持通过 Bit-Band 方式进行独立的位访问。接着是位于0x40000000 地址的外部寄存器,它也支持通过 Bit-Band 方式对每个外部寄存器的每个位进行单独访问。最后但也很重要的是,我们还配有检测和调试接口。此类寄存器位于从0xE0000000 地址开始的内存映射末段。
首先添加头文件以下是有关#include "flash.h"头文件的目录(以空项目工程为例):
说明:相关函数过多,因此另起文章说明学习了:
#include "flash.h"
MSP432 #include “flash.h“ 相关函数解释学习_NULL指向我的博客-CSDN博客
1.启用闪存读取缓冲区功能。
ROM_FlashCtl_enableReadBuffering
((void (*)(uint_fast8_t memoryBank,uint_fast8_t accessMethod))ROM_FLASHCTLTABLE[2])
2.禁用闪存读取缓冲区功能。
ROM_FlashCtl_disableReadBuffering
((void (*)(uint_fast8_t memoryBank,uint_fast8_t accessMethod))ROM_FLASHCTLTABLE[3])
3.取消保护指定扇区。
ROM_FlashCtl_unprotectSector
((bool (*)(uint_fast8_t memorySpace,uint32_t sectorMask))ROM_FLASHCTLTABLE[4])
4.检查指定扇区是否受保护。
ROM_FlashCtl_isSectorProtected
((bool (*)(uint_fast8_t memorySpace, uint32_t sector))ROM_FLASHCTLTABLE[6])
5.验证指定内存地址区域的数据。
ROM_FlashCtl_verifyMemory
((bool (*)(void* verifyAddr,uint32_t length,uint_fast8_t pattern))ROM_FLASHCTLTABLE[7])
6.执行全片擦除操作。
ROM_FlashCtl_performMassErase
((bool (*)(void))ROM_FLASHCTLTABLE[8])
7.擦除指定扇区。
ROM_FlashCtl_eraseSector
((bool (*)(uint32_t addr))ROM_FLASHCTLTABLE[9])
8.将数据编程到目标内存地址中。
ROM_FlashCtl_programMemory
((bool (*)(void* src,void* dest,uint32_t length))ROM_FLASHCTLTABLE[10])
9.设置编程验证模式。
ROM_FlashCtl_setProgramVerification
((void (*)(uint32_t verificationSetting))ROM_FLASHCTLTABLE[11])
10.清除编程验证设置。
ROM_FlashCtl_clearProgramVerification
((void (*)(uint32_t verificationSetting))ROM_FLASHCTLTABLE[12])
11. 启用字编程模式。
ROM_FlashCtl_enableWordProgramming
((void (*)(uint32_t mode))ROM_FLASHCTLTABLE[13])
12.禁用字编程模式。
ROM_FlashCtl_disableWordProgramming
((void (*)(void))ROM_FLASHCTLTABLE[14])
13.检查字编程模式是否启用。
ROM_FlashCtl_isWordProgrammingEnabled
((uint32_t (*)(void))ROM_FLASHCTLTABLE[15])
14.启用闪存控制器中断。
ROM_FlashCtl_enableInterrupt
((void (*)(uint32_t flags))ROM_FLASHCTLTABLE[16])
15.禁用闪存控制器中断。
ROM_FlashCtl_disableInterrupt
((void (*)(uint32_t flags))ROM_FLASHCTLTABLE[17])
16.获取使能的中断状态
ROM_FlashCtl_getEnabledInterruptStatus
((uint32_t (*)(void))ROM_FLASHCTLTABLE[18])
17.获取中断状态
ROM_FlashCtl_getInterruptStatus
((uint32_t (*)(void))ROM_FLASHCTLTABLE[19])
18.清除中断标志
ROM_FlashCtl_clearInterruptFlag
((void (*)(uint32_t flags))ROM_FLASHCTLTABLE[20])
19.设置等待状态
ROM_FlashCtl_setWaitState
((void (*)(uint32_t bank,uint32_t waitState))ROM_FLASHCTLTABLE[21])
20.获取等待状态
ROM_FlashCtl_getWaitState
((uint32_t (*)(uint32_t bank))ROM_FLASHCTLTABLE[22])
21.设置读取模式
ROM_FlashCtl_setReadMode
((bool (*)(uint32_t flashBank,uint32_t readMode))ROM_FLASHCTLTABLE[23])
22.获取读取模式
ROM_FlashCtl_getReadMode
((uint32_t (*)(uint32_t flashBank))ROM_FLASHCTLTABLE[24])
23.重新屏蔽数据(8位数据,写入后)
ROM___FlashCtl_remaskData8Post
((uint8_t (*)(uint8_t data,uint32_t addr))ROM_FLASHCTLTABLE[27])
24.重新屏蔽数据(8位数据,写入前)
ROM___FlashCtl_remaskData8Pre
((uint8_t (*)(uint8_t data,uint32_t addr))ROM_FLASHCTLTABLE[28])
25.重新屏蔽数据(32位数据,写入前)
ROM___FlashCtl_remaskData32Pre
((uint32_t (*)(uint32_t data,uint32_t addr))ROM_FLASHCTLTABLE[29])
26.重新屏蔽数据(32位数据,写入后)
ROM___FlashCtl_remaskData32Post
((uint32_t (*)(uint32_t data,uint32_t addr))ROM_FLASHCTLTABLE[30])
27.重新屏蔽批量数据(写入前)
ROM___FlashCtl_remaskBurstDataPre
((void (*)(uint32_t addr,uint32_t size))ROM_FLASHCTLTABLE[31])
28.重新屏蔽批量数据(写入后)
ROM___FlashCtl_remaskBurstDataPost
((void (*)(uint32_t addr,uint32_t size))ROM_FLASHCTLTABLE[32])
29.开始扇区擦除
ROM_FlashCtl_initiateSectorErase
((void (*)(uint32_t addr))ROM_FLASHCTLTABLE[33])
30.开始全片擦除
ROM_FlashCtl_initiateMassErase
((void (*)(void))ROM_FLASHCTLTABLE[34])