[活动专区] 【AT-START-F423测评】 + 用户系统数据区数据读写

[复制链接]
 楼主| 袁胜富 发表于 2023-10-22 22:55 | 显示全部楼层 |阅读模式
<
本帖最后由 袁胜富 于 2023-10-22 23:21 编辑

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

二、分析

        从下图来看,用户系统数据区拥有512字节的空间。
         9449165353732a95ad.png
        从下图来看,0x1fff_f800,0x1fff_f808,0x1fff_f80c存放主FLASH的相关配置,不能乱修改,否则会导致FLASH锁了无法下载程序。
          77371653537c6d457b.png          
          如上所述,0x1fff_f800,0x1fff_f808,0x1fff_f80c存放的数据在写时候需要先读出来暂存起来,然后再写相应地址,写完相应地址,再把暂存的数据再写一次,不用担心再一次数据会覆盖,因为之前写过数据的地址,再次写是不会覆盖的,因为要覆盖的话,需要先擦除,然后按前面的步骤再来一遍。          如下图所示,在用户手册里,数据写操作分三个步骤:1.解锁;2.擦除;3.编程。
          3365565353a2b55f77.png
三、代码

     1.字操作代码
  1. flash_status_type FLASH_UserOptionWriteWord(uint32_t addr, uint32_t Data)
  2. {
  3.   flash_status_type status = FLASH_OPERATE_DONE;
  4.         uint32_t buf[128];
  5.         uint32_t Useraddr  = USD_BASE;
  6.         int i = 0;
  7.   flash_unlock();
  8.   /* unlock the user system data */
  9.   FLASH->usd_unlock = FLASH_UNLOCK_KEY1;
  10.   FLASH->usd_unlock = FLASH_UNLOCK_KEY2;
  11.   while(FLASH->ctrl_bit.usdulks==RESET);

  12.   /* enable the user system data programming operation */
  13.         for(i=0;i<128;i++)
  14.         {
  15.                  buf[i] = *(__IO uint32_t*)(Useraddr + (i*4));
  16.         }
  17.         flash_user_system_data_erase();
  18.   FLASH->ctrl_bit.usdprgm = TRUE;
  19.         *(__IO uint32_t*)addr = Data;
  20.         for(i=0;i<128;i++)
  21.         {
  22.                  *(__IO uint32_t*)(Useraddr + (i*4)) = buf[i];
  23.         }
  24.   /* wait for operation to be completed */
  25.   status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);

  26.   /* disable the usdprgm bit */
  27.   FLASH->ctrl_bit.usdprgm = FALSE;
  28.         flash_lock();
  29.   return status;
  30. }
    2.字节操作代码
   
  1. flash_status_type FLASH_UserOptionWriteByte(uint32_t addr, uint8_t Data)
  2. {
  3.   flash_status_type status = FLASH_OPERATE_DONE;
  4.         uint32_t buf[128];
  5.         uint32_t Useraddr  = USD_BASE;
  6.         int i = 0;
  7.   flash_unlock();
  8.   /* unlock the user system data */
  9.   FLASH->usd_unlock = FLASH_UNLOCK_KEY1;
  10.   FLASH->usd_unlock = FLASH_UNLOCK_KEY2;
  11.   while(FLASH->ctrl_bit.usdulks==RESET);

  12.   /* enable the user system data programming operation */
  13.         for(i=0;i<128;i++)
  14.         {
  15.                  buf[i] = *(__IO uint32_t*)(Useraddr + (i*4));
  16.         }
  17.         flash_user_system_data_erase();
  18.   FLASH->ctrl_bit.usdprgm = TRUE;
  19.         *(__IO uint16_t*)addr = Data;
  20.         for(i=0;i<128;i++)
  21.         {
  22.                  *(__IO uint32_t*)(Useraddr + (i*4)) = buf[i];
  23.         }
  24.   /* wait for operation to be completed */
  25.   status = flash_operation_wait_for(PROGRAMMING_TIMEOUT);

  26.   /* disable the usdprgm bit */
  27.   FLASH->ctrl_bit.usdprgm = FALSE;
  28.         flash_lock();
  29.   return status;
  30. }
    3.验证代码
   
  1. FLASH_UserOptionWriteWord(0x1FFFF804,0X0011002a);
  2.         FLASH_UserOptionWriteByte(0x1FFFF810,0X88);
  3.         printf("*(uint32_t*)0x1FFFF804 = %08X\r\n",*(__IO uint32_t*)0x1FFFF804);
  4.         printf("*(uint32_t*)0x1FFFF810 = %04X\r\n",*(__IO uint16_t*)0x1FFFF810);
    4.验证结果
       2111865353d5bbc884.png



评论

谢谢分享!  发表于 2023-10-25 16:39
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

163

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部