被arm的寄存器操作搞晕了
13.2.13 LCD_CTRL_TIMING2 寄存器LCD_CTRL_TIMING2 0x80804050
LCD_CTRL_TIMING2_SET 0x80804054
LCD_CTRL_TIMING2_CLR 0x80804058
LCD_CTRL_TIMING2_TOG 0x8080405C
如果一个TIMMING2的寄存器
如果我要读数据,是不是要读LCD_CTRL_TIMING2
如果我要写数据1是不是要写LCD_CTRL_TIMING2
如果要清数据的话,是不是要LCD_CTRL_TIMING2_CLR
要写反就操作LCD_CTRL_TIMING2
搞了这么多寄存器,晕死了 LCD_CTRL_TIMING0 0x80804030
像这种没有四种状态就表示是数据,前面四个状态就表示IO口了? LCD_CTRL_TIMING2 0x80804050
LCD_CTRL_TIMING2_SET 0x80804054 置位
LCD_CTRL_TIMING2_CLR 0x80804058 清0
LCD_CTRL_TIMING2_TOG 0x8080405C 取反。
后面3个是影子寄存器。
一般情况下,大家可以直接读写LCD_CTRL_TIMING2 。0x80804050
但是,影子寄存器有什么好处了?以下举例。
假设 LCD_CTRL_TIMING2 的值 = 0x 0003 0010,这里是假设啊。
如果我要 把 LCD_CTRL_TIMING2 的最低位设置为1,而不影响其他的值,假设设置完以后是0x0003 0011
一般情况下,我们需要读出LCD_CTRL_TIMEING2的值 x ,然后再进行或操作 x =x | 0x01 , 然后再把这个x 赋值给LCD_CTRL_TIMING2,
利用影子寄存器,我只需要,直接把0x0000 0001 赋值给LCD_CTRL_TIMING2_SET寄存器,就可以了。就完成了对最低位的置位操作,置位的结果是0x0003 0011, 省了很多指令。
Auir 发表于 2014-4-2 21:39
LCD_CTRL_TIMING2 0x80804050
LCD_CTRL_TIMING2_SET 0x80804054 置位
LCD_CTRL_TIMING2 ...
原来是这个原因。。学习了
之前使用am3359的时候也觉得很奇怪为什么要有这个寄存器{:lol:} 影子寄存器不用考虑原子操作问题了。
而且在硬件实现上不占用多少资源,要是所有芯片全用这种方式就爽了。
那些写reg |= X;又没有加保护的只能靠测试和人品来保证不出问题了。
而且可能今天测试没问题,明天代码顺序调试了就有问题了。 想起了51和AVR。{:smile:} 看着楼主真幸福
页:
[1]