23. FLASH 控制器与 ISP 操作
23.1. 概述
SWM221系列内置FLASH。可以通过调用IAP函数或寄存器读写的方式进行FLASH操作。
重要
操作FLASH前,需要关闭中断,防止打断造成写入错误。
23.2. 特性
支持ISP(在系统编程)更新用户程序
支持FLASH编程
支持BOOT自定义
支持加密
23.3. 功能描述
23.3.1. FLASH操作
FLASH操作可以通过寄存器进行操作,也可以通过IAP函数进行擦除及写入。
23.3.1.1. 寄存器操作
注意
我司不建议用户通过寄存器直接操作 FLASH 擦写,如有需要请联系技术支持。
23.3.1.2. IAP操作
IAP 函数作为片内驻留程序,其提供了针对flash 的相关操作IAP 函数为Thumb 代码,分为擦除函数(驻留地址为 0x1000401)和写入函数(驻留地址为 0x1000461),建议使用如下方式调用:
擦除函数:
定义函数类型: |
typedef uint32_t (*IAPFunc1) (uint32_t PageNum); IAPFunc1 FLASH_PageErase = (IAPFunc1) 0x1000401; |
变量定义如下: |
PageNum: FLASH 擦除目标页码,以 page 为单位,0 为首地址,N 为 page * N 对应地址 |
返回值: |
0:擦除成功 1:擦除失败,参数错误 |
调用 |
Result = FLASH_PageErase(10); |
擦除第 10 * page 的内容。Result 返回 0 表示成功。 |
写入函数:
定义函数类型: |
typedef void (*IAPFunc2) (uint32_t faddr, uint32_t raddr, uint32_t cnt); IAPFunc2 FLASH_PageWrite = (IAPFunc2) 0x1000461; |
变量定义如下: |
faddr: FLASH 写入目标地址,字对齐 raddr: RAM 写入目标地址,字对齐 cnt: 写入数量,字为单位,长度不超过1page |
返回值: |
0:写入成功 1:写入失败,参数错误 |
调用: |
Result = FLASH_PageWrite(0x400, 0x20000400, 8); |
将 RAM 地址 0x20000400 开始的 8 * 4 个字节写入flash 地址 0x400 起始。Result 返回 0 表示成功。 |
调用 IAP 函数时,应保证栈空间剩余 24 个字节(byte)以上。执行写操作前,需确认对应目标地址已经执行过擦除操作。
备注
详细IAP操作请参阅库函数。
23.3.2. ISP(在系统编程)模式
当芯片上电后检测到 ISP 引脚持续 5ms 以上的高电平后,将会进入 ISP 模式。配合上位机及串口可执行程序更新操作,具体引脚请参考管脚定义章节。
注意
ISP方式的串口烧录时,默认使用 C0 (UART1_TX) 以及 C1 (UART1_TX) 作为串口通讯使用。
备注
详细ISP操作请参阅应用文档及库函数。
23.3.3. BOOT 自定义
FLASH 地址空间支持将指定地址的 2KB 数据映射至 0x00000000 空间,通过 REMAP 寄存器实现。将地址(2KB 对齐)写入 REMAP 寄存器 BASEADD,并将 EN 位置1,则指定地址内容将被映射至 0x00000000 空间,可通过此功能实现向量表的重映射。
例如
BOOT: 0x00000000 ~ 0x00004000
USER: 0x00004000 ~ 0x00008000
在 BOOT 中配置 REMAP 寄存器地址为 0x00004000 并使能,并跳转至 USER 执行,当读取 0x00000000 地址时,返回内容为 0x00004000 地址内容。
23.3.4. 加密方式
控制器加密支持以下三种级别:
级别 |
说明 |
关键字值 |
---|---|---|
级别1 |
不加密,SWD可正常读写 |
0x00000000 |
级别2 |
SWD读取加密,SWD无法读取FLASH,只能执行擦除操作,连接SWD后,FLASH无法执行读操作,读取FLASH会进入Hardfault |
0x43211234 |
级别3 |
SWD封锁,SWD无法执行读取及擦除工作,只能通过ISP读取 |
0xABCD1234 |
提示
通过在用户程序中将 0x0000001C 偏移地址配置为指定关键字,即可实现指定级别的加密。程序下载后再次上电后,芯片将处于指定加密级别的状态。
23.4. 寄存器映射
名称 |
偏移 |
复位值 |
---|---|---|
FLASHCTL BASE:0x40045000 |
||
CACHE |
0x0c |
0x00000000 |
REMAP |
0x28 |
0x00000000 |
23.5. 寄存器描述
23.5.1. CACHE寄存器
偏移: 0x0C |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
CLR |
|||||||
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
EN |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31 |
CLR |
R/WAC |
清空cache,写1有效,自动清零 |
30:1 |
RO |
保留位 |
|
0 |
EN |
R/W |
Cache使能,1有效。默认关闭 |
23.5.2. REMAP寄存器
偏移: 0x28 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
REMAP BASE ADDR |
EN |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:7 |
RO |
||
6:1 |
REMAP BASE ADDR |
R/W |
当REMAP BASE ADDR为1时,对0地址开头的2KB地址的访问都映射到REMAP BASE ADDR基地址对应的2K地址。 |
0 |
EN |
R/W |
打开REMAP REMAP操作只作用于FLASH读取操作。 进入和退出REMAP前需建议关闭CACHE功能,并执行一次CACHE清除操作 |