作为简单但非常有效且有趣的STM32入门级实验,点亮LED是所有人都躲不开且不会拒绝的小实验。他不仅步骤简单,也可以大致了解我们STM32板和HAL库的一些性质,所以这个实验在STM32板子学习过程中有着无与伦比的重要性。
首先我们先了解一下STM32板子里LED的结构。
我们可以看到这个LED灯的结构是上接一个3.3V的电源,通过串口LED1和LED0来控制亮灭的,也就是当这两个串口输出0(即低电平)时,LED0亮。其中我们可以看到LED0的串口为PB5,即GPIOB的PIN5.
那么接下来就针对这个结构我们编写关于LED的头文件和函数文件
led.h:
#ifndef __LED_H
#define __LED_H
#include "./SYSTEM/sys/sys.h"
void led_init(void);
#endif
这个头文件是申明在led.c中所需要用到的函数和需要提前调用的其他头文件,比如sys.h就是stm32的一个系统头文件,包含了调用其他stm32系统头文件路径,比如stm32f1xx_hal_gpio.h,这个头文件就包含了我们点亮LED所需要调用的串口PB5的路径。
led.c
#include "./BSP/LED/led.h"
void led_init(void){
GPIO_InitTypeDef gpio_init_struct;
__HAL_RCC_GPIOB_CLK_ENABLE();
gpio_init_struct.Pin = GPIO_PIN_5 ;
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP ;
gpio_init_struct.Speed = GPIO_SPEED_FREQ_LOW ;
HAL_GPIO_Init( GPIOB , &gpio_init_strcut);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET );
}
接下来对这些程序和函数的作用进行解释
1.GPIO_InitTypeDef :这个是对GPIO模块进行初始化的结构体,包含了以下几个成员Pin, Mode, Speed, Pull,在未来笔者会单独出一章对这些结构体成员进行比较详细的解释,因为这里的结构体成员内容比较庞大,暂不展开。
在这里,我们需要把这个结构体成员分别进行如下初始化:
PIN(管脚):设置为第五个管脚,对应我们的PB5;
Mode:模式我们设置为输出的推挽模式(未来会解释,敬请期待~)。
Speed:这里对GPIO的处理速度没有很高的要求可以设置为低速,也可以设置为高速,低速相对对芯片的调用和能耗都会小很多。
Pull:推拉模式,这里我们不需要设置,因为配置输出模式时,上下拉电阻无法与引脚产生硬件连接,是被旁路掉的,相当于是不被允许设置的,所以我们就不设置。
2. __HAL_RCC_GPIOB_CLK_ENABLE():这个函数是启动GPIOB的时钟,只有这样GPIOB才会起作用,从原理上看,我们的单片机在读写的时候会发出两部分信号,一个是通过寄存器的相应字节位判断相应读写操作的,另一个是时钟信号,用于对照,只有在时钟信号为高电平的时候的指令才会被读取。
3.HAL_GPIO_Init():这个是对相应GPIO进行初始化的函数,比如本函数中,我们就是把我们的结构体初始化完成之后赋值给GPIOB,这个相当于我把作业写好交给老师,这样理解可能会比较容易。注意我们这个函数的第二个参数是句柄指针,所以我们要对我们初始化的句柄取地址。
4. HAL_GPIO_WritePin():这个函数是对我们的相应串口进行读写操作的,我们这里是把他初始化了。
typedef enum
{
GPIO_PIN_RESET = 0u,
GPIO_PIN_SET
} GPIO_PinState;
这里我们可以看到它的值就是1。
接下来我们编写main主函数
duimain.c:
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/delay/delay.h"
int main(){
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);
led_init();
while(1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
delay_ms(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
delay_ms(500);
}
}
对程序中的函数进行解释:
1. HAL_Init():初始化HAL库内容。
2. sys_stm32_clock_init(RCC_PLL_MUL9):设置时钟为72MHz
3. delay_init():初始化延迟器
4. led_init():初始化LED灯
然后我们在while循环里反复改写LED灯的PIN值,达到亮灭的效果。
我们也可以调用成熟的led.h(下载的成熟程序源码库)中的HAL_GPIO_TogglePin()函数,写成如下形式
#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/delay/delay.h"
int main(){
HAL_Init();
sys_stm32_clock_init(RCC_PLL_MUL9);
delay_init(72);
led_init();
while(1)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
delay_ms(500);
}
}
这个TogglePin函数的作用就是反转这个pin值,(pin值一开始为1)也能达到我们预期的效果。
那么点亮LED灯的实验介绍就到这里了,对后续的一些介绍笔者会持续更新。