CH32V20x_30x系列用户选择字区域应用与操作
简介
CH32V20x系列、V30x系列用户选择字区域大小为128字节,除却用户选择字信息结构用到的16字节,还剩余112字节可作为他用,用来存储相关数据等。
注意剩余空间在使用时,和上述一致,若[7:0]为数据,则[15:8]为数据的反码。此外,在对剩余空间进行操作时,需要将用户选择字信息结构部分的内容保存重新写入。
用户选择字剩余区域操作代码如下:
//用户选择字编程 //Address地址从0x1FFFF810开始 FLASH_Status User_SWord_ProgramHalfWord(uint32_t Address, uint8_t Data) { FLASH_Status status = FLASH_COMPLETE; uint32_t Addr = 0x1FFFF800; __IO uint8_t i; uint16_t pbuf[64]; status = FLASH_WaitForLastOperation(0x00005000); if(status == FLASH_COMPLETE) { FLASH->OBKEYR = ((uint32_t)0x45670123); FLASH->OBKEYR = ((uint32_t)0xCDEF89AB); /* Read optionbytes */ for(i = 0; i < 8; i++) { pbuf[i] = *(uint16_t *)(Addr + 2 * i); } /* Erase optionbytes */ FLASH->CTLR |= ((uint32_t)0x00000020); FLASH->CTLR |= ((uint32_t)0x00000040); while(FLASH->STATR & ((uint32_t)0x00000001)); FLASH->CTLR &= ~((uint32_t)0x00000020); /* Write optionbytes */ pbuf[((Address - 0x1FFFF800) / 2)] = ((((uint16_t) ~(Data)) << 8) | ((uint16_t)Data)); FLASH->CTLR |= 0x00000010; for(i = 0; i < 8; i++) { *(uint16_t *)(Addr + 2 * i) = pbuf[i]; while(FLASH->STATR & ((uint32_t)0x00000001)) ; } *(uint16_t *)(Address) = pbuf[((Address - 0x1FFFF800) / 2)]; while(FLASH->STATR & ((uint32_t)0x00000001)) ; FLASH->CTLR &= ~0x00000010; } return status; } void User_SWord_ProgramTest(void) { FLASH_Unlock(); //写入 User_SWord_ProgramHalfWord(0x1FFFF814,0x12); printf("0x1FFFF814-%04x\r\n", *(u16*)0x1FFFF814); }
测试结果如下:
注意该操作需要对FLASH进行解锁。
分类:
32位MCU学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~