初学者关于寄存器加法运算的疑问
有几个例子:
1. BCSCTL2 = SELM_3 + divM_2 + SELS; 这个说明SELM选10,divM选01(/2),SELS选0
这样的解释正确吗?
2. P1DIR = ZERO_CROSSING_OUT + SEGMENT_OUT; (设置ZERO_CROSSING_OUT为Bit6, 设置SEGMENT_OUT为Bit0)
那这个该怎么解释呢?
3. DCOCLK = 0x60 + 0x00;
是否就等于0x60?
若能解答真的很谢谢,卡了很久了
这些个加法,并不是你说的寄存器的加法运算,而是普通的无符号数加法运算后对特殊功能寄存器进行赋值。
1. SELM_3 、 divM_2 、 SELS是宏定义,你找找它代表什么(应该是在头文件里面), 加在一起赋值给寄存器后看看对应的寄存器各个位处于什么状态;
2. ZERO_CROSSING_OUT 、 SEGMENT_OUT也是宏定义,同上解释;
3.是的,不需怀疑。
我具体说一下过程,你看看我说得对不对:
1,BCSCTL2 = SELM_3 + divM_2 + SELS
SELMx位取10(XT2CLK when XT2 oscillator present on-chip. LFXT1CLK or VLOCLK when XT2 oscillator not present on-chip)
divMx位取01(/2)
SELS位0(DCOCLK)
所以最后BCSCTL2就是:10010000
2,ZERO_CROSSING_OUT和SEGMENT_OUT都是在头文件里自己定义的,分别是Bit6和Bit5
所以最后P1DIR就是:00(Z_C_O)(S_O)00000
你看看我这样做是不是就对了
很感谢啊!
我具体说一下过程,你看看我说得对不对:
1,BCSCTL2 = SELM_3 + divM_2 + SELS
SELMx位取10(XT2CLK when XT2 oscillator present on-chip. LFXT1CLK or VLOCLK when XT2 oscillator not present on-chip)
divMx位取01(/2)
SELS位0(DCOCLK)
所以最后BCSCTL2就是:10010000
2,ZERO_CROSSING_OUT和SEGMENT_OUT都是在头文件里自己定义的,分别是Bit6和Bit5
所以最后P1DIR就是:00(Z_C_O)(S_O)00000
你看看我这样做是不是就对了
很感谢啊!
第一个问题详细告诉你:
BCSCTL2基本时钟系统控制寄存器2,各位定义:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
SELM.1 |
SELM.0 |
divM.1 |
divM.0 |
SELS |
divS.1 |
divS.0 |
DOCR |
SELM.1,SELM.0 选择 MCLK 时钟源。
0 0 时钟源为 DCOLCK(默认时钟源);
0 1 时钟源为DCOCLK ;
1 0 时钟源为LFXTlCLK(对于MSP430Fll/l2X),时钟源为XT2CLK(对于MSP430F13/14/15/16X);
1 1 时钟源为 LFXT1CLK 。此处SELM_3=0xc0即1100 0000,时钟源选择为LFXT1CLK
divM.1,DlVM.0 选择 MCLK 分频。
0 0 1 分频(默认MCLK=DCOCLK);
0 1 2分频;
1 0 4分频;此处divM-2即0x20, 0010 0000,四分频
1 1 8分频。
其他不再写了,编辑这个累死人
即0b1100 0000+0b0010 0000+0b0000 1000=0b1110 1000,对照上表即可看出如何对寄存器配置
第二个问题一样的回答
啊呀,明白了!十分感谢!十分感谢!