概述
所需功能:
通过4G网络模块下发授权状态,
设"S0"和"S1"分别代表授权和取消授权。
将授权状态存储到flash里确保断电不会丢失授权状态。
//变量
uint16_t empower= 0x1111; //授权标志,存入flash
uint16_t stop_authorize= 0x2222; //停止授权标志,存入flash
FLASH_EraseInitTypeDef My_Flash; //创建一个flash结构体
//flash读写函数
void flash_write(uint16_t my_add)//uint16_t my_add
{
HAL_FLASH_Unlock(); //解锁Flash
My_Flash.TypeErase = FLASH_TYPEERASE_PAGES; //表明只做擦除操作
My_Flash.PageAddress = Robot_Num_Flash_Add; //声明地址
My_Flash.NbPages = 1; //页数
uint32_t PageError = 0x00001111; //??PageError,??????????????????FLASH??
HAL_FLASHEx_Erase(&My_Flash, &PageError); //擦除
uint16_t Write_Flash_Data = my_add;
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Robot_Num_Flash_Add, Write_Flash_Data); //?Flash????,FLASH_TYPEPROGRAM_HALFWORD ?????Flash???16??,????32??64????,????HAL??????
HAL_FLASH_Lock(); //??Flash
}
//读取到的flash数据使用ID_Num暂存
void flash_read()
{
//uint32_t Robot_Num_Flash_Add = 0x08005000;
ID_Num = *(__IO uint16_t*)( Robot_Num_Flash_Add );
}
//主函数,
int main(void)
{
while(1)
{
//4G模块的指令控制
if(flag_uart2==2)//当收到4G模块的指令
{
flag_uart2=0;
HAL_Delay(50);
HAL_Delay(100);
flash_read();
//RxData2_decode代表收到的4G模块指令
if(strstr(RxData2_decode,"nextun")!=NULL )//取消授权
{
//未授权
flash_write(stop_authorize);
flag_power=2;//是否授权的标志位,2代表取消授权
ID_Num=0x2222;
}
else if(strstr(RxData2_decode,"au")!=NULL )//授权
{
//授权
flash_write(empower);
flag_power=1;//是否授权的标志位,1代表授权
ID_Num=0x1111;
}
HAL_Delay(25);
//清空数据缓存
memset(RxData2_decode,0,sizeof(RxData2_decode))
ID_Num=0x0000;
i2=0;
}
}
}
以上并不是全部代码,直接复制无法使用,只是为了记录整个流程,需要各位结合自己项目略作修改。
遗留问题:读取数据时正确的,但是用串口输出就变了,不知道为啥,数据定义为ID_NUM=0x1111,输出出来变成了0x3291
最后
以上就是曾经日记本为你收集整理的hal库读写flash—(基于项目需求:断电也能保存设备状态)的全部内容,希望文章能够帮你解决hal库读写flash—(基于项目需求:断电也能保存设备状态)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复