STM32-第一课点亮一个LED

学习STM32 有一段时间了,发现在查找资料时候,基本上都是千篇一律, 所以把自己学习的过程分享出来,做个记录,话不多说,开始

对于我们想要点亮LED,首先主要就是控制IO口, 而IO口无非是输出高低电平("0"  "1")两种状态,

电路图如下


STM32-第一课点亮一个LED

 如果我们要想点亮D0/D1, 首先必须使发光二极管能够正向导通, 形成回路,如下图

STM32-第一课点亮一个LED

如果LED0的状态为0,那么电压将会从正极流向负极,从而使二极管D0正向导通, D0被点亮,

同理如果LED1状态为1, 那么二极管左右两端电压相等, 二极管D1不能导通,所以 D1被熄灭

所以我们通过在二极管的另外一端输出不同的电压,也就是说在单片机的IO口上输出不同的电压, 就可以实现二极管的点亮和熄灭了

那么如何才能实现 控制单片机IO口输出高低电平呢?

GPIO 配置

void LED_Init(void)
{
    
    
    GPIO_InitTypeDef    GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA, ENABLE);	 
        //使能PB,PE端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;				 //LED1-->PD.2 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOD, &GPIO_InitStructure);					 //根据设定参数初始化GPIOD.2
    GPIO_SetBits(GPIOD,GPIO_Pin_2);						     //PD.2 输出高
    
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //LED0-->PA.8 端口配置   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOA.8
    
    GPIO_SetBits(GPIOA,GPIO_Pin_8);	                         //PA.8 输出高
    
}

 IO输出高电平 

GPIO_SetBits(GPIOA,GPIO_Pin_8);      //LED1对应引脚GPIOA.8拉高,灭 等同LED1=1;
GPIO_SetBits(GPIOD,GPIO_Pin_2);	     //LED0对应引脚GPIOD.2拉高,灭  等同LED0=1;

 IO输出低电平 

GPIO_ResetBits(GPIOD,GPIO_Pin_2);    //LED0对应引脚GPIOD.2拉低,亮  等同LED0=0;
GPIO_ResetBits(GPIOA,GPIO_Pin_8);    //LED1对应引脚GPIOA.8拉低,亮 等同LED1=0;

当然IO口输出电平控制方式有很多种, 如上方法是最简单,也是最常用的,直接调用库函数来实现

以下是直接操作寄存器,方法也简单, 当我们对寄存器不是很了解的情况下就不是很好理解了

GPIOD->BRR=GPIO_Pin_2;     //LED0亮
GPIOA->BRR=GPIO_Pin_8;     //LED1亮

GPIOD->BSRR=GPIO_Pin_2;  //LED0灭
GPIOA->BSRR=GPIO_Pin_8;  //LED1灭

STM32-第一课点亮一个LED

STM32-第一课点亮一个LED 

STM32-第一课点亮一个LED 

 如上是关于两个寄存器介绍,

完整代码如下:

/*功能: LED0/LED1交替闪烁, 间隔时间是300ms*/

main.c

#include "sys.h"
#include "delay.h"
void LED_Init(void)
{
    GPIO_InitTypeDef    GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOA, ENABLE);	 
        //使能PB,PE端口时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;				 //LED1-->PD.2 端口配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOD, &GPIO_InitStructure);					 //根据设定参数初始化GPIOD.2
    GPIO_SetBits(GPIOD,GPIO_Pin_2);						     //PD.2 输出高
    
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //LED0-->PA.8 端口配置   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOA.8
    
    GPIO_SetBits(GPIOA,GPIO_Pin_8);	                         //PA.8 输出高
    
} 
int main(void)
{ 
 
	delay_init();		  //初始化延时函数
	LED_Init();		      //初始化LED端口
	while(1)
	{
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);    //LED0对应引脚GPIOD.2拉低,亮  等同LED0=0;
		GPIO_SetBits(GPIOA,GPIO_Pin_8);      //LED1对应引脚GPIOA.5拉高,灭 等同LED1=1;
		delay_ms(300);  		             //延时300ms
		GPIO_SetBits(GPIOD,GPIO_Pin_2);	     //LED0对应引脚GPIOD.2拉高,灭  等同LED0=1;
		GPIO_ResetBits(GPIOA,GPIO_Pin_8);    //LED1对应引脚GPIOA.8拉低,亮 等同LED1=0;
		delay_ms(300);                       //延时300ms
	}
} 

 有问题请留言,

上一篇:中级篇——python控制树莓派IO口使用操作+实例代码演示


下一篇:打造网络安全的利剑