GPIO输出控制PB0有两种方式,一种是通过寄存器控制,另一种是通过HAL库函数直接控制。
方法一:通过HAL库函数控制PB0
步骤如下:
首先通过STM32CubeMx软件设置;
首先点击图中所示创建新的项目

第二步找到自己的STM32单片机,其中有两种方式,一种直接在查询框中直接输入查询,另一种是在下面筛选框中筛选出。

选好后直接点击右侧选项进入

第三步找到需要点亮等的引脚PB0后设置为GPIO_Output,然后点击Sysem view,再点击GPIO选项,左侧弹出窗口,将GPIO output level 设置为high; 即将GPIO_PIN_0 口初始电平设置为高电平。


然后根据图片所示步骤点击项目信息(Project Manage)然后写入project name 选择路径(注意:路径尽量设置为全英文路径,否则后面创建文件会有警告,很麻烦),然后将Toolchain / IDE 设置为MDK-ARM ,然后点击 Code Generator 选项将Generated files中第一个选项勾上。最后点击右上角创建项目,然后点击openproject等待打开keil5软件。


接下来是比较重要的几步也是关键步骤,在keil5中用HAL库函数进行控制GPIO的输出。
涉及到三个函数
/*第一个为:*/
HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
/*此函数三个参数分别为:
GPIO_TypeDef *GPIOx 设置的是PA口还是PB口,此处咱们设置为GPIOB口;
uint16_t GPIO_Pin 设置的是PB口中的哪个引脚,此处咱们设置为GPIO_PIN_0引脚;
GPIO_PinState PinState 设置高电平还是低电平,RESET为低电平,SET为高电平.
*/
//第二个为:
HAL_Delay(uint32_t Delay)
//参数为时间,毫秒单位。
//第三个为:
HAL_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
//此函数功能为翻转接口电平
//GPIO_TypeDef *GPIOx 设置的是PA口还是PB口,此处咱们设置为GPIOB口;
//uint16_t GPIO_Pin 设置的是PB口中的哪个引脚,此处咱们设置为GPIO_PIN_0引脚;
最后写HAL函数实现将PB0灯点亮。(程序如下)
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
//方法一:直接通过写函数将PB0点亮
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,0);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_1,1);
HAL_Delay(500);
//方法二:通过翻转函数,将PB0引脚电平循环翻转实现点亮PB0
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0|GPIO_PIN_2);
HAL_Delay(300);
}
}
方法二:通过寄存器控制PB0
在方法一的基础上不使用HAL_Init(); SystemClock_Config(); MX_GPIO_Init();这三个函数,直接使用寄存器控制PB0
用到几个寄存器如下:
使能时钟寄存器(RCC_IOPENR)


GPIO端口模式寄存器(GPIOx_MODER)(x=A......D,F)

GPIO端口输出类型寄存器(GPIOx_OTYPER)(x=A......D,F)

GPIO端口输出速度寄存器(GPIOx_OSPEER)(x=A......D,F)

GPIO端口输出数据寄存器(GPIOx_ODR)(x=A......D,F)

GPIO 端口置位 / 复位寄存器 (GPIOx_BSRR) 和 (GPIOx_BRR) (x = A..D,F)


步骤如下:
首先使用使能时钟寄存器设置时钟,
然后设置GPIOB的输出模式寄存器,设置为01通用输出模式(将第0位设置为0 第1位设置为1)。
在设置GPIOB的输出类型寄存器,将第0位设置为1,开漏输出。
然后设置GPIOB的输出速度寄存器,将第0位设置为0 第1位设置为1,设置为01中速模式
最后在while循环中设置GPIO的输出数据寄存器,将第0位设置位1,将GPIO_PIN_0设置为高电平。
程序如下:
int main(void)
{
RCC->IOPENR |= 1<<1;
GPIOB->MODER |= 1<<0;
GPIOB->MODER &= ~(1<<1);
GPIOB->OTYPER &= ~(1<<0);
GPIOB->OSPEEDR |= 1<<0;
GPIOB->OSPEEDR &= ~(1<<1);
while (1)
{
GPIOB->ODR |=1<<0;
}
}