ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32-第一课点亮一个LED

2021-11-24 09:58:52  阅读:187  来源: 互联网

标签:LED1 LED0 LED Pin STM32 第一课 InitStructure GPIOD GPIO


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

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

电路图如下


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

如果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灭

 

 

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

完整代码如下:

/*功能: 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
	}
} 

 有问题请留言,

标签:LED1,LED0,LED,Pin,STM32,第一课,InitStructure,GPIOD,GPIO
来源: https://blog.csdn.net/qq_22010549/article/details/121498458

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有