hal库读写flash—(基于项目需求:断电也能保存设备状态)

所需功能:
通过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
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值