打印
[PIC®/AVR®/dsPIC®产品]

AVR单片机对保护的寄存器操作说明

[复制链接]
1287|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 JackTang1994 于 2021-9-2 15:14 编辑

#申请原创# #技术资源#
关于如何配置AVR单片机的CCP寄存器操作
1. CCP寄存器对应的两种KEY值
这里我们需要操作的是时钟IO,所以选择0XD8这个KEY。



2. 为什么要用汇编来实现这个对CCP寄存器操作的代码
查看ATMEGA4809数据手册,可以知道对保护的IO寄存器操作,需要在4条指令之内完成。所以如果使用C语言实现的就无法做到,所以库文件中使用了汇编来实现



查看反汇编代码,在执行protected_write_io函数时,可以看到是使用了R20R22R24R25这几个working寄存器。所以猜想可能是编译器特定的操作。意思就是会将函数的形参用R20、R22、R24这种普通寄存器保存。
验证:
新建一个3个参数的函数,发现在反汇编窗口看到的汇编代码也是使用R20、R22、R24
结论:
所以得出函数调用所使用的working寄存器是一样的,不会变。所以在protected_io.S文件中汇编代码中使用的working寄存器固定为R20、R22、R24、R25。
再解释下为会汇编文件protected_write_io反汇编后会发现有4个寄存器(R20、R22、R24、R25),这是因为使用了指针的形式,指针在8位单片机中是使用16位来表示的,所以需要2个8位的寄存器来保存。

解析protected_write_io函数的实现汇编代码
 movw    r30, r24                // Load addr into Z,Z寄存器为专用的地址加载寄存器.8位单片机中的地址使用2个字节表示,所以这里使用了movw
        out     CCP, r22                // Start CCP handshake。将函数的形参即那个KEY值0XD8写入到CCP寄存器中
        st      Z, r20                  // Write value to I/O register。将r20中的数据(需要设置的时钟配置)写入到地址(时钟寄存器映射的地址)中。
        ret                             // Return to caller 返回到函数调用处






使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

60

帖子

0

粉丝