mcusun2000 发表于 2014-4-2 21:19:18

被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

搞了这么多寄存器,晕死了

mcusun2000 发表于 2014-4-2 21:25:11

LCD_CTRL_TIMING0 0x80804030

像这种没有四种状态就表示是数据,前面四个状态就表示IO口了?

Auir 发表于 2014-4-2 21:39:52

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,    省了很多指令。

Jordan?? 发表于 2014-4-2 21:50:34

Auir 发表于 2014-4-2 21:39
LCD_CTRL_TIMING2 0x80804050
LCD_CTRL_TIMING2_SET 0x80804054                  置位
LCD_CTRL_TIMING2 ...

原来是这个原因。。学习了
之前使用am3359的时候也觉得很奇怪为什么要有这个寄存器{:lol:}

aozima 发表于 2014-4-2 22:26:51

影子寄存器不用考虑原子操作问题了。

而且在硬件实现上不占用多少资源,要是所有芯片全用这种方式就爽了。
那些写reg |= X;又没有加保护的只能靠测试和人品来保证不出问题了。
而且可能今天测试没问题,明天代码顺序调试了就有问题了。

laotui 发表于 2014-4-2 22:29:23

想起了51和AVR。{:smile:}

WM_CH 发表于 2014-4-2 22:41:47

看着楼主真幸福
页: [1]
查看完整版本: 被arm的寄存器操作搞晕了