博主将会从硬件和软件这两个方面去和大家分享怎么样去使用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的控制,博主还是会像往常一样录制视频和大家分享。
来源:CSDN
作者:qq_43572364
链接:https://blog.csdn.net/qq_43572364/article/details/104428994