STM32F4学习笔记—GPIO_点亮LED(基于寄存器)
一、资料准备
1.写在前面
本教程属于个人开发学习过程,内容尽量做到通俗易懂,直入主题,主打的就是一个话少活多,通过例程让新手玩家快速上手,主要参考资料为STM32F4中文参考手册,开发板为STM32F407ZGT6,开发工具为VS Code+CubeMX。话不多说直接开码。
二、硬件原理
2.1原理图分析
通过上面的原理图,可以很清楚的知道,PF9输出高电平DS0熄灭,输出低电平DS0点亮;同理可知:PF10输出高电平DS1熄灭,输出低电平DS1点亮。这样我们就有了一个基本的代码思路了,这在以后的学习中也是非常重要的,如何把我们的想法编程代码?
2.2思路分析
2.2.1使能GPIOF的时钟
位 5 GPIOFEN: IO 端口 F 时钟使能 (IO port F clock enable)
由软件置 1 和清零。
0:禁止 IO 端口 F 时钟
1:使能 IO 端口 F 时钟
在手册中可以看到,往这个寄存器写1就是使能,代码就这么写:
//1.使能GPIOF时钟
RCC->AHB1ENR |= 1<<5;
2.2.2初始化GPIOF
在这个环节里主要注意这几个参数就可以了
1.端口模式寄存器
2.端口输出类型寄存器
3.端口输出速度寄存器
代码如下:
//2.初始化GPIO引脚
//2.1端口模式
GPIOF->MODER |= 1<<18;//通用输出模式(2y~2y+1)->PF9
GPIOF->MODER |= 1<<20;//通用输出模式(2y~2y+1)->PF20
//2.2端口输出类型
GPIOF->OTYPER &= ~(1<<9);//推挽输出(0~15)->PF9
GPIOF->OTYPER &= ~(1<<10);//推挽输出(0~15)->PF10
//2.3输出速度
GPIOF->OSPEEDR |= 1<<19;//快速(2y~2y+1)->PF9
GPIOF->OSPEEDR |= 1<<21;//快速(2y~2y+1)->PF10
2.2.3控制端口输出数据(0:1)
这里的话,中文手册GPIO寄存器继续往下看,我们就可以看到这个寄存器:
同上,可知代码如下:
//2.1端口输出高电平
GPIOF->ODR |= 1<<9;//高电平(0~15)->PF9
HAL_Delay(50);//延时500毫秒
//2.2端口输出低电平数据
GPIOF->ODR &= ~(1<<9);//低电平(0~15)->PF9
HAL_Delay(50);
这样就可以,简单实现DS0闪烁的现象。
三、 软件设计
3.1LED.c
#include "led.h"
void gpio_init(void)
{
//1.使能GPIOF时钟
RCC->AHB1ENR |= 1<<5;
//2.初始化GPIO引脚
//2.1端口模式
GPIOF->MODER |= 1<<18;//通用输出模式(2y~2y+1)->PF9
GPIOF->MODER |= 1<<20;//通用输出模式(2y~2y+1)->PF20
//2.2端口输出类型
GPIOF->OTYPER &= ~(1<<9);//推挽输出(0~15)->PF9
GPIOF->OTYPER &= ~(1<<10);//推挽输出(0~15)->PF10
//2.3输出速度
GPIOF->OSPEEDR |= 1<<19;//快速(2y~2y+1)->PF9
GPIOF->OSPEEDR |= 1<<21;//快速(2y~2y+1)->PF10
}
void led_test(void)
{
//1.初始化GPIO
gpio_init();
//2.测试
while(1)
{
//2.1端口输出高电平
GPIOF->ODR |= 1<<9;//高电平(0~15)->PF9
HAL_Delay(50);//延时50毫秒
//2.2端口输出低电平数据
GPIOF->ODR &= ~(1<<9);//低电平(0~15)->PF9
HAL_Delay(50);
GPIOF->ODR |= 1<<10;//高电平(0~15)->PF10
HAL_Delay(100);//延时500毫秒
//2.2端口输出低电平数据
GPIOF->ODR &= ~(1<<10);//低电平(0~15)->PF10
HAL_Delay(100);
}
}
3.2LED.h
#ifndef __LED_H
#define __LED_H
#include "main.h"
void led_test(void);
#endif
3.3main.c
#include "main.h"
#include "led.h"
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
HAL_Init();
SystemClock_Config();
led_test();//DS0闪烁
while (1)
{
}
}
四、下载验证
代码正常运行的话,现象如下:DS0每隔50ms闪烁,DS1每隔100ms闪烁
五、写在后面
1.为什么学习寄存器版本
因为标准库以及hal库开发,就像是做阅读理解一样;而寄存器开发则更像是做完形填空一样,更有利于提升实力,在接触未知的开发板的时候也可以轻松应对。多看数据手册也有利于增加分析时序图以及编程思想的能力
2.代码优化
本章介绍的代码写法,其实并不利于移植,很多地方可以采用宏的方式使得代码更加精简,便于移植。后续我会将优化代码链接发出来。