存储器,顾名思义就是用来存放东西的地方,那么对于一款 MCU 而言,在性能描述的时候,我们都会说 SRAM,Flash 的容量大小有多少。对于初学者来说,可能不会去理会这些东西,拿到东西就只用。其实不然,一颗 MCU 的内存有多大是十分重要的,其主要是用来存放代码和和数据的器件。代码为什么可以运行,代码量是多少,定义的 int、short 等等类型的变量究竟是怎么分配和存储的,这些问题都和内存有关系。此外,因此,在我们选择 MCU 进行开发的时候就要去评估其内存是否满足需求。今天,小编将带领大家一起去学习 LPC82x 系列存储器与读写保护。
首先,我们来看一下 LPC82x 系列的存储器映射(Memory Map)
存储器映射(Memory Map)是指把芯片中或芯片外的 FLASH,RAM,ROM,Peripheral 外设等进行统一编址。即用地址来表示对象。这个地址绝大多数是由厂家规定好的,用户只能用而不能改。用户只能在挂外部 RAM 或 FLASH 的情况下可进行自定义。
LPC82x 的地址空间是 4GB, 指向 2^32=4G 的地址空间,也就是 0x0000_0000——0xFFFF_FFFF 这一大块空间。
根据图中描述,Cortex-M0+ 内核将 0x0000_0000——0xFFFF_FFFF 这块 4G 大小的空间分成 6 大块:Flash、SRAM、MTB、ROM、外部设备、专用外设总线、特定厂商等。
一、FLASH 控制器
Flash 模块包括:Flash 主存储区(Main memory)、Flash 信息区(Information block),以及 Flash 存储接口寄存器区(Flash memory interface)。
针对 Flash 部分技术 Support,经常有客户会问如何控制 Flash 的访问时间和如何获得签名?
1. 控制闪存(FLASH)访问时间
- 当 ARM 时钟速度调整前,需要调整闪存访问时间
① ARM 速度 20MHz 以上,闪存访问需要 2 个系统时钟
② ARM 速度在 20MHz 及以下,闪存访问需要 1 个系统时钟
- 实例代码
typedefenum{
/*!< 1 CPU clocks Flash accesses for up to 20 MHz CPU */
FLASHTIM_20MHZ_CPU = 0,
/*!< 2 CPU clocks Flash accesses for up to 30 MHz CPU */
FLASHTIM_30MHZ_CPU = 1,
} FMC_FLASHTIM_T;
voidChip_FMC_SetFLASHAccess(FMC_FLASHTIM_T clks);
- 注意,不要在低功耗模式下调整闪存访问时间
2. 获得闪存(FLASH)内容签名
① 提供 16 字节对齐起始闪存(FLASH)地址
② 提供 16 字节对齐结束闪存(FLASH)地址,并开始计算签名
③ 等待判断签名计算完成
④ 获得 32bits 闪存内容签名
- 实例代码(计算从 0x4000 地址到 0x8000 地址的签名)
const static uint32_t FLASH_SIGNATURE_START_ADDR = 0x1000;
const static uint32_t FLASH_SIGNATURE_END_ADDR = 0x4000;
Chip_FMC_ComputeSignature(FLASH_SIGNATURE_START_ADDR,
FLASH_SIGNATURE_END_ADDR);
while(Chip_FMC_IsSignatureBusy());
uint32_t flash_signature = Chip_FMC_GetSignature(0);
二、SRAM
以下是 LPC82x 参考手册中的一段原话:
LPC824 起始地址是 0x1000 0000,终止地址是 0x1000 0050。
SRAM 的理解比较简单,其作用是用来存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,SRAM 中存储的数据就会丢失。
三、ISP(In System Programming)
ISP 由英文 In-System Programming 三个首字母组成,译成中文即:在系统编程。通过调用芯片内部固化的 Bootloader 软件实现通过 UART 串口编程片内 Flash 的功能,实现小批量固件烧录,也可以实现固件升级。
1. ISP 的通常用法 - 1
- 通过串口(USART)ISP 命令和 ISP 程序完成片上闪存(FLASH)的烧写编程
- ISP 程序运行在 ROM 中
- 进入 ISP 模式的方法
① 芯片启动时拉低管脚 P0_12
② IAP 命令“Reinvoke ISP”
- 通常用法
- 固件烧录(小批量),固件升级
- LPC82X 应用程序进入低功耗状态时,调试端口失效,无法从调试端口下载程序,而进入 ISP 模式可以通过调试端口下载用户程序
2. ISP 的通常用法 - 2
- 在用户应用代码中或者用户第二级引导程序使用 IAP 系统函数完成片上闪存(FLASH)的烧写编程
- 用户程序在 FLASH 或 RAM 中调用执行IAP系统函数
- 通常用法
① 应用程序保存外设配置数据,校准数据到 FLASH 上
② 应用程序保存用户数据到 FLASH 上
③ 第二级引导程序对应用程序升级
四、引导程序(Bootloader)
看完上面的内容大家肯定会有疑问:ISP 功能都可以做固件升级了,为啥需要第二级引导程序?
- ISP 只可以完成 MCU 的固件升级,一般不能完成外围器件的固件升级
- ISP 只可以通过串口 0(USART0)完成片上闪存(FLASH)的烧写编程
- ISP 的命令是有限的,有时候不能完全满足用户的功能需求
① 加密、校验启动
② 故障现场分析(RAM 内存导出)
③ 工厂测试
第二级引导程序(示例)
- 第二级引导程序实例完成基于 I2C 总线的主机从机通信
- 第二级引导程序等待主机指令,解析指令并处理主机指令
- 第二级引导程序响应主机启动命令可以启动用户程序
五、代码读取保护(Code Read Protection)
之前也看到有网友提出代码保护的问题,辛苦写的程序,怎么着也不想被别人拿去用!所以增加代码的读/写保护功能,对保护知识产权异常重要!所以最后来谈谈如果添加代码读取保护功能。
1. 代码读取保护(CRP)
- 允许客户设置不同安全级别的闪存访问
- CRP 模式
2. CRP模式配置
- 模式配置地址 0x000002FC
- CRP 模式的改变在 MCU 重新上电后生效
- CRP 不影响 IAP 命令
- 实例代码
;// keil_startup_lpc82x.s
;// Code Read Protection level (CRP),0x000002FC
;// <0xFFFFFFFF=> Disabled
;// <0x4E697370=> NO_ISP
;// <0x12345678=> CRP1
;// <0x87654321=> CRP2
;// <0x43218765=> CRP3 (Are you sure?)
CRP_Level EQU 0xFFFFFFFF
评论