STM32单片机学习笔记(四)-点亮LED灯(固件库版本)

写在前面:本系列内容均为自学笔记,参考资料为野火指南者开发板资料及芯片参考手册等,使用野火指南者开发板进行学习,该系列内容仅用于记录笔记,不做其他用途,笔记的内容可能会存在不准确或者错误等,如有大佬看到错误内容还望能够评论指正,感谢各位。
本节包括前几节的程序,请参考野火开发板资料,里面由更加清晰的教学,野火B站账号:野火官方B站账号链接。
从本节开始将开始固件库的编程,当然建议先完成前面几节关于寄存器的知识。

学习目标

1、使用固件库编程点亮LED灯;
2、实现流水灯功能(本节使用的是RGB红绿蓝三色混色灯,只有一个灯,但要实现流水灯功能)。

电路图

本节将使用下面的电路图:
图4-1
STM32单片机学习笔记(四)-点亮LED灯(固件库版本)_第1张图片

一、使用固件库点亮LED灯

1、点亮LED灯

首先需要建立一个固件库的模板,具体教程野火的视频中也是有讲解的,不会的可以移步野火视频观看。
当固件库模板建立好后,我们在单独建立两个文件:bsp_led.c和bsp_led.h,这两个文件将放置接下来用到的程序;
bsp_led.c文件中的程序如下:

//BSP:board support package 板级支持包,仅适用于野火开发板

#include "bsp_led.h"

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;						//定义变量,方便赋值
	
	RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE);			//打开APB2时钟,GPIO挂载在APB2
	
	GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;				//设置需要用到的管脚,LED_G_GPIO_PIN看.h文件
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;			//设置输出模式为推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;			//设置输出速率为50MHz,LED_G_GPIO_CLK看.h文件
	
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);			//加上&,方便取值	//初始化GPIO
}

在初始化程序中使用GPIO和RCC固件库进行程序编写,关于GPIO和RCC用到的程序如RCC_APB2PeriphClockCmd();和GPIO_Init();这两个的解释可以参考相应点c文件及点h文件中的解释;
上面用到结构体GPIO_InitTypeDef,这个结构体中定义了GPIO初始化所需要用到的成员,我们只需要将里面的成员全都定义好即可完成GPIO部分,至于RCC的部分我们只用到了时钟相关的函数,这个函数中我们只需要确认需要操作哪个时钟,以及是要打开还是关闭即可;
bsp_led.h中的程序如下:

#ifndef _BSP_LED_H
#define _BSP_LED_H

#include "stm32f10x.h"		//要包含固件库的.h文件

#define LED_G_GPIO_PIN						GPIO_Pin_0				//定义管脚号
#define LED_G_GPIO_PORT						GPIOB					//定义用到的GPIO
#define LED_G_GPIO_CLK						RCC_APB2Periph_GPIOB	//定义RCC时钟寄存器
//下面几个声明可以不管,直接按照main中屏蔽掉的部分写也行
//下面用到的“\”符号为续行符,其后面不能由任何东西,意为这行下面的一行跟这行是一起的,分行写看起来比较清晰
#define ON									1
#define OFF									0
#define LED(a)								if(a) \
												GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); \
											else \
												GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);

void LED_GPIO_Config(void);		//.c文件中的函数声明

#endif	/*_BSP_LED_H*/

本文件主要是定义需要用到的管脚、GPIO、速率等,至于ON和OFF的部分单纯是为了main中看起来简洁一点,可以不进行相应的声明定义,直接按照main.c中屏蔽掉的部分写也可以实现功能;
main.c中的程序如下:

#include "stm32f10x.h"  //包含固件库.h文件
#include "bsp_led.h"	//包含自己创建的.h文件

void Delay(uint32_t count)	//延时函数,靠参数递减实现,参数越大,延时时间越久
{
	for(;count != 0;count--);
}

int main(void)
{
	// 来到这里的时候,系统的时钟已经被配置成72M。
	LED_GPIO_Config();	//GPIO初始化
	while(1)
	{//LED灯闪烁
		LED(OFF);		//关灯
		Delay(0xFFFFF);
		LED(ON);		//开灯
		Delay(0xFFFFF);
		/*
		GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);		//关灯
		Delay(0xFFFFF);
		GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);		//开灯
		Delay(0xFFFFF);
		*/
	}
}

开关灯程序直接用GPIO函数GPIO_SetBits()和GPIO_ResetBits()即可,这两个函数在本次用到的电路图中分别表示GPIO_SetBits():将PB0置1,GPIO_ResetBits():将PB0置0;
通过以上程序如果书写正确就,实现的功能就是LED灯的闪烁,当然能闪烁,点亮的功能也就实现了。

2、实现流水灯功能

bsp_led.c文件中的程序如下:

//BSP:board support package 板级支持包,仅适用于野火开发板

#include "bsp_led.h"

void LED_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;		//定义变量,方便赋值
	
	RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE);	//打开APB2时钟,GPIO挂载在APB2
	//GPIO_PIN的部分用或将用到的管脚初始化为一个十六进制数据,原本是三个十六进制
	GPIO_InitStruct.GPIO_Pin = (LED_G_GPIO_PIN|LED_B_GPIO_PIN|LED_R_GPIO_PIN);	//设置需要用到的管脚,LED_G_GPIO_PIN看.h文件
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;			//设置输出模式为推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;			//设置输出速率为50MHz,LED_G_GPIO_CLK看.h文件
	
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);			//加上&,方便取值	//初始化GPIO
}

bsp_led.h文件中的程序如下:

#ifndef _BSP_LED_H
#define _BSP_LED_H

#include "stm32f10x.h"		//要包含固件库的.h文件

#define LED_G_GPIO_PIN						GPIO_Pin_0			//定义绿灯管脚号
#define LED_B_GPIO_PIN						GPIO_Pin_1			//定义蓝灯管脚号
#define LED_R_GPIO_PIN						GPIO_Pin_5			//定义红灯管脚号
#define LED_G_GPIO_PORT						GPIOB				//定义用到的GPIO
#define LED_G_GPIO_CLK						RCC_APB2Periph_GPIOB//定义RCC时钟寄存器

void LED_GPIO_Config(void);		//.c文件中的函数声明

#endif	/*_BSP_LED_H*/

main.c中的程序如下:

#include "stm32f10x.h"   // 相当于51单片机中的  #include 
#include "bsp_led.h"

void Delay(uint32_t count)
{
	for(;count != 0;count--);
}

int main(void)
{
	// 来到这里的时候,系统的时钟已经被配置成72M。
	LED_GPIO_Config();	//GPIO初始化
	
	while(1)
	{//LED流水灯,保险起见,点亮其中一个灯时,将其余两个灯都关闭
		GPIO_SetBits(LED_G_GPIO_PORT,LED_R_GPIO_PIN);		//关灯
		GPIO_SetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN);		//关灯
		GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);		//开灯
		Delay(0xFFFFFF);
		GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);		//关灯
		GPIO_SetBits(LED_G_GPIO_PORT,LED_R_GPIO_PIN);		//关灯
		GPIO_ResetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN);		//开灯
		Delay(0xFFFFFF);
		GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN);		//关灯
		GPIO_SetBits(LED_G_GPIO_PORT,LED_B_GPIO_PIN);		//关灯
		GPIO_ResetBits(LED_G_GPIO_PORT,LED_R_GPIO_PIN);		//开灯
		Delay(0xFFFFFF);
}

以上程序中,需要注意的就是在打开其中一个灯时,要将其余的两个灯关闭,不然会出现混色,灯就变成除红绿蓝之外其他颜色的灯了,当然以上流水灯的程序不一定对,上面的程序并没有找大佬看过是否严谨,不过确实可以实现流水灯功能,有更好的方式时会进行更新。
以上仅作笔记参考,不做教学,感谢观看。

你可能感兴趣的:(STM32单片机学习笔记,笔记,单片机,stm32,学习)