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清除操作