如何判断GD32F303是否读保护了以及如何解除读保护

文章介绍了GD32MCU在烧录时遇到的读保护问题,提供了三种判断和解除读保护的方法:使用GDLinkProgrammer工具的insecurity功能,GD32All-In-OneProgrammer的removeprotection按钮,以及JLinkCommander读取和修改SPC地址值。通过这些工具,用户可以检查MCU的读保护状态并进行相应操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述和分析:

GD32 MCU有时会出现无法烧录的情况,其中一个原因是mcu被读保护了,下面给出几种方法来判断是否被读保护了以及如何解除读保护。

解决方案: 

如何判断MCU是否读保护以及如何解除读保护,有以下几种方法:

  1. 通过GD Link Programmer

连上gdlink线,打开GD Link Programmer工具,界面如下

 

                                                                     图1

                                                                     图2

Target目录下点击Connet,会显示连接成功,并读出option bytes,如果都两个字节是A5 5A,表示没有读保护,如图1;如果是A5 5A之外的其他数据,例如BB 44,如图2,则表示已经读保护了。

GD Link Programmer工具可以解除读保护,

                                                                       图3

如图3,点击target->insecurity,就可以解除读保护。

也可以直接用GD Link Programmer工具来设置读保护:

                                                                            图4

如图4,点击target->security,选择low,就可以设置为读保护

2、通过GD32 All-In-One Programmer

先将BOOT0拉高,BOOT1拉低,进入ISP模式,连上串口,打开GD32 All-In-One Programmer,界面如下:

                                                                        图5

如图5,选择串口,点击connect。如果成功连接在device information处会显示芯片型号出来。

如果有读保护,则会出现remove protection按钮,如果没有读保护,则不会出现。

如果要解除读保护,点击remove protection按钮就可以了。

在没有读保护的情况下,如果要设置为读保护,可以直接通过工具修改选项字节:

                                                         图6

                                                         图7

                                                         图8

如图6,点击edit optionbytes,弹出图7,没有读保护时SPC为0xA5,将A5改为任意其他值,再apply,如图8,就可以了。

3、通过jlink commander

连上jlink,通过jlink commander读SPC的地址的值,不同系列mcu这个地址是不同的

                                                           图9

如果读出来是A5 5A 就没有保护,如果是A5 5A之外的值就是读保护了。

连上jlink,可以用批处理文件解除读保护,路径为:

10x_20x_30x读保护添加和去除\RemoveRDP,双击RemoveRDP.bat就可以解除读保护了

适用系列: GD32F30x系列

### GD32F103 RTC配置与使用教程 #### 初始化RTC模块 为了初始化RTC模块,在程序启动阶段需确保外部低速晶振(LXTAL)已开启并稳定工作。通常情况下,LXTAL频率设定为32.768kHz用于提供精确的时间基准。 ```c void rtc_init(void){ rcu_osci_on(RCU_LXTAL); // 开启外部低速晶振 while (RESET == rcu_flag_get(RCU_FLAG_LXTALSTB)){}//等待LXTAL稳定 /* 配置RTC预分频系数 */ rtc_prescaler_set((uint32_t)(LXTAL_VALUE / 1), FALSE); } ``` 上述代码展示了如何启用外部低速晶体震荡器以及设置RTC预分频寄存器[^2]。 #### 设置时间日期结构体 定义了一个`_date_time`类型的结构体来存储当前时间和日期信息。此结构体包含了年份、月份、日子、小时数、分钟数和秒数六个成员变量。 ```c typedef struct _date_time{ uint16_t year; uint16_t month; uint16_t day; uint16_t hour; uint16_t min; uint16_t second; } date_time_t; ``` 这段声明来源于头文件中的定义。 #### 写入初始时间和日期至RTC硬件寄存器 通过调用库函数可以向RTC写入指定的时间戳数据。下面给出了一段简单的示例代码片段: ```c void set_rtc_time(date_time_t *time_data){ /* 将传入参数转化为BCD编码格式 */ uint32_t tmp = (((time_data->year % 100U)<<16)| ((time_data->month<<12)|(time_data->day<<8)) |((time_data->hour<<4)|(time_data->min))|(time_data->second)); /* 启动RTC写保护解除机制 */ RTC_WPR_KEY_WRITE(RTC_REGWPROTECTION_DISABLE); /* 更新RTC影子寄存器中的值 */ RTC_TR_SET(tmp>>16); RTC_DR_SET(tmp&0xFFFF); /* 恢复默认的写保护状态 */ RTC_WPR_KEY_WRITE(RTC_REGWPROTECTION_ENABLE); } ``` 这里实现了将用户自定义的时间写回到RTC内部的过程。 #### 获取当前RTC保存的时间 当需要查询当前系统时间时,可以通过取相应的RTC寄存器获得最新的计数值,并将其转换成易于理解的形式返回给应用程序层处理。 ```c void get_rtc_time(date_time_t *time_data){ uint32_t tr, dr; do { tr = RTC_TR_GET(); dr = RTC_DR_GET(); }while(tr != RTC_TR_GET() || dr != RTC_DR_GET()); time_data->year = BCD_TO_BIN(dr >> 16)+2000; // 年 time_data->month = BCD_TO_BIN((dr >> 12)&0xF); // 月 time_data->day = BCD_TO_BIN((dr >> 8 )&0xF); // 日 time_data->hour = BCD_TO_BIN((tr >> 4 )&0x3F); // 时 time_data->min = BCD_TO_BIN((tr )&0xF); // 分 time_data->second = BCD_TO_BIN((tr << 4 )&0xF); // 秒 } ``` 该部分逻辑负责从RTC获取最新记录下来的时间戳,并解析成为人类可形式输出。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值