至于上述代码中为什么用了一个“|”(或)呢?
这里我们解释一下这个C语言知识,对于一个8位的寄存器来说,这里我们简单起见,就举8位的寄存器作为例子,这里我们如果要实现修改其中一位,却不改变其他位的值,改如何实现的问题,这里我们具体看。
首先我们默认的8位寄存器的初始值假设我们设置为:1001_0111
那么现在我们比如说要改变第6位的值(这里我们指的是真实的第六位,为什么这么说,按照平常我们的说法寄存器是从第0位到第7位)。
我们的实现方法如下:
1001_0111 | 0010_0000 = 1011_0111
可以看出,通过或的方式我们可以实现只改变一位而不影响其他位的数据。
那么如果我们要让一位相反,从1变到零,我们可以通过与的方式来实现。比如我们这里改变第五位试下。
1001_0111 & 0001_0000 = 0001_0000
看到得到的结果并不是我们想要的,这里需要做一个小小的变通,对应后面要进行相与的数据要进行一个取反,之后才可以进行两者的相与。
1001_0111 & (~(0001_0000)) = 1001_0111 & 1110_1111 = 1000_0111
这样子我们就可以成功实现了不管是置零还是置一都可以不改变其他位的数据,之所以这样做的原因是,430没有办法进行位寻址,所以没有办法对位进行直接操作,只能通过寄存器的方式来进行操作,而对于51来说可以直接进行位寻址。而32实现的方式是通过位绑定的方式进行实现的,这里我们不细说这个位绑定的方式,我们下次再来写一个帖子说明这个问题,了解一下具体的实现方式。
好了,明白了这个我们在看下前面的SysTick->CTRL这个指的是用ARM提供的寄存器指令进行编写的,代表是指向我们SysTick这个模块的控制寄存器,在ARM-Cotex-M4中有四个寄存器来控制SysTick这个模块。我们可以找到他们的说明(这里我没有找到Cotex-M4的中文滴答定时器的说明,但是有Cotex-M3的中文说明,这两者是一样的在滴答定时器这个章节,所以我们引用的是M3的)。
在这里详细解释了我们滴答定时器的四个寄存器,包括相关的控制位功能,我们需要了解这些东西,但是没有必要去背他,我们只需要知道一个学习的方法,在以后需要用到的时候我们懂得找就可以了。毕竟以后当你出去到企业之后,公司做项目,不可能让你去背一个寄存器的每一位每一位是什么意思,不大现实,也毫无意义。所以,方法很重要,要掌握方法。