【AT-START-F423测评】 + 用户系统数据区数据读写

一、概述
 

                                    
        在做IAP程序升级时,想用用户系统数据区来存储程序在IAP程序区还是APP区运行标志,结果研究了半天官方的用户手册和BSP函数,没有解决我的问题官方的函数基本用不了,满足不了需求。所以我研究了以下怎么使用,并写了一个操作读写户系统数据区的函数,经测试没有问题。

二、分析
 


        从下图来看,用户系统数据区拥有512字节的空间。
         


        从下图来看,0x1fff_f800,0x1fff_f808,0x1fff_f80c存放主FLASH的相关配置,不能乱修改,否则会导致FLASH锁了无法下载程序。
          

          
          如上所述,0x1fff_f800,0x1fff_f808,0x1fff_f80c存放的数据在写时候需要先读出来暂存起来,然后再写相应地址,写完相应地址,再把暂存的数据再写一次,不用担心再一次数据会覆盖,因为之前写过数据的地址,再次写是不会覆盖的,因为要覆盖的话,需要先擦除,然后按前面的步骤再来一遍。          如下图所示,在用户手册里,数据写操作分三个步骤:1.解锁;2.擦除;3.编程。
          


三、代码
 


     1.字操作代码

复制
flash_status_type FLASH_UserOptionWriteWord(uint32_t addr, uint32_t Data)

{

  flash_status_type status = FLASH_OPERATE_DONE;

        uint32_t buf[128];

        uint32_t Useraddr  = USD_BASE;

        int i = 0;

  flash_unlock();

  /* unlock the user system data */

  FLASH->usd_unlock = FLASH_UNLOCK_KEY1;

  FLASH->usd_unlock = FLASH_UNLOCK_KEY2;

  while(FLASH->ctrl_bit.usdulks==RESET);



  /* enable the user system data programming operation */

        for(i=0;i<128;i++)

        {

                 buf[i] = *(__IO uint32_t*)(Useraddr + (i*4));

        }

        flash_user_system_data_erase();

  FLASH->ctrl_bit.usdprgm = TRUE;

        *(__IO uint32_t*)addr = Data; 

        for(i=0;i<128;i++)

        {

                 *(__IO uint32_t*)(Useraddr + (i*4)) = buf[i];

        }

  /* wait for operation to be completed */

  status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);



  /* disable the usdprgm bit */

  FLASH->ctrl_bit.usdprgm = FALSE;

        flash_lock();

  return status;

}

    2.字节操作代码
   

复制
flash_status_type FLASH_UserOptionWriteByte(uint32_t addr, uint8_t Data)

{

  flash_status_type status = FLASH_OPERATE_DONE;

        uint32_t buf[128];

        uint32_t Useraddr  = USD_BASE;

        int i = 0;

  flash_unlock();

  /* unlock the user system data */

  FLASH->usd_unlock = FLASH_UNLOCK_KEY1;

  FLASH->usd_unlock = FLASH_UNLOCK_KEY2;

  while(FLASH->ctrl_bit.usdulks==RESET);



  /* enable the user system data programming operation */

        for(i=0;i<128;i++)

        {

                 buf[i] = *(__IO uint32_t*)(Useraddr + (i*4));

        }

        flash_user_system_data_erase();

  FLASH->ctrl_bit.usdprgm = TRUE;

        *(__IO uint16_t*)addr = Data; 

        for(i=0;i<128;i++)

        {

                 *(__IO uint32_t*)(Useraddr + (i*4)) = buf[i];

        }

  /* wait for operation to be completed */

  status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);



  /* disable the usdprgm bit */

  FLASH->ctrl_bit.usdprgm = FALSE;

        flash_lock();

  return status;

}

    3.验证代码
   

复制
 FLASH_UserOptionWriteWord(0x1FFFF804,0X0011002a);

        FLASH_UserOptionWriteByte(0x1FFFF810,0X88);

        printf("*(uint32_t*)0x1FFFF804 = %08X\r\n",*(__IO uint32_t*)0x1FFFF804);

        printf("*(uint32_t*)0x1FFFF810 = %04X\r\n",*(__IO uint16_t*)0x1FFFF810);

    4.验证结果
       

---------------------
作者:袁胜富
链接:https://bbs.21ic.com/icview-3334990-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值