本帖最后由 JackTang1994 于 2021-9-2 15:14 编辑
#申请原创# #技术资源#
关于如何配置AVR单片机的CCP寄存器操作
1. CCP寄存器对应的两种KEY值
这里我们需要操作的是时钟IO,所以选择0XD8这个KEY。
2. 为什么要用汇编来实现这个对CCP寄存器操作的代码
查看ATMEGA4809数据手册,可以知道对保护的IO寄存器操作,需要在4条指令之内完成。所以如果使用C语言实现的就无法做到,所以库文件中使用了汇编来实现
查看反汇编代码,在执行protected_write_io函数时,可以看到是使用了R20、R22、R24、R25这几个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 返回到函数调用处
|