这一篇主要是实践操作GPIO,废话不多说直接上代码。
#include "stm32f10x.h"
void GPIO_Init(void)
{
//开启GPIOB的RCC时钟
RCC->APB2ENR |= (1<<3);
//将GPIOB5设置为推挽输出模式,最大速度为50MHz
GPIOB->CRL &= 0xFF0FFFFF;
GPIOB->CRL |= 0x00300000;
}
void GPIOB5_On(void)
{
GPIOB->BSRR &= 0;
GPIOB->BSRR |= (1<<5);
}
void GPIOB5_Off(void)
{
GPIOB->BSRR &= 0;
GPIOB->BSRR |= (1<<21);
}
一步一步的解释代码:
在第一个函数中将对GPIO进行初始化,也就是设计GPIO的模式。如果要点亮LED灯,请先确定好GPIO的连接情况和正负极的选择,保证电路的连通。
首先看到这一步:RCC->APB2ENR。这一步操作了RCC的APB2ENR寄存器在干嘛呢。翻开参考手册7.3.7APB2外设时钟使能寄存器这一章。时钟控制这一部分的内容推荐一位B站UP主:【STM32】超清晰STM32时钟树动画讲解_哔哩哔哩_bilibili动画讲解的非常清楚。
RCC->APB2ENR |= (1<<3);我们将APB2ENR寄存器的第3位设置为1
APB2ENR的第三位对应的是GPIOB的时钟使能,也就是说这一操作打开了GPIOB的时钟。
第二步GPIOB->CRL &= 0xFF0FFFFF;看到GPIO的CRL寄存器这一节,这一步将CRL的20到23位与上0,相当于先把想要操控的位清空,GPIOB->CRL |= 0x00300000;再在20到23位按位或上0011。将20到23位设置为0011是什么意思呢。通过手册可以看到啊20到23位分别是CNF5和MODE5,结合前面的GPIOB就可以知道这是再对GPIOB5进行操作。
可以看到低2位的11对应MODE中的输出模式,最大速度50MHz,就是意味着将该IO口设置为输出模式,最大反转速度为50MHz,再看到高两位的00,对应CNF的通用推挽输出模式。这样就将输出模式设置为了通用推挽输出。通用推挽输出通常用于有负载的输出,能有较大的功率带动LED。以上就将GPIOB5的初始化设置完全,GPIOB5被设置为了通用推挽输出模式,翻转速度最大为50MHz。
最后就是将令IO口输出高/低电平了。看到上一节介绍的GPnIO_BSRR寄存器,我们通过给对应位写入1来控制IO口输出高电平还是低电平。在函数GPIOB5_On中我们将BSRR的第5位设置为1,就是令IO5输出高电平,在函数GPIOB5_On中我们将BSRR的第21位设置为1就是令IO5输出低电平。同时也应该注意到如果在设置位之前不将之前的设置清除是不是有可能同时将IO5既输出高点平有输出低电平的?
通过注释可以看出,如果同时设置BS和BR的话只有BS位起作用了。所以为了之前的设置不会干扰当前设置,对寄存器复位是有必要的。
(补充!!!请注意本文使用的代码是将BSRR所有的位全部清0,建议要设置哪位就清空哪位,不要盲目使用!)
OK!这就是对GPIO输出的简要操作。下一节可能给出GPIO的读入操作。