现在我的情况略显尴尬,我一边选修了Arduino开发,另一边又跑去学STM32单片机。最近又看了一些处理器原理的科普书,逐渐明白了单片机是如何工作的。
用Arduino的时候完全不用在乎一个针脚怎么输出,而学习STM32单片机时,逐渐清晰了在让一个引脚输出高电平点亮LED灯,程序到底做了什么。
答案是对寄存器的操作。
ODR的特点是一次赋值同时控制所有针脚,也就是说,对ODR的赋值的效果直接等于该值。
比如对低16位赋值0b0000000001000001
,16个针脚对应0的全部输出低电平,对应为1(PIN_0、PIN_6)的全部输出高电平。是一种对针脚的直接操作。
所以,在使用ODR的情况下,如果要单独操作一个针脚,必须要知道整个ODR的状态,读出这个状态,然后对对应针脚的位置位,剩下的原封不动再赋给ODR。这样可以保证只改变一个针脚的电平,而其他的保持不变。
[caption id=“attachment_3582” align=“alignnone” width=“640”] 图源:正点电子[/caption]
而BSRR不同,对于BSRR的高16位,对其中一位赋0,该位值不变,就是说原来是1还是1,原来是0还是0(相当于 原值&&!0);而对该位赋1,该位变成0。
对于BSRR的低16位,给其中一位赋0,该位不变;而给该位赋1,该位变成1。
BSRR相对于ODR的方便之处在于可以单独控制其中一个引脚。
比如低16位为0b0010000100000001
,要是PIN_1(右数第二位)置为1,只需GPIOC->BSRR = 0x2
。即给第二位赋1,其他位赋0,结果是第二位变成1,其他不变:0b0010000100000011
。
我觉得我还算能理解。但是实验过程中仍然觉得很乱。而且从10101这样的信号,一层层抽象成现代操作系统,丰富多彩的桌面环境,既有些不可思议,又让我越来越能体会抽象的伟大之处。