STM32单片机(一)输出

Posted by 橙叶 on Sun, Nov 17, 2019

现在我的情况略显尴尬,我一边选修了Arduino开发,另一边又跑去学STM32单片机。最近又看了一些处理器原理的科普书,逐渐明白了单片机是如何工作的。

用Arduino的时候完全不用在乎一个针脚怎么输出,而学习STM32单片机时,逐渐清晰了在让一个引脚输出高电平点亮LED灯,程序到底做了什么。

答案是对寄存器的操作。

两个寄存器:ODR,BSRR

在STM32中有两个寄存器可以用于输出。一个是ODR,一个是BSSR。通过向对应的位设置1或0,就可以控制GPIO的输出。

ODR寄存器

ODR寄存器可以控制GPIOx输出电平,其中高16位保留,始终读为0;低16可读可写。对低16位写1,对应针脚输出高电平,写0则输出低电平。

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寄存器使得对单个针脚的操作更为方便,前面说到ODR寄存器是完全遵从赋值。

而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

随便说几句

最近在看《计算机组成与设计》这样的入门书籍,原本很宏观的计算机逐渐向我展开细节,慢慢地深入微观,探察魅力之所在。之前已经看完了一本书叫《大话处理器》,是一本更入门的科普读物,这本书已经有十多年的历史,所幸在Kindle上还有电子书可以下载。我们老师对这本书赞不绝口,这本书意味着十几年前中国人终于深入了这个领域,写出这样的书。

我觉得我还算能理解。但是实验过程中仍然觉得很乱。而且从10101这样的信号,一层层抽象成现代操作系统,丰富多彩的桌面环境,既有些不可思议,又让我越来越能体会抽象的伟大之处。



comments powered by Disqus