然后直接对指针进行读写操作这种编程方法的优缺点。这种方法虽然容易上手,但是效率并不高;如果我们需要对寄存器的某一个位进行单独操作怎么办呢?(这种情况很常见,比如在一个定时器的控制寄存器的配置中,我们需要只对它的Timer使能位进行操作,而其余的位不变,即不受影响。)这时,我们可以用下面这样的操作方法,即一种模块化、结构化的方法,还以上次那个ADC寄存器配置的情况为例:void main(void)
{
AdcRegs.ADCTRL1.all = 0x1234; //需要配置整个寄存器的所有位
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;//只配置特定的位,复位ADC采样的序列1
}
对比一下上次使用的赋值语句:*ADCTRL2 |= 0x4000;
再看看本次使用的AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;
是不是更近一目了然,容易理解?也许你会感觉第二种方法输入起来麻烦,不方便**;不过我们使用CCS编程的时候,CCS可是自带智能提醒功能的!(前提是所有寄存器及它们的位都已在头文件中定义,并在源程序中引用了;如果你嫌麻烦,只要调用TI提供给我们的现成的就好了,当然如果你感觉命名不习惯还可以自己修改相应的头文件。)只要我们输入了AdcRegs,然后按下.这个符号,CCS自然会提示第二级的寄存器有哪些了。
最后总结一下这样编程的优缺点: 缺点-刚才提到了,主要是**不方便(CCS编辑器的自动完成功能可以帮我们搞定);输入的代码长度看起来很长(同样被CCS编辑器的自动完成功能轻松搞定) 优点-很容易控制单独的位;可以在watchwindow里面观察每一个位的值(不然你还得把寄存器的地址放到watchwindow里面,读出整个地址的值,然后再对照寄存器每个位的说明确定它的作用---效率相差太多了)。 最后ps一下,不知道将来n.m版本的CCS是不是直接弄个图形化配置的工具。。。
转帖 |