首页 > 其他分享 >CH32V20x_30x系列用户选择字区域应用与操作

CH32V20x_30x系列用户选择字区域应用与操作

时间:2023-11-17 15:12:42浏览次数:34  
标签:30x pbuf CTLR FLASH 用户 CH32V20x uint16 Address uint32

来源:https://www.cnblogs.com/liaigu/p/17838776.html

简介

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进行解锁。

标签:30x,pbuf,CTLR,FLASH,用户,CH32V20x,uint16,Address,uint32
From: https://www.cnblogs.com/wchmcu/p/17838798.html

相关文章

  • 用户资源限制检测脚本
    以下是修改后的Shell脚本,按照所需的输出格式输出不符合规范的用户信息:#!/bin/bashhostname=$(hostname)#获取所有可以登录的用户列表users=$(cut-d:-f1/etc/passwd)#遍历每个用户foruserin$users;do#获取用户的最大文件打开数限制max_file_limit=$(sud......
  • sqlserver登录名和用户名之间的关系
    SQLServer创建登录名和用户名【详细介绍】_ssms可视化新建用户-CSDN博客一、登录名与用户名首先,咱们先来聊聊:数据库登陆名和数据库用户名之间的关系。数据库登陆名和数据库用户名是有差别的,在一个数据库中是一一相对应的关系。一个经典的比喻:如果把数据库比作一个大厦,那么数据......
  • 小红书视频作品评论用户ID提取,采集关键词工具,精易VIP模块轻松实现
    那么这个工具只是一个开源版,我会把源码,DLL命令,变量,都会公布出来,这样才完整,你可以直接复制去用,不像网上的一些博主就分享一个窗口的代码,用户复制发现缺少这个又缺少那个,非常麻烦,我这边分享的都是完整的哈。实现原理是通过精易VIP助手,它使用C++开发的,直接调用谷歌浏览器官方内核,可......
  • 小红书视频评论区提取工具,用户ID关键词用户采集,易语言调用谷歌内核实现
    这个原理就是调用了精易VIP模块的谷歌浏览器内核,然后截取数据包,网页会通过命令自动下滑,然后视频下面的评论区很快都会加载出来,而加载出来的数据包通过精易vip模块的数据截取命令截取,然后把数据提取到指定的变量里面,然后通过JSON命令解析采集出来的评论用户ID、关键词、时间等信息,......
  • Lumen框架 之api用户认证
    一、配置1、在\app\bootstrap\app.php中取消注释$app->withFacades();$app->withEloquent();$app->routeMiddleware(['auth'=>App\Http\Middleware\Authenticate::class]);$app->register(App\Providers\AuthServiceProvider::class);2、创建用户......
  • Navicat设置MySQL某用户只可访问特定数据库或表
    概述项目中需要将数据库中某些表对其他系统开放,故需设置数据库的访问权限,使得某用户只能访问指定的表。MySQL提供了相关的SQL语句,但本次使用Navicat以可视化方式进行配置。方法1、新建用户2、设置权限(1)服务器权限全不勾选(2)权限权限用于设置该用户可操作哪些数据库或表,且可设置操作......
  • 11 16 更新用户密码
     @PatchMapping注解是因为接口文档的请求方式是patch,参数声明了map集合对象,@RequestBody是把json数据转化为map对象controller层:service层:  mapper层: 新增文章分类:下面分别是controller,service,mapper: 接口文档要求两个参数均非空,所以对实体参数进行校验:......
  • 用户交互Scanner
        ......
  • nginx配置kibana访问用户名和密码认证、及无认证访问配置
    在nginx上配置kibana页面访问时,默认是采用kibana的认证,一般直接安装kibana后,是没有用户名和密码认证的。如果要在负载均衡上配置反向代理和用户认证,可按以下步骤进行配置:1.安装Nginx:首先,确保已经安装了Nginx,并且可以正常访问Kibana页面。2.生成密码文件:使用htpa......
  • C#winform学习4(tab光标顺序、子窗口打开限制、提示框、定时器、状态栏用户时间、下拉
    1.更改光标顺序视图-->Tab键顺序启动的时候,光标就会在用户名的文本框中,并且在按tab键的时候,光标就会按照我们定的顺序显示。即用户名文本框--tab-->密码文本框--tab-->登录--tab-->重置 2.新建类右键-->添加-->类写入代码,封装字段生成属性,右键-->重构-->封装字段-->确认--......