STM32GO中Flash充当EEPROM的操作 |
您所在的位置:网站首页 › g0过去式怎么写 › STM32GO中Flash充当EEPROM的操作 |
STM32GO中Flash充当EEPROM的操作
之前在学校的时候一直使用的是STM32F1的芯片,本月找了一份工作,安排下来的任务是写一个传感器的程序,程序比较简单,主要分为了两个部分: - 在Flash中找一片区域充当EEPROM的功能,实现初始化数据的存储。 - 使用ADC和DAC功能来实现将输入的信号,按照要求重新规划到规定的电压区间,然后输出。 由于之前一直都是直接使用的外置EEPROM芯片,所以这一次是一个新的学习过程,所以记录一下,废话不多说,正文开始。 在编写过程中主要需要注意的有两点 选址 要想实现Flash当作EEPROM的使用,第一步只能是去翻看芯片手册中对于Flash部分的描述: 首先我们要做的就是要选择一个合适的地址范围,我用到型号是STM32GO81xx,Main memory共有128 kb,被划分为了64Page,每页大小有2K。为了好找,我选择的区域是最后一页,地址范围为: 0x0801 F800 - 0x0801 FFFF。![]() ![]() ![]() 主要的需要注意的讲完以后,我们就要开始正式编程了,标准的编程步骤如下: 解锁。确保要写入地址的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的调试功能可以看到数据已经写入进入,重新复位数据依然存在: 写在最后: 第一次写,存在很多的不足,主要是为了加深印象和给像我这样的小白一些参考,存在的不足也希望大家能够不吝赐教,谢谢! |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |