STM32GO中Flash充当EEPROM的操作

您所在的位置:网站首页 g0过去式怎么写 STM32GO中Flash充当EEPROM的操作

STM32GO中Flash充当EEPROM的操作

2024-07-13 03:45:22| 来源: 网络整理| 查看: 265

STM32GO中Flash充当EEPROM的操作

之前在学校的时候一直使用的是STM32F1的芯片,本月找了一份工作,安排下来的任务是写一个传感器的程序,程序比较简单,主要分为了两个部分: - 在Flash中找一片区域充当EEPROM的功能,实现初始化数据的存储。 - 使用ADC和DAC功能来实现将输入的信号,按照要求重新规划到规定的电压区间,然后输出。

由于之前一直都是直接使用的外置EEPROM芯片,所以这一次是一个新的学习过程,所以记录一下,废话不多说,正文开始。

在编写过程中主要需要注意的有两点

选址 要想实现Flash当作EEPROM的使用,第一步只能是去翻看芯片手册中对于Flash部分的描述: 首先我们要做的就是要选择一个合适的地址范围,我用到型号是STM32GO81xx,Main memory共有128 kb,被划分为了64Page,每页大小有2K。为了好找,我选择的区域是最后一页,地址范围为: 0x0801 F800 - 0x0801 FFFF。 在这里插入图片描述闪存的编程和擦除 通过手册中的描述,在芯片复位以后,Flash编程操作是被保护的,不能写入。通过写入特定的序列KEY、KEY2到FLASH_KEYR寄存器才可解除写保护,只有在写保护被解除后,我们才能操作相关的寄存器。 这个操作有官方库中的HAL_FLASH_Unlock()函数来实现,操作完成以后,FLASH_CR便被解锁了,如果写入错误,那么FLASH_CR将被锁定,知道下次复位才可以再次解锁。 FLASH的解锁操作 而且从手册中我们可以看出,STM32G0的Flash的写入只支持双字写入: FLASH写入支持 还有一点需要注意的就是在往Flash写入数据以前需要检查该区域是否已经擦除,因为在对Flash进行编程的时候,必须要求其写入地址的Flash是被擦出的(也就是说其值必须是0xFFFFFFFF),否则无法写入,STM32G0擦除时有两种模式可以选择,批量擦除和页擦除,由于用到的只有最后一页,所以,这里我选择的是页擦除模式。 FLASH_EraseInitTypeDef FlashEraseInit; FlashEraseInit.TypeErase=FLASH_TYPEERASE_PAGES; //擦除类型,页擦除 FlashEraseInit.Page=63; //从哪页开始擦除 FlashEraseInit.NbPages=1; //一次只擦除一页 if(HAL_FLASHEx_Erase(&FlashEraseInit,&PageError)!=HAL_OK) { break;//发生错误了 }

主要的需要注意的讲完以后,我们就要开始正式编程了,标准的编程步骤如下:

解锁。确保要写入地址的Flash已经擦除完全。检查 FLASH_SR 中的 BSY 位,确保当前未执行任何 FLASH 操作。将 FLASH_CR 寄存器中的 PG 位置 1,激活 FLASH 编程.针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作.等待 BSY 位清零,完成一次编程.

完整的Flash写入函数如下:

u32 STMFLASH_ReadWord(u32 faddr) { return *(vu32*)faddr; } void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite) { FLASH_EraseInitTypeDef FlashEraseInit; HAL_StatusTypeDef FlashStatus=HAL_OK; u32 PageError=0; u32 addrx=0; u32 endaddr=0; if(WriteAddr if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF) //有非0XFFFFFFFF的地方,要擦除这个扇区 { FlashEraseInit.TypeErase=FLASH_TYPEERASE_PAGES; //擦除类型,页擦除 FlashEraseInit.Page=63; //从哪页开始擦除 FlashEraseInit.NbPages=1; //一次只擦除一页 if(HAL_FLASHEx_Erase(&FlashEraseInit,&PageError)!=HAL_OK) { break;//发生错误了 } }else addrx+=4; FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成 } } FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME); //等待上次操作完成 if(FlashStatus==HAL_OK) { while(WriteAddr break; //写入异常 } WriteAddr+=8; pBuffer+=2; } } HAL_FLASH_Lock(); //上锁 } void STMFLASH_Read(u32 ReadAddr,u32 *pBuffer,u32 NumToRead) //连续读取 { u32 i; for(i=0;i int aa[4]={1,2,3,4}; HAL_Init(); SystemClock_Config(); STMFLASH_Write(STM32_EEPROM_BASE,(u32*)aa,sizeof(aa)/8); while(1) { } }

通过Keil的调试功能可以看到数据已经写入进入,重新复位数据依然存在: 查看Flash

写在最后: 第一次写,存在很多的不足,主要是为了加深印象和给像我这样的小白一些参考,存在的不足也希望大家能够不吝赐教,谢谢!



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭