[RISC-V MCU 应用开发] CH32V20x_30x系列用户选择字区域应用与操作

[复制链接]
 楼主| LIzs6 发表于 2024-1-17 19:25 | 显示全部楼层 |阅读模式
来源:https://www.cnblogs.com/liaigu/p/17838776.html
简介
CH32V20x系列、V30x系列用户选择字区域大小为128字节,除却用户选择字信息结构用到的16字节,还剩余112字节可作为他用,用来存储相关数据等。
6979165a7b8f50449a.png
注意剩余空间在使用时,和上述一致,若[7:0]为数据,则[15:8]为数据的反码。此外,在对剩余空间进行操作时,需要将用户选择字信息结构部分的内容保存重新写入。

用户选择字剩余区域操作代码如下:
  1. //用户选择字编程
  2. //Address地址从0x1FFFF810开始
  3. FLASH_Status User_SWord_ProgramHalfWord(uint32_t Address, uint8_t Data)
  4. {
  5.     FLASH_Status status = FLASH_COMPLETE;
  6.     uint32_t     Addr = 0x1FFFF800;
  7.     __IO uint8_t i;
  8.     uint16_t     pbuf[64];

  9.     status = FLASH_WaitForLastOperation(0x00005000);
  10.     if(status == FLASH_COMPLETE)
  11.     {
  12.         FLASH->OBKEYR = ((uint32_t)0x45670123);
  13.         FLASH->OBKEYR = ((uint32_t)0xCDEF89AB);

  14.         /* Read optionbytes */
  15.         for(i = 0; i < 8; i++)
  16.         {
  17.             pbuf[i] = *(uint16_t *)(Addr + 2 * i);
  18.         }

  19.         /* Erase optionbytes */
  20.         FLASH->CTLR |= ((uint32_t)0x00000020);
  21.         FLASH->CTLR |= ((uint32_t)0x00000040);
  22.         while(FLASH->STATR & ((uint32_t)0x00000001));
  23.         FLASH->CTLR &= ~((uint32_t)0x00000020);

  24.         /* Write optionbytes */
  25.         pbuf[((Address - 0x1FFFF800) / 2)] = ((((uint16_t) ~(Data)) << 8) | ((uint16_t)Data));

  26.         FLASH->CTLR |= 0x00000010;

  27.         for(i = 0; i < 8; i++)
  28.         {
  29.             *(uint16_t *)(Addr + 2 * i) = pbuf[i];
  30.             while(FLASH->STATR & ((uint32_t)0x00000001)) ;
  31.         }
  32.         *(uint16_t *)(Address) = pbuf[((Address - 0x1FFFF800) / 2)];
  33.         while(FLASH->STATR & ((uint32_t)0x00000001)) ;

  34.         FLASH->CTLR &= ~0x00000010;
  35.     }

  36.     return status;
  37. }

  38. void User_SWord_ProgramTest(void)
  39. {
  40.     FLASH_Unlock();

  41.     //写入
  42.     User_SWord_ProgramHalfWord(0x1FFFF814,0x12);

  43.     printf("0x1FFFF814-%04x\r\n", *(u16*)0x1FFFF814);

  44. }
测试结果如下:
7684665a7b935b2ae8.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

145

帖子

2

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

7

主题

145

帖子

2

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