/************************************************************************************************/ /** * @file ciu32l051_std_flash.h * @author MCU Ecosystem Development Team * @brief FLASH STD库驱动头文件。 * 提供FLASH相关的STD库操作函数声明、数据类型以及常量的定义。 * * ************************************************************************************************** * @attention * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved. * ************************************************************************************************** */ /*避免头文件重复引用*/ #ifndef CIU32L051_STD_FLASH_H #define CIU32L051_STD_FLASH_H /************************************************************************************************/ /** * @addtogroup CIU32L051_STD_Driver * @{ */ /** * @defgroup FLASH FLASH * @brief FLASH存储器的STD库驱动 * @{ */ /************************************************************************************************/ #ifdef __cplusplus extern "C" { #endif /*------------------------------------------includes--------------------------------------------*/ #include "ciu32l051_std_common.h" /*-------------------------------------------define---------------------------------------------*/ /************************************************************************************************/ /** * @defgroup FLASH_Constants FLASH Constants * @brief FLASH常量定义及宏定义 * @{ * */ /************************************************************************************************/ /* Flash读取访问等待周期 */ #define FLASH_LATENCY_0CLK FLASH_ACR_LATENCY_0CLK /**< 等待周期:0 HCLK */ #define FLASH_LATENCY_1CLK FLASH_ACR_LATENCY_1CLK /**< 等待周期:1 HCLK */ #define FLASH_LATENCY_2CLK FLASH_ACR_LATENCY_2CLK /**< 等待周期:2 HCLK */ /* Flash操作等待时间 */ #define FLASH_WAIT_PROGRAM (1U) /**< Flash编程等待时间(ms) */ #define FLASH_WAIT_PAGE_ERASE (5U) /**< Flash页擦等待时间(ms) */ #define FLASH_WAIT_MASS_ERASE (50U) /**< Flash片擦等待时间(ms) */ /* Flash控制寄存器解锁密钥 */ #define FLASH_CR_KEY1 (0xE57A1A85U) /**< Flash控制寄存器解锁密钥1 */ #define FLASH_CR_KEY2 (0x7C6E8391U) /**< Flash控制寄存器解锁密钥2 */ /* Flash选项字节解锁密钥 */ #define FLASH_OPT_KEY1 (0x6A894D7BU) /**< Flash选项字节解锁密钥1 */ #define FLASH_OPT_KEY2 (0x7C311F5AU) /**< Flash选项字节解锁密钥2 */ /* Flash操作状态 */ #define FLASH_FLAG_EOP FLASH_SR_EOP /**< Flash操作完成标志 */ #define FLASH_FLAG_BSY FLASH_SR_BSY /**< Flash操作状态标志 */ #define FLASH_FLAG_WRPERR FLASH_SR_WRPERR /**< Flash写保护错误标志 */ #define FLASH_FLAG_PROGERR FLASH_SR_PROGERR /**< Flash编程错误标志 */ #define FLASH_FLAG_FSTERR FLASH_SR_FSTERR /**< Flash快速编程错误标志 */ #define FLASH_FLAG_ALL_ERR (FLASH_FLAG_PROGERR | FLASH_FLAG_WRPERR \ | FLASH_SR_FSTERR) /**< Flash错误标志 */ /* Flash中断源 */ #define FLASH_INTERRUPT_OPERR FLASH_CR_OPERRIE /**< Flash操作异常中断 */ #define FLASH_INTERRUPT_EOP FLASH_CR_EOPIE /**< Flash操作完成中断 */ /* Flash擦除模式 */ #define FLASH_ERASE_DISABLE FLASH_CR_ER_MODE_NONE /**< Flash退出擦除模式 */ #define FLASH_ERASE_PAGE FLASH_CR_ER_MODE_PAGE /**< Flash页擦除模式 */ #define FLASH_ERASE_MASS FLASH_CR_ER_MODE_MASS /**< Flash批量擦除模式 */ /* 选项字节1 位域使能 */ #define FLASH_BOR_ENABLE FLASH_OPTR1_BOR_EN /**< BOR使能 */ #define FLASH_BOR_LEVEL_MASK FLASH_OPTR1_BOR_LEVEL_MASK /**< BOR检测配置域 */ #define FLASH_BOR_LEVEL_0 FLASH_OPTR1_BOR_LEVEL_0 /**< BOR检测电压上升/下降阈值:2.1/2.0V */ #define FLASH_BOR_LEVEL_1 FLASH_OPTR1_BOR_LEVEL_1 /**< BOR检测电压上升/下降阈值:2.3/2.2V */ #define FLASH_BOR_LEVEL_2 FLASH_OPTR1_BOR_LEVEL_2 /**< BOR检测电压上升/下降阈值:2.6/2.5V */ #define FLASH_BOR_LEVEL_3 FLASH_OPTR1_BOR_LEVEL_3 /**< BOR检测电压上升/下降阈值:2.9/2.8V */ #define FLASH_RDP_LEVEL_MASK FLASH_OPTR1_RDP_MASK /**< RDP配置域 */ #define FLASH_RDP_LEVEL_0 (0x000000AAU) /**< RDP保护等级0 */ #define FLASH_RDP_LEVEL_1 (0x00000000U) /**< RDP保护等级1 */ #define FLASH_RDP_LEVEL_2 (0x00000055U) /**< RDP保护等级2 */ /* 选项字节2 位域使能 */ #define FLASH_BOOT_SEL_SW FLASH_OPTR2_BOOT_SEL /**< 启动条件使用选项字节BOOT0_SW配置 */ #define FLASH_BOOT0_SW_1 FLASH_OPTR2_BOOT0_SW /**< 配置BOOT0_SW为1 */ #define FLASH_BOOT1_SW_1 FLASH_OPTR2_BOOT1_SW /**< 配置BOOT1_SW为1 */ #define FLASH_VBAT_MODE_ENABLE FLASH_OPTR2_VBAT_MODE_EN /**< VBAT模式使能 */ #define FLASH_IWDG_STOP_MODE_NORMAL FLASH_OPTR2_IWDG_STOP /**< IWDG在Stop模式下正常计数 */ #define FLASH_STOP_RESET_DISABLE FLASH_OPTR2_RST_STOP /**< 执行进入Stop模式操作,正常进入Stop,不产生复位 */ /* Option Bytes地址 */ #define FLASH_OB_OPTR1_ADDR (0x1FFF0000) /**< 选项字节1存储地址 */ #define FLASH_OB_OPTR2_ADDR (0x1FFF0004) /**< 选项字节2存储地址 */ #define FLASH_OB_WRP1A_START_ADDR (0x1FFF0008) /**< 写保护区A起始地址存储地址 */ #define FLASH_OB_WRP1A_END_ADDR (0x1FFF000C) /**< 写保护区A结束地址存储地址 */ #define FLASH_OB_WRP1B_START_ADDR (0x1FFF0010) /**< 写保护区B起始地址存储地址 */ #define FLASH_OB_WRP1B_END_ADDR (0x1FFF0014) /**< 写保护区B结束地址存储地址 */ /** * @} */ /*-------------------------------------------functions------------------------------------------*/ /************************************************************************************************/ /** * @defgroup FLASH_External_Functions FLASH External Functions * @brief FLASH对外函数 * @{ * */ /************************************************************************************************/ /** * @brief Flash控制寄存器解锁 * @note FLASH控制器解锁后操作CRKEY寄存器会产生总线错误并锁定写保护,直至下次复位 * @retval 无 */ __STATIC_INLINE void std_flash_unlock(void) { if ((FLASH->CR & FLASH_CR_LOCK) == FLASH_CR_LOCK) { FLASH->CRKEY = FLASH_CR_KEY1; FLASH->CRKEY = FLASH_CR_KEY2; } } /** * @brief Flash控制寄存器锁定 * @retval 无 */ __STATIC_INLINE void std_flash_lock(void) { FLASH->CR |= FLASH_CR_LOCK; } /** * @brief 读取Flash锁定状态 * @retval bool Flash锁定状态 * @arg true 表示锁定状态 * @arg false 表示解锁状态 */ __STATIC_INLINE bool std_flash_get_lock_status(void) { return ((FLASH->CR & FLASH_CR_LOCK) == FLASH_CR_LOCK); } /** * @brief Flash选项字节解锁 * @note FLASH选项字节解锁后操作OPTKEY寄存器会产生总线错误并锁定写保护,直至下次复位 * @retval 无 */ __STATIC_INLINE void std_flash_opt_unlock(void) { if ((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK) { FLASH->OPTKEY = FLASH_OPT_KEY1; FLASH->OPTKEY = FLASH_OPT_KEY2; } } /** * @brief Flash选项字节锁定 * @retval 无 */ __STATIC_INLINE void std_flash_opt_lock(void) { FLASH->CR |= FLASH_CR_OPTLOCK; } /** * @brief 读取Flash选项字节锁定状态 * @retval bool Flash选项字节锁定状态 * @arg true 表示锁定状态 * @arg false 表示解锁状态 */ __STATIC_INLINE bool std_flash_get_opt_lock_status(void) { return ((FLASH->CR & FLASH_CR_OPTLOCK) == FLASH_CR_OPTLOCK); } /** * @brief 设置FLASH读取访问等待周期 * @param latency 读取访问等待周期 * @arg FLASH_LATENCY_0CLK * @arg FLASH_LATENCY_1CLK * @arg FLASH_LATENCY_2CLK * @retval 无 */ __STATIC_INLINE void std_flash_set_latency(uint32_t latency) { MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY, latency); } /** * @brief 读取FLASH读取访问等待周期 * @retval uint32_t 读取访问等待周期 * @arg FLASH_LATENCY_0CLK * @arg FLASH_LATENCY_1CLK * @arg FLASH_LATENCY_2CLK */ __STATIC_INLINE uint32_t std_flash_get_latency(void) { return (FLASH->ACR & FLASH_ACR_LATENCY); } /** * @brief 使能FLASH中断 * @param interrupts 中断源 * @arg FLASH_INTERRUPT_OPERR * @arg FLASH_INTERRUPT_EOP * @retval 无 */ __STATIC_INLINE void std_flash_interrupt_enable(uint32_t interrupts) { FLASH->CR |= interrupts; } /** * @brief 禁止FLASH中断 * @param interrupts 中断源 * @arg FLASH_INTERRUPT_OPERR * @arg FLASH_INTERRUPT_EOP * @retval 无 */ __STATIC_INLINE void std_flash_interrupt_disable(uint32_t interrupts) { FLASH->CR &= (~interrupts); } /** * @brief 读取FLASH中断使能状态 * @param interrupt 中断源 * @arg FLASH_INTERRUPT_OPERR * @arg FLASH_INTERRUPT_EOP * @retval bool FLASH中断使能状态 * @arg true 表示中断已使能 * @arg false 表示中断未使能 */ __STATIC_INLINE bool std_flash_get_interrupt_enable(uint32_t interrupt) { return ((FLASH->CR & interrupt) == interrupt); } /** * @brief 读取FLASH状态标志 * @param flag 状态标志 * @arg FLASH_FLAG_EOP * @arg FLASH_FLAG_BSY * @arg FLASH_FLAG_WRPERR * @arg FLASH_FLAG_PROGERR * @arg FLASH_FLAG_FSTERR * @arg FLASH_FLAG_ALL_ERR * @retval bool FLASH状态标志 * @arg true 表示标志置位 * @arg false 表示标志未置位 */ __STATIC_INLINE bool std_flash_get_flag(uint32_t flag) { return ((FLASH->SR & flag) == flag); } /** * @brief 清除FLASH状态标志 * @param flags 状态标志组合 * @arg FLASH_FLAG_EOP * @arg FLASH_FLAG_WRPERR * @arg FLASH_FLAG_PROGERR * @arg FLASH_FLAG_FSTERR * @arg FLASH_FLAG_ALL_ERR * @retval 无 */ __STATIC_INLINE void std_flash_clear_flag(uint32_t flags) { FLASH->SR = flags; } /** * @brief 使能Flash编程 * @retval 无 */ __STATIC_INLINE void std_flash_program_enable(void) { FLASH->CR |= FLASH_CR_PG_MODE; } /** * @brief 禁止Flash编程 * @retval 无 */ __STATIC_INLINE void std_flash_program_disable(void) { FLASH->CR &= (~FLASH_CR_PG_MODE); } /** * @brief 启动Flash擦除 * @retval 无 */ __STATIC_INLINE void std_flash_erase_start(void) { FLASH->CR |= FLASH_CR_ERASE; } /** * @brief 设置Flash擦除模式 * @param mode 擦除模式 * @arg FLASH_ERASE_DISABLE * @arg FLASH_ERASE_PAGE * @arg FLASH_ERASE_MASS * @retval 无 */ __STATIC_INLINE void std_flash_set_erase_mode(uint32_t mode) { MODIFY_REG(FLASH->CR, FLASH_CR_ER_MODE, mode); } /** * @brief 设置Flash擦除页号 * @param index 擦除页号 * @retval 无 */ __STATIC_INLINE void std_flash_set_erase_index(uint32_t index) { MODIFY_REG(FLASH->CR, FLASH_CR_PNB, (index << FLASH_CR_PNB_POS)); } /** * @brief 读取Flash擦除页号 * @retval uint32_t 擦除页号 */ __STATIC_INLINE uint32_t std_flash_get_erase_index(void) { return ((FLASH->CR & FLASH_CR_PNB) >> FLASH_CR_PNB_POS); } /** * @brief 启动Flash选项字节擦除 * @note 启动Flash选项字节擦除前,将先对Flash选项字节寄存器进行解锁 * @retval 无 */ __STATIC_INLINE void std_flash_opt_erase_start(void) { FLASH->CR |= FLASH_CR_OPT_ERASE; } /** * @brief Flash选项字节加载 * @note 执行选项字节加载操作前,将先对Flash选项字节寄存器进行解锁 * 进行选项字节加载将产生系统复位 * @retval 无 */ __STATIC_INLINE void std_flash_opt_launch(void) { FLASH->CR |= FLASH_CR_OBL_LAUNCH; } /** * @brief 使能Flash快速编程模式 * @note 快速编程程序需要在RAM中执行 * @retval 无 */ __STATIC_INLINE void std_flash_fast_program_enable(void) { FLASH->CR |= FLASH_CR_FSTPG_MODE; } /** * @brief 查询Flash快速编程状态 * @note 快速编程程序需要在RAM中执行 * @retval bool 快速编程模式控制状态标志 * @arg true 表示快速编程进行中 * @arg false 表示快速编程已完成 */ __STATIC_INLINE bool std_flash_get_fstpg_state(void) { return ((FLASH->CR & FLASH_CR_FSTPG_MODE) == FLASH_CR_FSTPG_MODE); } /** * @brief 读取选项字节寄存器1 * @retval uint32_t 选项字节1加载值 */ __STATIC_INLINE uint32_t std_flash_get_opt1(void) { return (FLASH->OPTR1); } /** * @brief 读取FLASH读保护等级 * @retval uint32_t FLASH读保护等级 * @arg FLASH_RDP_LEVEL_0 * @arg FLASH_RDP_LEVEL_1 * @arg FLASH_RDP_LEVEL_2 */ __STATIC_INLINE uint32_t std_flash_get_rdp_level(void) { return (FLASH->OPTR1 & FLASH_OPTR1_RDP); } /** * @brief 读取BOR阈值等级 * @retval uint32_t FLASH读保护等级 * @arg FLASH_BOR_LEVEL_0 * @arg ... * @arg FLASH_BOR_LEVEL_3 */ __STATIC_INLINE uint32_t std_flash_get_bor_level(void) { return (FLASH->OPTR1 & FLASH_OPTR1_BOR_LEVEL); } /** * @brief 读取BOR使能控制 * @retval bool BOR使能控制 * @arg true 表示BOR使能 * @arg false 表示BOR禁止 */ __STATIC_INLINE bool std_flash_get_bor_en(void) { return ((FLASH->OPTR1 & FLASH_OPTR1_BOR_EN) == FLASH_OPTR1_BOR_EN); } /** * @brief 读取选项字节寄存器2 * @retval uint32_t 选项字节2加载值 */ __STATIC_INLINE uint32_t std_flash_get_opt2(void) { return (FLASH->OPTR2); } /** * @brief 读取芯片启动模式BOOT_SEL * @retval bool BOOT_SEL位配置值 * @arg true 表示BOOT_SEL为1 * @arg false 表示BOOT_SEL为0 */ __STATIC_INLINE bool std_flash_get_boot_sel(void) { return ((FLASH->OPTR2 & FLASH_OPTR2_BOOT_SEL) == FLASH_OPTR2_BOOT_SEL); } /** * @brief 读取芯片启动模式BOOT0_SW * @retval bool BOOT0_SW位配置值 * @arg true 表示BOOT0_SW为1 * @arg false 表示BOOT0_SW为0 */ __STATIC_INLINE bool std_flash_get_boot0_sw(void) { return ((FLASH->OPTR2 & FLASH_OPTR2_BOOT0_SW) == FLASH_OPTR2_BOOT0_SW); } /** * @brief 读取芯片启动模式BOOT1_SW * @retval bool BOOT1_SW位配置值 * @arg true 表示BOOT1_SW为1 * @arg false 表示BOOT1_SW为0 */ __STATIC_INLINE bool std_flash_get_boot1_sw(void) { return ((FLASH->OPTR2 & FLASH_OPTR2_BOOT1_SW) == FLASH_OPTR2_BOOT1_SW); } /** * @brief 读取VBAT使能控制 * @retval bool VBAT模式使能控制 * @arg true 表示VBAT模式使能 * @arg false 表示VBAT模式禁止 */ __STATIC_INLINE bool std_flash_get_vbat_mode(void) { return ((FLASH->OPTR2 & FLASH_OPTR2_VBAT_MODE_EN) == FLASH_OPTR2_VBAT_MODE_EN); } /** * @brief 读取IWDG在STOP模式下计数器停止控制 * @retval bool IWDG_STOP设置 * @arg true IWDG在STOP模式下计数器正常运行 * @arg false IWDG在STOP模式下计数器停止计数 */ __STATIC_INLINE bool std_flash_get_iwdg_stop(void) { return ((FLASH->OPTR2 & FLASH_OPTR2_IWDG_STOP) == FLASH_OPTR2_IWDG_STOP); } /** * @brief 读取进入STOP模式是否复位的配置 * @retval bool RST_STOP设置 * @arg true 执行进入STOP模式操作,进入STOP模式 * @arg false 执行进入STOP模式操作,产生复位 */ __STATIC_INLINE bool std_flash_get_rst_stop(void) { return ((FLASH->OPTR2 & FLASH_OPTR2_RST_STOP) == FLASH_OPTR2_RST_STOP); } /** * @brief 读取写保护区A起始页号 * @retval uint32_t 写保护区A起始页号 */ __STATIC_INLINE uint32_t std_flash_get_wrpa_start(void) { return (FLASH->WRP1AS & FLASH_WRP1AS_WRP1A_START); } /** * @brief 读取写保护区A结束页号 * @retval uint32_t 写保护区A结束页号 */ __STATIC_INLINE uint32_t std_flash_get_wrpa_end(void) { return (FLASH->WRP1AE & FLASH_WRP1AE_WRP1A_END); } /** * @brief 读取写保护区B起始页号 * @retval uint32_t 写保护区B起始页号 */ __STATIC_INLINE uint32_t std_flash_get_wrpb_start(void) { return (FLASH->WRP1BS & FLASH_WRP1BS_WRP1B_START); } /** * @brief 读取写保护区B结束页号 * @retval uint32_t 写保护区B结束页号 */ __STATIC_INLINE uint32_t std_flash_get_wrpb_end(void) { return (FLASH->WRP1BE & FLASH_WRP1BE_WRP1B_END); } /** * @brief 读取芯片型号 * @retval uint32_t 芯片型号 */ __STATIC_INLINE uint32_t std_flash_get_device_type(void) { return (*(uint32_t *)DEVICE_TYPE); } /** * @brief 读取Flash空间大小 * @retval uint32_t Flash空间大小 */ __STATIC_INLINE uint32_t std_flash_get_flash_size(void) { return (*(uint32_t *)USERFLASH_SIZE); } /** * @brief 读取SRAM空间大小 * @retval uint32_t SRAM空间大小 */ __STATIC_INLINE uint32_t std_flash_get_sram_size(void) { return (*(uint32_t *)SRAM_SIZE); } std_status_t std_flash_mass_erase(void); std_status_t std_flash_page_erase(uint32_t page_index); std_status_t std_flash_erase(uint32_t mode, uint32_t index); std_status_t std_flash_word_program(uint32_t address, uint32_t prog_data); std_status_t std_flash_opt_erase(void); std_status_t std_flash_wait_for_last_operation(uint32_t timeout); /** * @} */ #ifdef __cplusplus } #endif /** * @} */ /** * @} */ #endif /* CIU32L051_STD_FLASH_H */