一、前言
这将是"物联网Lora模块从入门到精通"系列的最后一篇文章,相信各位同僚通过前面八篇文章的分享已经极好的掌握了Lora模块的编程,本文的Flash的读取与存储将是Lora模块开发的最后一块,感谢大家的陪伴与支持!
希望大家能在学习的道路上越走越远,不忘初心,砥砺前行!
二、代码实现
本次的任务要求是记录程序重启的次数。
在提供给我们的标准例程中,为我们提供了操作Flash的方法,包括读和写。这些方法包含在flash.c的库中:
/**********************************************************************************************
*函数:void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
*功能:读取EEPROM数组写入操作
*输入:WriteAddr:起始地址
pBuffer:数据指针
NumToWrite:字(32位)数
*输出:无
*特殊说明:无
**********************************************************************************************/
void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
{
HAL_FLASH_Unlock();//锁住FLASH
HAL_FLASHEx_DATAEEPROM_Unlock(); //解锁FLASH
//擦除FLASH
FLASH_EraseInitTypeDef FLASH_EraseTypeDef;//初始化FLASH_EraseInitTypeDef
FLASH_EraseTypeDef.TypeErase = FLASH_TYPEERASE_PAGES;
FLASH_EraseTypeDef.PageAddress = WriteAddr;
FLASH_EraseTypeDef.NbPages = 1;
uint32_t PageError = 0;//设置PageError
HAL_FLASHEx_Erase(&FLASH_EraseTypeDef, &PageError);//调用擦除函数
uint32_t i;
for(i=0; i<NumToWrite; i++)
{
HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAM_WORD, WriteAddr, pBuffer[i]);//FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
WriteAddr+=4;//地址增加4.
}
HAL_FLASHEx_DATAEEPROM_Lock();//锁住FLASH
HAL_FLASH_Lock();//锁住FLASH
}
//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:字(32位)数
void STMFLASH_Read(uint32_t ReadAddr,uint32_t *PBuffer,uint32_t NumToRead)
{
uint32_t i;
for(i=0; i<NumToRead; i++)
{
PBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.
ReadAddr+=4;//偏移4个字节.
}
}
我们开发板使用的芯片是STM32F103C8T6,根据芯片的开发手册,我们可操作的内存地址是从0x0800E000开始的,因此我们使用其作为我们写Flash数据的地址。
根据上述函数的描述,我们先声明一个uint32_t类型的数组,将其作为数据存储的容器。
由于我们需要记录程序重启的次数,因此我们需要先对该地址写一个初值0。
随后,我们可以正式开始我们的代码工作,即上电后将数据读出,对数据执行+1操作后再次存入Flash。
uint32_t data[1];
int main( void )
{
STMFLASH_Read(0x0800E000,data,1);//读取数据
data[0]++;
STMFLASH_Write(0x0800E000,data,1);//写入FLASH
while( 1 )
{
//程序代码
}
}
至此,我们便完成了FLASH的读取与存储操作。
我们增加任务内容,即可以使用按键控制增加、减少、或清空记录数。
uint32_t data[1];
int main( void )
{
STMFLASH_Read(0x0800E000,data,1);//读取数据
data[0]++;
STMFLASH_Write(0x0800E000,data,1);//写入FLASH
while( 1 )
{
if(isKey2Pressed())
{
STMFLASH_Read(0x0800E000,data,1);//读取数据
data[0]--;
STMFLASH_Write(0x0800E000,data,1);//写入FLASH
resetKey2();
}
if(isKey3Pressed())
{
STMFLASH_Read(0x0800E000,data,1);//读取数据
data[0]++;
STMFLASH_Write(0x0800E000,data,1);//写入FLASH
resetKey3();
}
if(isKey4Pressed())
{
STMFLASH_Read(0x0800E000,data,1);//读取数据
data[0]=0;
STMFLASH_Write(0x0800E000,data,1);//写入FLASH
resetKey4();
}
}
}
在Flash的读取与存储中,由于某些不可控因素,写之前建议大家先读取Flash内的内容后再次更更改,随更随改,增加程序的稳定性,避免发生意外情况。
三、总结
至此,我们也已经完成了Lora模块的全部学习,后续我会继续分享STM32开发的其他知识,感谢大家关注。