描述 #
该文件定义了 CH32V00x 系列微控制器 Flash 存储器固件库的所有常量、枚举、结构体声明及函数原型,涵盖 Flash 操作的核心功能,包括擦除、编程、写保护、选项字配置、中断与状态管理。所有操作均通过直接访问 Flash 控制寄存器实现,支持标准模式与高速模式,适用于系统启动配置、固件升级、参数存储等关键应用场景。本库特别针对 CH32V00x 的 64 字节页大小架构优化,提供细粒度控制能力,同时集成读保护、写保护、复位行为等安全选项,确保嵌入式系统在断电或异常情况下的数据完整性与安全性。
常量 #
Flash_Latency
#
Flash 访问延迟配置,用于平衡性能与功耗。延迟周期数越高,Flash 读取速度越慢,但系统在高主频下更稳定。
| 名称 | 值 | 简述 |
|---|---|---|
FLASH_Latency_0 |
0x00000000 |
Flash 零延迟周期 |
FLASH_Latency_1 |
0x00000001 |
Flash 一个延迟周期 |
FLASH_Latency_2 |
0x00000002 |
Flash 两个延迟周期 |
以上所有值都强制转换为
uint32_t
FLASH_WRProt_Pages
#
Flash 写保护页掩码,用于设置特定页范围的写保护。每个位对应一组连续的 64 字节页(CH32V00x 为 64B/页),支持按块启用写保护。
| 名称 | 值 | 简述 |
|---|---|---|
FLASH_WRProt_Pages0to15 |
0x00000001 |
写保护页 0 至 15 |
FLASH_WRProt_Pages16to31 |
0x00000002 |
写保护页 16 至 31 |
FLASH_WRProt_Pages32to47 |
0x00000004 |
写保护页 32 至 47 |
FLASH_WRProt_Pages48to63 |
0x00000008 |
写保护页 48 至 63 |
FLASH_WRProt_Pages64to79 |
0x00000010 |
写保护页 64 至 79 |
FLASH_WRProt_Pages80to95 |
0x00000020 |
写保护页 80 至 95 |
FLASH_WRProt_Pages96to111 |
0x00000040 |
写保护页 96 至 111 |
FLASH_WRProt_Pages112to127 |
0x00000080 |
写保护页 112 至 127 |
FLASH_WRProt_Pages128to143 |
0x00000100 |
写保护页 128 至 143(中密度) |
FLASH_WRProt_Pages144to159 |
0x00000200 |
写保护页 144 至 159(中密度) |
FLASH_WRProt_Pages160to175 |
0x00000400 |
写保护页 160 至 175(中密度) |
FLASH_WRProt_Pages176to191 |
0x00000800 |
写保护页 176 至 191(中密度) |
FLASH_WRProt_Pages192to207 |
0x00001000 |
写保护页 192 至 207(中密度) |
FLASH_WRProt_Pages208to223 |
0x00002000 |
写保护页 208 至 223(中密度) |
FLASH_WRProt_Pages224to239 |
0x00004000 |
写保护页 224 至 239(中密度) |
FLASH_WRProt_Pages240to255 |
0x00008000 |
写保护页 240 至 255(中密度) |
FLASH_WRProt_AllPages |
0x0000FFFF |
写保护所有页(16位掩码,覆盖全部256页) |
以上所有值都强制转换为
uint32_t
Option_Bytes_IWatchdog
#
独立看门狗(IWDG)模式选择,决定看门狗由软件还是硬件控制。
| 名称 | 值 | 简述 |
|---|---|---|
OB_IWDG_SW |
0x0001 |
软件看门狗(可由程序关闭) |
OB_IWDG_HW |
0x0000 |
硬件看门狗(不可关闭,增强系统可靠性) |
以上所有值都强制转换为
uint16_t
Option_Bytes_nRST_STOP
#
进入 STOP 模式时是否产生复位。
| 名称 | 值 | 简述 |
|---|---|---|
OB_STOP_NoRST |
0x0002 |
进入 STOP 模式不复位(保持状态) |
OB_STOP_RST |
0x0000 |
进入 STOP 模式时复位系统 |
以上所有值都强制转换为
uint16_t
Option_Bytes_nRST_STDBY
#
进入 STANDBY 模式时是否产生复位。
| 名称 | 值 | 简述 |
|---|---|---|
OB_STDBY_NoRST |
0x0004 |
进入 STANDBY 模式不复位 |
OB_STDBY_RST |
0x0000 |
进入 STANDBY 模式时复位系统 |
以上所有值都强制转换为
uint16_t
Option_Bytes_RST_ENandDT
#
复位引脚(PD7)使能及复位延迟时间配置。
| 名称 | 值 | 简述 |
|---|---|---|
OB_RST_NoEN |
0x0018 |
禁用复位引脚(PD7) |
OB_RST_EN_DT12ms |
0x0010 |
启用复位引脚,延迟 12ms |
OB_RST_EN_DT1ms |
0x0008 |
启用复位引脚,延迟 1ms |
OB_RST_EN_DT128us |
0x0000 |
启用复位引脚,延迟 128us |
以上所有值都强制转换为
uint16_t
Option_Bytes_Power_ON_Start_Mode
#
上电启动模式选择,决定系统复位后从用户区还是 Boot 区启动。
| 名称 | 值 | 简述 |
|---|---|---|
OB_PowerON_Start_Mode_BOOT |
0x0020 |
上电后从 Boot 区启动(用于固件更新) |
OB_PowerON_Start_Mode_USER |
0x0000 |
上电后从用户程序区启动(正常运行模式) |
以上所有值都强制转换为
uint16_t
FLASH_Interrupts
#
Flash 操作中断源标识符,用于使能或禁用中断。
| 名称 | 值 | 简述 |
|---|---|---|
FLASH_IT_ERROR |
0x00000400 |
Flash 错误中断源(如写保护、地址错误) |
FLASH_IT_EOP |
0x00001000 |
Flash 操作完成中断源(擦除/编程结束) |
FLASH_IT_BANK1_ERROR |
FLASH_IT_ERROR |
Bank1 错误中断(与 FLASH_IT_ERROR 相同) |
FLASH_IT_BANK1_EOP |
FLASH_IT_EOP |
Bank1 操作完成中断(与 FLASH_IT_EOP 相同) |
以上所有值都强制转换为
uint32_t
FLASH_Flags
#
Flash 状态标志位,用于查询操作状态或清除标志。
| 名称 | 值 | 简述 |
|---|---|---|
FLASH_FLAG_BSY |
0x00000001 |
Flash 忙标志(操作进行中) |
FLASH_FLAG_EOP |
0x00000020 |
Flash 操作结束标志 |
FLASH_FLAG_WRPRTERR |
0x00000010 |
Flash 写保护错误标志 |
FLASH_FLAG_OPTERR |
0x00000001 |
Flash 选项字错误标志(如选项字写入失败) |
FLASH_FLAG_BANK1_BSY |
FLASH_FLAG_BSY |
Bank1 忙标志(与 FLASH_FLAG_BSY 相同) |
FLASH_FLAG_BANK1_EOP |
FLASH_FLAG_EOP |
Bank1 操作结束标志(与 FLASH_FLAG_EOP 相同) |
FLASH_FLAG_BANK1_WRPRTERR |
FLASH_FLAG_WRPRTERR |
Bank1 写保护错误标志(与 FLASH_FLAG_WRPRTERR 相同) |
以上所有值都强制转换为
uint32_t
System_Reset_Start_Mode
#
系统复位后的启动模式,通过寄存器位控制。
| 名称 | 值 | 简述 |
|---|---|---|
Start_Mode_USER |
0x00000000 |
复位后从用户程序区启动 |
Start_Mode_BOOT |
0x00004000 |
复位后从 Boot 区启动 |
以上所有值都强制转换为
uint32_t
枚举 #
FLASH_Status
#
Flash 操作状态返回值,所有函数均返回此枚举类型以指示操作结果。
| 名称 | 值 | 简述 |
|---|---|---|
FLASH_BUSY |
1 |
Flash 正在执行操作(忙) |
FLASH_ERROR_PG |
2 |
编程错误(如地址无效、未解锁) |
FLASH_ERROR_WRP |
3 |
写保护错误(尝试写入受保护区域) |
FLASH_COMPLETE |
4 |
操作成功完成 |
FLASH_TIMEOUT |
5 |
操作超时(未在规定时间内完成) |
FLASH_OP_RANGE_ERROR |
0xFD |
操作范围超出 Flash 地址空间 |
FLASH_ALIGN_ERROR |
0xFE |
地址未对齐(必须为 64 字节对齐) |
FLASH_ADR_RANGE_ERROR |
0xFF |
起始地址超出有效 Flash 区域 |
结构体 #
FLASH_InitTypeDef
#
无此结构体。CH32V00x Flash 库未定义初始化结构体,所有配置通过直接调用函数完成,如
FLASH_SetLatency()、FLASH_UserOptionByteConfig()等,采用“函数式配置”而非“结构体配置”风格,简化了接口但要求开发者明确掌握寄存器含义。
函数 #
FLASH_SetLatency
#
void FLASH_SetLatency(uint32_t FLASH_Latency)
设置 Flash 访问延迟周期,以匹配系统时钟频率。延迟周期数需根据主频调整,否则可能导致指令预取错误或系统崩溃。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
FLASH_Latency |
uint32_t |
延迟周期值,取值为 FLASH_Latency_0、FLASH_Latency_1 或 FLASH_Latency_2 |
返回值:
无
FLASH_Unlock
#
void FLASH_Unlock(void)
解锁 Flash 程序/擦除控制器(FPEC),允许后续写入或擦除操作。必须在执行任何编程/擦除前调用,否则操作将被忽略。
参数:
无
返回值:
无
FLASH_Lock
#
void FLASH_Lock(void)
锁定 Flash 程序/擦除控制器,防止意外写入或擦除。建议在完成所有 Flash 操作后立即调用,增强系统安全性。
参数:
无
返回值:
无
FLASH_ErasePage
#
FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
擦除指定地址所在的 Flash 页(64 字节)。地址必须为 64 字节对齐,否则行为未定义。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Page_Address |
uint32_t |
要擦除的页起始地址,必须为 64 字节对齐(如 0x08000000、0x08000040) |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_EraseAllPages
#
FLASH_Status FLASH_EraseAllPages(void)
擦除整个 Flash 存储器(所有页)。此操作不可逆,会清除所有用户程序与数据,仅在固件更新或安全清除时使用。
参数:
无
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_EraseOptionBytes
#
FLASH_Status FLASH_EraseOptionBytes(void)
擦除所有选项字节(包括读保护、写保护、复位配置等)。擦除后所有选项字恢复默认值(如读保护关闭、IWDG 为硬件模式)。
参数:
无
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_ProgramWord
#
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)
在指定地址写入一个 32 位字(4 字节)。地址必须为 4 字节对齐,且 Flash 必须已擦除(写入前必须为 0xFFFFFFFF)。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Address |
uint32_t |
目标地址,必须为 4 字节对齐 |
Data |
uint32_t |
要写入的 32 位数据 |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_PG、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_ProgramHalfWord
#
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
在指定地址写入一个 16 位半字(2 字节)。地址必须为 2 字节对齐。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Address |
uint32_t |
目标地址,必须为 2 字节对齐 |
Data |
uint16_t |
要写入的 16 位数据 |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_PG、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_ProgramOptionByteData
#
FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data)
向选项字节区域写入单字节数据。通常用于配置 IWDG、复位行为等选项字。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Address |
uint32_t |
选项字节地址(如 OB->WRPR0、OB->RDPR) |
Data |
uint8_t |
要写入的 8 位数据 |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_PG、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_EnableWriteProtection
#
FLASH_Status FLASH_EnableWriteProtection(uint32_t FLASH_Pages)
启用指定页范围的写保护。写保护后,这些页将无法被擦除或编程,直到通过 FLASH_EraseOptionBytes() 清除保护。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
FLASH_Pages |
uint32_t |
要写保护的页掩码,使用 FLASH_WRProt_PagesXtoY 组合(如 `FLASH_WRProt_Pages0to15 |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_PG、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_ReadOutProtection
#
FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
启用或禁用 Flash 读保护。启用后,外部调试器无法读取 Flash 内容,且无法通过编程方式擦除 Flash,除非先执行全片擦除。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
NewState |
FunctionalState |
ENABLE 启用读保护,DISABLE 禁用读保护 |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_UserOptionByteConfig
#
FLASH_Status FLASH_UserOptionByteConfig(uint16_t OB_IWDG, uint16_t OB_STDBY, uint16_t OB_RST, uint16_t OB_PowerON_Start_Mode)
一次性配置所有用户选项字:看门狗模式、STOP/STANDBY 复位行为、复位引脚延迟、上电启动模式。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
OB_IWDG |
uint16_t |
IWDG 模式,取值为 OB_IWDG_SW 或 OB_IWDG_HW |
OB_STDBY |
uint16_t |
STANDBY 模式复位行为,取值为 OB_STDBY_NoRST 或 OB_STDBY_RST |
OB_RST |
uint16_t |
复位引脚配置,取值为 OB_RST_NoEN、OB_RST_EN_DT12ms、OB_RST_EN_DT1ms、OB_RST_EN_DT128us |
OB_PowerON_Start_Mode |
uint16_t |
上电启动模式,取值为 OB_PowerON_Start_Mode_BOOT 或 OB_PowerON_Start_Mode_USER |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_ERROR_PG、FLASH_ERROR_WRP、FLASH_TIMEOUT 等)
FLASH_GetUserOptionByte
#
uint32_t FLASH_GetUserOptionByte(void)
读取当前用户选项字的值,包含 IWDG、STOP、STANDBY 配置位。
参数:
无
返回值:
用户选项字值(Bit0=IWDG, Bit1=STOP, Bit2=STDBY)
FLASH_GetWriteProtectionOptionByte
#
uint32_t FLASH_GetWriteProtectionOptionByte(void)
读取当前写保护配置寄存器的值,返回各页的写保护状态。
参数:
无
返回值:
写保护选项字值(每一位对应一组页的保护状态)
FLASH_GetReadOutProtectionStatus
#
FlagStatus FLASH_GetReadOutProtectionStatus(void)
检查当前是否启用了 Flash 读保护。
参数:
无
返回值:
SET 表示读保护已启用,RESET 表示未启用
FLASH_ITConfig
#
void FLASH_ITConfig(uint32_t FLASH_IT, FunctionalState NewState)
使能或禁用 Flash 操作中断(EOP 或 ERROR)。需配合 NVIC 配置中断向量。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
FLASH_IT |
uint32_t |
中断源,取值为 FLASH_IT_EOP 或 FLASH_IT_ERROR |
NewState |
FunctionalState |
ENABLE 使能,DISABLE 禁用 |
返回值:
无
FLASH_GetFlagStatus
#
FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG)
查询 Flash 状态标志位,用于轮询操作状态。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
FLASH_FLAG |
uint32_t |
要查询的标志,如 FLASH_FLAG_BSY、FLASH_FLAG_EOP、FLASH_FLAG_OPTERR |
返回值:
SET 表示标志置位,RESET 表示标志清零
FLASH_ClearFlag
#
void FLASH_ClearFlag(uint32_t FLASH_FLAG)
清除 Flash 操作完成或错误标志。必须在中断服务程序中调用,以清除中断源。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
FLASH_FLAG |
uint32_t |
要清除的标志,如 FLASH_FLAG_EOP、FLASH_FLAG_WRPRTERR |
返回值:
无
FLASH_GetStatus
#
FLASH_Status FLASH_GetStatus(void)
获取 Flash 当前操作状态(忙、错误、完成)。适用于轮询模式。
参数:
无
返回值:
Flash 操作状态(FLASH_BUSY、FLASH_ERROR_WRP、FLASH_COMPLETE)
FLASH_WaitForLastOperation
#
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout)
等待 Flash 操作完成,或超时返回。用于同步等待擦除/编程结束,避免立即读取未完成的数据。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Timeout |
uint32_t |
最大等待循环次数,超时后返回 FLASH_TIMEOUT |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_BUSY、FLASH_TIMEOUT)
FLASH_Unlock_Fast
#
void FLASH_Unlock_Fast(void)
解锁 Flash 高速编程模式,允许使用 FLASH_BufLoad、FLASH_ProgramPage_Fast 等高速函数。
参数:
无
返回值:
无
FLASH_Lock_Fast
#
void FLASH_Lock_Fast(void)
锁定 Flash 高速编程模式,防止意外使用高速操作。
参数:
无
返回值:
无
FLASH_BufReset
#
void FLASH_BufReset(void)
重置 Flash 缓冲区,清空内部写入缓存,为下一次批量写入做准备。
参数:
无
返回值:
无
FLASH_BufLoad
#
void FLASH_BufLoad(uint32_t Address, uint32_t Data0)
将 4 字节数据加载到 Flash 缓冲区,用于后续高速编程。地址必须在有效范围内。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Address |
uint32_t |
目标地址(64 字节对齐) |
Data0 |
uint32_t |
要加载到缓冲区的 32 位数据 |
返回值:
无
FLASH_ErasePage_Fast
#
void FLASH_ErasePage_Fast(uint32_t Page_Address)
使用高速模式擦除指定页(64 字节)。比 FLASH_ErasePage 更快,但必须先调用 FLASH_Unlock_Fast()。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Page_Address |
uint32_t |
要擦除的页地址(64 字节对齐) |
返回值:
无
FLASH_ProgramPage_Fast
#
void FLASH_ProgramPage_Fast(uint32_t Page_Address)
使用高速模式编程指定页(64 字节)。必须先调用 FLASH_BufLoad 加载数据,再调用此函数。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Page_Address |
uint32_t |
要编程的页地址(64 字节对齐) |
返回值:
无
SystemReset_StartMode
#
void SystemReset_StartMode(uint32_t Mode)
配置系统复位后的启动模式(用户区或 Boot 区),通过修改 Flash 的 BOOT_MODE 寄存器实现。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
Mode |
uint32_t |
启动模式,取值为 Start_Mode_USER 或 Start_Mode_BOOT |
返回值:
无
FLASH_ROM_ERASE
#
FLASH_Status FLASH_ROM_ERASE(uint32_t StartAddr, uint32_t Length)
擦除指定地址范围的 Flash,支持 64 字节和 1KB 两种粒度自动混合擦除。地址和长度必须为 64 字节对齐。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
StartAddr |
uint32_t |
擦除起始地址,必须为 64 字节对齐 |
Length |
uint32_t |
擦除长度(字节),必须为 64 字节对齐且 >0 |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_ADR_RANGE_ERROR、FLASH_ALIGN_ERROR、FLASH_OP_RANGE_ERROR)
FLASH_ROM_WRITE
#
FLASH_Status FLASH_ROM_WRITE(uint32_t StartAddr, uint32_t *pbuf, uint32_t Length)
向 Flash 编程指定长度的数据块,使用 64 字节缓冲区批量写入,效率高于逐字写入。地址和长度必须为 64 字节对齐。
参数:
| 名称 | 类型 | 简述 |
|---|---|---|
StartAddr |
uint32_t |
写入起始地址,必须为 64 字节对齐 |
pbuf |
uint32_t * |
指向数据缓冲区的指针(32 位对齐) |
Length |
uint32_t |
写入数据长度(字节),必须为 64 字节对齐且 >0 |
返回值:
Flash 操作状态(FLASH_COMPLETE、FLASH_ADR_RANGE_ERROR、FLASH_ALIGN_ERROR、FLASH_OP_RANGE_ERROR)