本文作者:豆面

如何读取M3062型号设备的FLASH内容?

豆面 2025-01-10 09:26:37 14
如何读取M3062型号设备的FLASH内容?摘要: M3062读取FLASH的过程涉及多个步骤,包括解锁、擦除、写入和重新上锁等,以下是一个详细的操作流程:一、准备工作1、定义相关寄存器和地址: - FLASH_CR(Flash控制...

M3062读取FLASH的过程涉及多个步骤,包括解锁、擦除、写入和重新上锁等,以下是一个详细的操作流程:

一、准备工作

如何读取M3062型号设备的FLASH内容?

1、定义相关寄存器和地址

FLASH_CR(Flash控制寄存器)

FLASH_SR(Flash状态寄存器)

FLASH_AR(Flash地址寄存器)

FLASH_KEYR(FPEC密钥寄存器)

FLASH_USER_START_ADDR(用户数据存储的首地址,例如0x08007C00)

2、设置用户数据存储的首地址

通常建议将最后一个扇区用于用户数据存储,以避免在程序更新时丢失数据。

二、解锁FLASH

如何读取M3062型号设备的FLASH内容?

在进行任何FLASH操作之前,需要先解锁FLASH,这是因为每次复位后,FLASH都被锁定,只能通过特定的密钥序列进行解锁。

void Flash_unlock(void) {
    if ((FLASH>CR & FLASH_CR_LOCK) != RESET) {            //判断LOCK位
        FLASH>KEYR = 0x45670123;
        FLASH>KEYR = 0xCDEF89AB; 
    }
}

三、读取FLASH数据

读取FLASH数据相对简单,只需使用指针直接访问指定地址即可,以下是读取一个16位半字数据的示例:

uint16_t Flash_ReadHalfWord(uint32_t Address) {
    return *((__IO uint16_t *)(Address));	//使用指针访问指定地址下的数据并返回
}

假设要读取的数据地址为0x08007C00,可以这样调用:

uint16_t Flash_Data;                          //存储数据
__IO uint16_t * flashPtr;                     //该指针用来存储Flash读写地址
flashPtr = (__IO uint16_t *) 0x08007C00;                  //指向数据地址
Flash_Data = *flashPtr;                                   //读取数据

四、写入FLASH数据

写入FLASH数据前,需要先擦除目标扇区,因为FLASH的最小擦除单位是扇区,以下是写入一个16位半字数据的完整流程:

1. 解锁FLASH

与读取操作相同,首先需要解锁FLASH。

2. 擦除目标扇区

void Flash_ErasePage(uint32_t PageAddress) {
    FLASH>CR |= FLASH_CR_PER;           //置位扇区擦除控制位
    FLASH>AR = PageAddress;            //对应扇区起始地址
    FLASH>CR |= FLASH_CR_STRT;         //开始扇区清除
    while ((FLASH>SR & (FLASH_SR_BSY | FLASH_SR_EOP)) != 0x20);    //等待擦除完毕
    FLASH>SR |= FLASH_SR_EOP;                 //清除标志位
    FLASH>CR = 0x80;                          //重新上锁,擦除完成
}

假设要擦除的页地址为0x08007C00,可以这样调用:

如何读取M3062型号设备的FLASH内容?
Flash_ErasePage(0x08007C00);

3. 写入数据

void Flash_WriteHalfWord(uint32_t Address, uint16_t Data) {
    Flash_unlock();                             //解锁
    flashPtr = (__IO uint16_t *) Address;        //选择写入地址,只能是擦除的扇区内
    FLASH>CR |= FLASH_CR_PG;                   //置位Flash写入控制位
    *flashPtr = Data;              //写入数据到flashPrt地址对应空间中
    while ((FLASH>SR & (FLASH_SR_BSY | FLASH_SR_EOP)) != 0x20);  //等待写入完成
    FLASH>SR |= FLASH_SR_EOP;                 //清除标志位
    FLASH>CR = 0x80;                          //重新上锁
}

假设要写入的数据为0x1234,地址为0x08007C00,可以这样调用:

Flash_WriteHalfWord(0x08007C00, 0x1234);

五、重新上锁FLASH

虽然在上述写入函数中已经包含了重新上锁的步骤,但在某些情况下,可能需要单独执行重新上锁的操作:

void Flash_Lock(void) {
    FLASH>CR |= FLASH_CR_LOCK;          //设置LOCK位,重新上锁
}

M3062读取FLASH的过程主要包括以下几个步骤:解锁FLASH、使用指针直接访问指定地址读取数据、(可选)擦除目标扇区、写入数据以及重新上锁FLASH,需要注意的是,由于FLASH的最小擦除单位是扇区,因此在写入新数据之前通常需要先擦除整个扇区,为了确保数据的安全性和稳定性,建议在实际项目中加入必要的错误检测和处理机制。

文章版权及转载声明

作者:豆面本文地址:https://www.jerry.net.cn/articals/14087.html发布于 2025-01-10 09:26:37
文章转载或复制请以超链接形式并注明出处杰瑞科技发展有限公司

阅读
分享