[技术问答] M0516的解锁被保护的寄存器位写法有没有问题

[复制链接]
3933|7
 楼主| ccSmartmeter 发表于 2013-11-15 16:19 | 显示全部楼层 |阅读模式
原厂例程
void Un_Lock_Reg(void)
{
    RegLockAddr = 0x59;
    RegLockAddr = 0x16;
    RegLockAddr = 0x88;
}
这样的话,如果写的中间进入中断,会不会导制解锁失败

如果会出现导制解锁失败,那一定这样写检查一下了
void Un_Lock_Reg(void)
{
        while(1)
        {
            RegLockAddr = 0x59;
            RegLockAddr = 0x16;
            RegLockAddr = 0x88;
           
            if((RegLockAddr & 0x01)==0x01) break;
    }
   
}
Harvard 发表于 2013-11-15 19:14 | 显示全部楼层
确实是一个问题 .不知道硬件上有没有特殊的机制来保障.
niuyaliang 发表于 2013-11-26 17:30 来自手机 | 显示全部楼层
硬件上,应该解锁的优先级大于中断吧,再说,一般都是初始化开中断之前就完成解锁的。
zhangjin_comeon 发表于 2013-11-26 23:14 | 显示全部楼层
这个不太懂 不过顶一下
haolaishi 发表于 2013-11-27 08:17 | 显示全部楼层
lz过时啦,新的例程就这这么写的,哈哈
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] Unlock the protected registers
  3. *
  4. * @details To unlock the protected register to allow write access
  5. *
  6. */
  7. static __INLINE void SYS_UnlockReg(void)
  8. {
  9. do
  10. {
  11. SYS->REGWRPROT = 0x59;
  12. SYS->REGWRPROT = 0x16;
  13. SYS->REGWRPROT = 0x88;
  14. }while(SYS->REGWRPROT == 0);
  15. }

戈卫东 发表于 2013-11-27 08:59 | 显示全部楼层
需要这么复杂么?
海边浪漫幻象 发表于 2025-11-19 17:12 | 显示全部楼层
M0516 解锁被保护寄存器位需严格按手册时序:先写解锁码(如 0x59、0x16、0x88)到特定寄存器,再操作目标位。若顺序错、码值不对或未等待解锁完成就操作,会失败。需检查代码中解锁指令是否连续、无中断干扰,确保寄存器地址正确,可通过读状态位验证是否解锁成功,避免因步骤疏漏导致操作无效。
海边浪漫幻象 发表于 2025-11-19 17:31 | 显示全部楼层
M0516 解锁被保护寄存器位需按特定步骤:先写 0x59 到 UNLOCK 寄存器,再写 0x16,最后写 0x88 完成解锁,此序列不可错。若写法有误,会导致寄存器无法修改。需注意解锁后需重新使能保护,且部分寄存器解锁后操作有时间限制,需严格遵循数据手册时序要求,否则可能操作失败。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:重庆鸿引电子 专业仪表研发生产 淘宝店:hongyindz.taobao.com 公司网站:www.hongyindz.com

7

主题

131

帖子

2

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