STM32点亮LED寄存器版

寄存器点亮LED

在库函数盛行的今天,不知道有没有和我一样还在学习寄存器的小萌新呢?话不多说,直接开干!

1 首先我们需要知道,我们需要先了解GPIO到底是个什么东西?

通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用。因此其作用和功能是非常重要的。

2 在知道GPIO的意义后,就是对输入输出的设置。

STM32点亮LED寄存器版_第1张图片

GPIO共八种模式,不同的功能需要配置成不同的模式,具体每种模式具体的用处,这里就不多说,只看最常用的两个,而对于模式的配置,就要用到寄存器了。
STM32点亮LED寄存器版_第2张图片
另外,要使用GPIO控制某一组管脚时,必须先初始化。在寄存器层面的话需要对APB2寄存器的某一位进行置1操作,需要打开哪一组GPIO,置1即可。
STM32点亮LED寄存器版_第3张图片
APB2即APB2外设时钟使能寄存器(RCC_ APB2ENR)
例如想要打开GPIOA使能。只需要
**RCC->APB2ENR | = (1<<2)**使2位置1.

3 控制输入输出模式的寄存器。

STM32点亮LED寄存器版_第4张图片
STM32点亮LED寄存器版_第5张图片
八种模式 用到了两种寄存器 每一个端口都需要两个CNF和两个MODE,而每一组GPIO,都是16个口,也就对应使用32个CNF和32个MODE,然后将CNF与MODE放在一起,组成了CRL(H),高八位为CRH,底八位为CRL。可以通过调用直接赋值使用。
例如:GPIOA->CRL = 0x03 ,即最低为为0011,也就是CNF为00,MODE为11.意思就是GPIOA端口的PA.0引脚配置的模式为
开漏输出且最大输出速度为50MHz。以STM32F103为例
PB0即为LED,则可以由GPIOB->CRL = 0x03直接设置输出模式。

4 设置好模式以后,接下来就可以设置输出电平了。

对于输出来说,需要使用的是ODR寄存器,输入则是IDR寄存器。再次,我们仅看ODR:
STM32点亮LED寄存器版_第6张图片
很明显,**一组GPIO正好16个,对应了ODR0到ODR15。**把某一位置1即代表某一位输出高电平。对于它的16到31位为保留位,我们不需要去管。
对于PB0来说,我们可以这样控制它(LED外接高电平,需要输出一个低电平)
GPIOB->ODR =0x00;(此时实际上是改变了GPIOB所有的引脚
如果想只改变一位,那么就得用到BRR寄存器复位0。GPIOB->BRR =0x00)。
这样的话,LED就能亮起来了。

PS:没有具体代码,自己写才是硬道理。如果你只想看到LED亮起来,可以试试用导线把PB0引脚接地。不过这样没什么意义。

另外附上函数实现版
STM32点亮LED寄存器版_第7张图片
可以发现,对寄存器的操作在函数里都有体现。确实函数会更加方便,哈哈哈。

你可能感兴趣的:(嵌入式,STM32)