蓝桥杯嵌入式设计开发——LED篇

陌路散爱 提交于 2020-02-26 03:04:31

博主将会从硬件和软件这两个方面去和大家分享怎么样去使用led。
硬件相关知识:博主先提出几个问题。LED灯怎么样才能亮呢?怎么样去用STM32MCU去自由的控制led灯的亮灭呢?怎么去查看开发板的外围硬件电路呢?
(1)我们首先去查看蓝桥杯嵌入式设计开发板的原理图(PS这个原理图在我们购买板子的时候,会提供给我们),然后找到LED部分。如下图所示。
在这里插入图片描述
我们以HD0为例,如果我们给HD0一个低电平信号,然后给再给NLE端口一个下降沿(ps也就是给NLE一个高电平,然后接着给一个低电平)。然后锁存器就会锁存HD0端口接入的低电平信号,一直到NLE端口下一个下降沿信号的来临继续锁存即时的HD端口信号。那么HD 0—8端口的电平信号从哪儿来呢,我们查看板子的原理图可以得知HD 0—8端口与MCU的PC8-PC15相连。我们控制MCU的PC8—PC15端口输出信号就可以控制LED。那么如何控制MCU的PC8—PC15的输出信号怎么控制呢,接下来将要分享的软件方面知识正在等着你哟。
软件相关知识:伙伴们知道怎么去查看库函数的解释吗?我们控制LED需要用到哪些库函数呢?我们怎么去初始化PC8—PC15的工作方式呢?
(1)我们需要知道mcu端口有各种工作方式,既然我们要通过mcu端口去控制LED,那么我们就应该初始化mcu端口的工作方式。
(2)我们可以在STM32F103固件函数库用户手册(中文)里面查找库函数的解释。
下面博主将贴出led.c和led.h和main.h,并且辅以较为详细的注解
led.c如下

在这里插入代码片
#include"stm32f10x.h"
#include"led.h"
/****LED初始化配置函数****/
void LED_Init()//无返回值,无参函数。其实就是通过库函数去改变MCU内部某些I/O相关寄存器的值,来设置I/O口的工作方式。
{
	GPIO_InitTypeDef  GOIO_InitStructure;//定义一个GPIO结构体
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);																				
	GOIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//选择GPIO口的8-15端口
	GOIO_InitStructure.GPIO_Speed=GPIO_Mode_Out_PP;//推挽输出
	GOIO_InitStructure.GPIO_Mode=GPIO_Speed_10MHz;//最大速度
	GPIO_Init(GPIOC,&GOIO_InitStructure);//初始化GPIO结构体数据
	GOIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//选择GPIO2端口
	GPIO_Init(GPIOD,&GOIO_InitStructure);//GPIOD-2端口打开
	GPIO_SetBits(GPIOC,GPIO_Pin_All);//所有端口都是高电平,灯全灭
}

/****LED开关驱动函数****/
/*
无返回值函数,两个型参
参数LED选择GPIOC8-15的某一个端口
参数status=0,灯灭
参数status=1,灯亮
GPIOD_Pin_2下降沿锁存信号
*/
void LED_ONorOFF(u16 LED,u8 status)	
{
	if(status==1)
	{
		GPIO_ResetBits(GPIOC,LED);//led低电平,灯亮
		GPIO_SetBits(GPIOD,GPIO_Pin_2);//NLE下降沿电平信号,锁存
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
	}
	if(status==0)
	{
		GPIO_SetBits(GPIOC,LED); //led高电平,灯灭
		GPIO_SetBits(GPIOD,GPIO_Pin_2);
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);	
	}


}

led.h

在这里插入代码片
#ifndef __LED_H_//条件编译
#define __LED_H_
#define led1  GPIO_Pin_8//宏定义
#define led2  GPIO_Pin_9
#define led3  GPIO_Pin_10
#define led4  GPIO_Pin_11
#define led5  GPIO_Pin_12
#define led6  GPIO_Pin_13
#define led7  GPIO_Pin_14
#define led8  GPIO_Pin_15
void LED_ONorOFF(u16 LED,u8 status);//函数的声明
void LED_Init();//函数的声明
#endif

main.c如下

在这里插入代码片
#include"stm32f10x.h"
#include"main.h"
#include"led.h"
u16 Timedelay=0;
void systick_delay_ms(u16 Ntime); 

int main()	  //主函数
{
  	LED_Init();//led工作方式的配置
  	SysTick_Config( SystemCoreClock/1000);
	while(1)
 	{
  		LED_ONorOFF(led1,0);//关闭led1
		systick_delay_ms(5000);//延时五千毫秒
		LED_ONorOFF(led1,1);//打开led
		systick_delay_ms(5000); 
 	}


}

void systick_delay_ms(u16 Ntime) //延迟函数定义
{
 	Timedelay=Ntime;
	while(Timedelay!=0);
}

main函数里面有关systick的部分博主将会在下一文里和伙伴们分享。
博主的语言组织能力较差,为了方便伙伴们理解led.c,led.h,main.c之间的关系逻辑,和如何利用函数库快速完成LED的控制,博主还是会像往常一样录制视频和大家分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!