华大电子MCU-CIU32F011x3、CIU32F031x5嵌入式闪存

本文详细介绍了华大电子CIU32F011x3及CIU32F031x5系列微控制器中集成的嵌入式FLASH控制模块的功能与特性。该模块支持高达64K主闪存空间,并具备存储器结构划分、读保护、擦写保护等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 嵌入式闪存(FLASH)
    5.1. 模块介绍
    华大电子MCU CIU32F011x3、CIU32F031x5 集成了嵌入式 FLASH 控制模块,该模块控制 FLASH 的擦除、编程以及读取数据。上电时会从 FLASH 中读取相关数据进行校验以及初始化配置,保证芯片程序在正确且安全的情况下运行。
    5.2. 功能特点
    • 支持高达 64K 主闪存空间的 FLASH
    • 存储器结构
    – 主闪存空间 64K 字节
    – 副闪存空间 4.5K 字节
    • 指出对闪存空间的擦写、编程和读操作
    • 支持对闪存空间访问限制和擦写保护
    • 支持低功耗模式
    5.3. 功能说明
    5.3.1. 闪存结构
    闪存空间由 32 位宽的存储单元组成,既可以存代码又可以存数据。主闪存块按 32 页(每页 1K 字节)分块,以页为单位设置写保护(参见存储保护相关内容)。
    在这里插入图片描述
    注:当主闪存空间 64KB 不够存放用户程序时,可把副闪存空间的扇区 0 至扇区 7 扩展为程序存放空间,即支持 68KB的程序存放空间。
    5.3.2. 闪存读保护
    读操作在整个芯片工作电压范围内都可以完成,用于存放指令或者数据。当 NVR8 用户配置区经过自定义的保护配置后,SWD 连接时会对 FLASH 的代码数据执行保护机制。
    注:FLASH 运行在 24MHz 工作频率,当系统时钟超过 30MHz 时,需要配置 TIMER_REG0 的 RC 参数,增加时钟周期数再把 FLASH 接口的数据写到寄存器。
    5.3.3. 闪存擦除和烧写操作
    烧写和擦除操作在整个芯片工作电压范围内都可以完成。烧写和擦除操作由下列 6 个寄存器完成,先根据烧写的时钟配置好烧写时序(TIME_REG1),再配置烧写密码,配置好编程地址,最后配置好编程数据,即可开始执行烧写,然后等待操作结束。
    烧写操作相关寄存器
    • 时序寄存器 1 :TIME_REG1
    • 密码寄存器 :NVR_PASSWORD/MAIN_PASSWORD
    • 编程地址寄存器:PROG_ADDR
    • 编程数据寄存器:PROG_DATA
    • 状态寄存器 :DONE
    擦除操作相关寄存器:
    • 擦除控制寄存器:ERASE_CTRL
    注:需要注意的是,FLASH 在擦除/烧写的同时不可以从 FLASH 取数据,所以 FLASH 在擦除/烧写过程中会让总线停顿,
    直到完成后才能继续运行。
要使用 CIU32F031 芯片实现 I2C 通信的模拟,通常采用软件模拟的方式,因为该芯片可能没有额外的硬件 I2C 接口可供使用,或者用户希望灵活控制通信过程。以下是实现模拟 I2C 通信的基本方法和步骤: ### 1. 选择 GPIO 引脚模拟 SDA 和 SCL 信号 CIU32F031 提供了丰富的 GPIO 资源,可以选择两个 GPIO 引脚分别作为 I2C 的 SDA(数据线)和 SCL(时钟线)。这两个引脚需要支持开漏输出和上拉功能,以符合 I2C 总线协议的要求。 ### 2. 初始化 GPIO 引脚 将选定的 GPIO 配置为开漏输出模式,并启用内部上拉电阻,或者外部加上拉电阻,确保总线在空闲时保持高电平。 ### 3. 实现 I2C 协议的基本时序 根据 I2C 协议标准,模拟 I2C 需要实现以下基本操作函数: - **起始条件(START)**:SDA 从高变低,同时 SCL 为高电平。 - **停止条件(STOP)**:SDA 从低变高,同时 SCL 为高电平。 - **发送一个字节(Write Byte)**:逐位发送 8 位数据,高位在前。 - **接收一个字节(Read Byte)**:逐位读取 8 位数据,高位在前。 - **应答信号(ACK/NACK)**:接收方在第 9 个时钟周期拉低 SDA 表示应答(ACK),否则为非应答(NACK)。 ### 4. 控制延时以满足时序要求 由于是软件模拟,必须通过延时函数控制 SCL 的高低电平持续时间,以满足 I2C 的通信速率(如 100 kbps 或 400 kbps)。延时函数可以通过简单的循环实现。 ### 5. 示例代码 以下是一个基于 C 语言的简化模拟 I2C 驱动代码示例: ```c #include "ciu32f031.h" #define I2C_SCL_PIN GPIO_PIN_5 #define I2C_SDA_PIN GPIO_PIN_6 #define I2C_PORT GPIOA void I2C_Delay(void) { for (volatile int i = 0; i < 100; i++); } void I2C_Start(void) { I2C_SDA_HIGH(); I2C_SCL_HIGH(); I2C_Delay(); I2C_SDA_LOW(); I2C_Delay(); I2C_SCL_LOW(); I2C_Delay(); } void I2C_Stop(void) { I2C_SDA_LOW(); I2C_SCL_HIGH(); I2C_Delay(); I2C_SDA_HIGH(); I2C_Delay(); } void I2C_WriteByte(uint8_t byte) { for (uint8_t i = 0; i < 8; i++) { if (byte & 0x80) { I2C_SDA_HIGH(); } else { I2C_SDA_LOW(); } I2C_SCL_HIGH(); I2C_Delay(); I2C_SCL_LOW(); I2C_Delay(); byte <<= 1; } // 等待ACK I2C_SDA_HIGH(); I2C_SCL_HIGH(); I2C_Delay(); I2C_SCL_LOW(); } uint8_t I2C_ReadByte(void) { uint8_t byte = 0; I2C_SDA_HIGH(); for (uint8_t i = 0; i < 8; i++) { byte <<= 1; I2C_SCL_HIGH(); I2C_Delay(); if (I2C_SDA_READ()) { byte |= 0x01; } I2C_SCL_LOW(); I2C_Delay(); } // 发送NACK I2C_SDA_LOW(); I2C_SCL_HIGH(); I2C_Delay(); I2C_SCL_LOW(); return byte; } ``` ### 6. 调试与优化 - 使用逻辑分析仪或示波器检查 SDA 和 SCL 的波形是否符合 I2C 协议。 - 根据实际通信速率调整延时函数。 - 确保外设器件的地址和寄存器配置正确。 CIU32F031 的低功耗特性(运行功耗:50μA/MHz;休眠功耗:低至1μA)使其在电池供电设备中表现优异[^2]。因此,模拟 I2C 通信在智能家居、IoT 传感器等低功耗应用场景中具有较高的实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值