跳过正文

ch32v00x_flash.h

目录
Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 8: 本文

描述
#

该文件定义了 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_0FLASH_Latency_1FLASH_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_COMPLETEFLASH_BUSYFLASH_ERROR_WRPFLASH_TIMEOUT 等)

FLASH_EraseAllPages
#

FLASH_Status FLASH_EraseAllPages(void)
擦除整个 Flash 存储器(所有页)。此操作不可逆,会清除所有用户程序与数据,仅在固件更新或安全清除时使用。

参数:

返回值:
Flash 操作状态(FLASH_COMPLETEFLASH_BUSYFLASH_ERROR_WRPFLASH_TIMEOUT 等)

FLASH_EraseOptionBytes
#

FLASH_Status FLASH_EraseOptionBytes(void)
擦除所有选项字节(包括读保护、写保护、复位配置等)。擦除后所有选项字恢复默认值(如读保护关闭、IWDG 为硬件模式)。

参数:

返回值:
Flash 操作状态(FLASH_COMPLETEFLASH_BUSYFLASH_ERROR_WRPFLASH_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_COMPLETEFLASH_BUSYFLASH_ERROR_PGFLASH_ERROR_WRPFLASH_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_COMPLETEFLASH_BUSYFLASH_ERROR_PGFLASH_ERROR_WRPFLASH_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_COMPLETEFLASH_BUSYFLASH_ERROR_PGFLASH_ERROR_WRPFLASH_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_COMPLETEFLASH_BUSYFLASH_ERROR_PGFLASH_ERROR_WRPFLASH_TIMEOUT 等)

FLASH_ReadOutProtection
#

FLASH_Status FLASH_ReadOutProtection(FunctionalState NewState)
启用或禁用 Flash 读保护。启用后,外部调试器无法读取 Flash 内容,且无法通过编程方式擦除 Flash,除非先执行全片擦除。

参数:

名称 类型 简述
NewState FunctionalState ENABLE 启用读保护,DISABLE 禁用读保护

返回值:
Flash 操作状态(FLASH_COMPLETEFLASH_BUSYFLASH_ERROR_WRPFLASH_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_SWOB_IWDG_HW
OB_STDBY uint16_t STANDBY 模式复位行为,取值为 OB_STDBY_NoRSTOB_STDBY_RST
OB_RST uint16_t 复位引脚配置,取值为 OB_RST_NoENOB_RST_EN_DT12msOB_RST_EN_DT1msOB_RST_EN_DT128us
OB_PowerON_Start_Mode uint16_t 上电启动模式,取值为 OB_PowerON_Start_Mode_BOOTOB_PowerON_Start_Mode_USER

返回值:
Flash 操作状态(FLASH_COMPLETEFLASH_BUSYFLASH_ERROR_PGFLASH_ERROR_WRPFLASH_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_EOPFLASH_IT_ERROR
NewState FunctionalState ENABLE 使能,DISABLE 禁用

返回值:

FLASH_GetFlagStatus
#

FlagStatus FLASH_GetFlagStatus(uint32_t FLASH_FLAG)
查询 Flash 状态标志位,用于轮询操作状态。

参数:

名称 类型 简述
FLASH_FLAG uint32_t 要查询的标志,如 FLASH_FLAG_BSYFLASH_FLAG_EOPFLASH_FLAG_OPTERR

返回值:
SET 表示标志置位,RESET 表示标志清零

FLASH_ClearFlag
#

void FLASH_ClearFlag(uint32_t FLASH_FLAG)
清除 Flash 操作完成或错误标志。必须在中断服务程序中调用,以清除中断源。

参数:

名称 类型 简述
FLASH_FLAG uint32_t 要清除的标志,如 FLASH_FLAG_EOPFLASH_FLAG_WRPRTERR

返回值:

FLASH_GetStatus
#

FLASH_Status FLASH_GetStatus(void)
获取 Flash 当前操作状态(忙、错误、完成)。适用于轮询模式。

参数:

返回值:
Flash 操作状态(FLASH_BUSYFLASH_ERROR_WRPFLASH_COMPLETE

FLASH_WaitForLastOperation
#

FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout)
等待 Flash 操作完成,或超时返回。用于同步等待擦除/编程结束,避免立即读取未完成的数据。

参数:

名称 类型 简述
Timeout uint32_t 最大等待循环次数,超时后返回 FLASH_TIMEOUT

返回值:
Flash 操作状态(FLASH_COMPLETEFLASH_BUSYFLASH_TIMEOUT

FLASH_Unlock_Fast
#

void FLASH_Unlock_Fast(void)
解锁 Flash 高速编程模式,允许使用 FLASH_BufLoadFLASH_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_USERStart_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_COMPLETEFLASH_ADR_RANGE_ERRORFLASH_ALIGN_ERRORFLASH_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_COMPLETEFLASH_ADR_RANGE_ERRORFLASH_ALIGN_ERRORFLASH_OP_RANGE_ERROR

Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 8: 本文

相关文章

ch32v00x.h

该文件是 CH32V003 微控制器的外设访问层头文件,定义了所有外设寄存器的内存映射、位域常量、中断向量、时钟配置、GPIO 控制结构及系统级常量。它为标准外设库提供底层硬件抽象,使开发者可通过结构体指针直接访问寄存器,或通过位掩码配置外设功能。本文件不包含函数原型,仅提供寄存器定义与常量,是所有外设驱动开发的基础。

ch32v00x_adc.h

该文件定义了 CH32V00x 系列微控制器 ADC 外设的固件库所有函数原型、常量、枚举和结构体。ADC(模数转换器)支持单通道与多通道扫描转换、注入通道、模拟看门狗、DMA 请求、软件与外部触发等多种模式,适用于高精度模拟信号采集场景。本库通过寄存器掩码操作实现灵活配置,所有常量均以 uint32_t 或 uint8_t 类型定义,确保与硬件寄存器位域精确匹配。函数设计遵循标准外设库风格,支持初始化、启动、中断、校准、偏移设置等完整功能链,适用于工业控制、传感器接口、电源管理等嵌入式应用。

ch32v00x_dma.h

该文件定义了 CH32V00x 系列微控制器 DMA(直接存储器访问)外设的固件库函数原型、数据结构及常量宏。DMA 用于在不占用 CPU 资源的情况下实现外设与内存、内存与内存之间的高效数据传输,适用于高速数据采集、串口/ADC 缓冲、图像处理等场景。本库支持 7 个 DMA 通道,每个通道可独立配置传输方向、数据宽度、地址递增模式、优先级和循环模式,极大提升系统并发处理能力。