资讯详情

【STM32学习笔记-点亮LED灯】

STM学习笔记-点亮LED灯


文章目录

  • STM学习笔记-点亮LED灯
  • 一、原理图分析
  • 二、代码分析
    • 1.mian函数
    • 2.led.c函数
    • 3.led.h函数
    • 4.整理函数文件
    • 5.LED_Init(); LED灯的初始函数分析
    • 6.while(1){} 循环函数分析
    • 7.结果显示
  • 实现三、四种方法LED的闪烁
    • 1、GPIO_WriteBit()函数
    • 2、GPIO_ReadOutputDataBit()函数
    • 3、GPIO_SetBits()和GPIO_ResetBits()函数
    • 4、GPIO_Write()函数


一、原理图分析

此图中LED右端接地(GND),左端连接PB0、PB1(见下图)电路输出为高电led点亮,低电平时led熄灭

在这里插入图片描述 在这里插入图片描述


二、代码分析

1.mian函数

代码如下(示例):

#include  "stm32f10x.h"  //STM32头文件#include  "sys.h"#include  "delay.h"///延迟函数#include  "led.h"int  main  (void){     //主程序  RCC_Configuration();  ///时钟设置(暂时不研究时钟)  LED_Init();  while(1){         GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));  //LED接口输出高电平1    delay_us(50000);  //延时1秒    GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0));  //LED接口输出低电平0    delay_us(50000);  //延时1秒  }}

2.led.c函数

代码如下(示例):

#include "led.h"void LED_Init(void){
      //LED灯的接口初始化	GPIO_InitTypeDef  GPIO_InitStructure; 	    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);           GPIO_InitStructure.GPIO_Pin = LED1 | LED2; //选择端口号(0~15或all)     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 	GPIO_Init(LEDPORT, &GPIO_InitStructure);			}

3.led.h函数

代码如下(示例):

#ifndef __LED_H#define __LED_H #include "sys.h"//#define LED1 PBout(0)// PB0//#define LED2 PBout(1)// PB1 #define LEDPORT GPIOB //定义IO接口#define LED1 GPIO_Pin_0 //定义IO接口#define LED2 GPIO_Pin_1 //定义IO接口void LED_Init(void);//初始化 #endif

4.函数文件整理

在这里插入图片描述 CMSIS-User文件均由stm官网提供(查阅固件库安装)

5.LED_Init(); LED灯初始化函数分析

跳转至函数出处 在这里插入图片描述 光标放置在LED_Init();语句行,右键-选择Go Too Definition Of ‘LED_Init’,跳转到led.c函数中

GPIO_InitTypeDef  GPIO_InitStructure; 

led.c函数的第一句如上,通过寻找起源,我们可以看到此函数来自于stm32f10x_gpio.h 函数的一个结构体的定义,如下代码

typedef struct{
       uint16_t GPIO_Pin; /*需要配置的GPIO引脚,这个参数 可以是@ref GPIO_pins_define的任意值*/  GPIOSpeed_TypeDef GPIO_Speed;  /*指定所选引脚的速度。这个参数 可以是@ref GPIOSpeed_TypeDef的值 */  GPIOMode_TypeDef GPIO_Mode;    /*指定所选引脚的工作模式。这个参数 可以是@ref GPIOMode_TypeDef的值 */}GPIO_InitTypeDef;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE); 

led.c函数第二句如上,功能为打开或关闭对应的外设输出时钟端口 在这里插入图片描述 输入参数1:|| 采用了GPIOA时钟或者GPIOB时钟或者GPIOC时钟 输入参数2:ENABLE(使能够启动) 在这里插入图片描述

GPIO_InitStructure.GPIO_Pin = LED1 | LED2;							 //选择端口号(0~15或all)                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;							 //选择IO接口工作方式       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;							 //设置IO接口速度(2/10/50MHz)

以上三句对应了第一句的结构体定义(定义参数的端口号、工作方式和接口速度)

  1. 接口的端口号:LED1和LED2在led.h函数中进行了宏定义
#define LED1	GPIO_Pin_0	//定义IO接口#define LED2	GPIO_Pin_1	//定义IO接口

GPIO_Pin0和Pin1也对应了不同的地址,在系统文件stm32f10x_gpio.h中被宏定义

#define GPIO_Pin_0  ((uint16_t)0x0001)  /*!< Pin 0 selected */#define GPIO_Pin_1  ((uint16_t)0x0002)  /*!< Pin 1 selected */

2.工作方式:输入输出的8种模式,这要根据外电路和作用选择(此处选择了推免输出模式:

typedef enum{ GPIO_Mode_AIN = 0x0,			//模拟输入模式GPIO_Mode_IN_FLOATING = 0x04,	//浮空输入模式GPIO_Mode_IPD = 0x28,			//下拉输入GPIO_Mode_IPU = 0x48,			//上拉输入GPIO_Mode_Out_OD = 0x14,		//开漏输出GPIO_Mode_Out_PP = 0x10,		//推挽输出GPIO_Mode_AF_OD = 0x1C,			//开漏复用输出GPIO_Mode_AF_PP = 0x18			//复用推挽输出}GPIOMode_TypeDef;
GPIO_Init(LEDPORT, &GPIO_InitStructure);

led.c函数的最后一句,改函数详情如下: 在这里插入图片描述 输入参数1:LEDPORT  此处在led.h中被宏定义为GPIOB

#define LEDPORT	GPIOB	//定义IO接口

STM32有5组GPIO引脚,分别是GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,每组GPIO有16个引脚。根据型号不同有着不同的引脚数量,此处采用了B组的16个引脚。 以上LED_Init()函数分析完毕。

6.while(1){} 循环函数内容分析

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));//LED1接口输出高电平1delay_us(50000); //延时1秒GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0delay_us(50000); //延时1秒

GPIO_WriteBit()函数使用方法如下: 在这里插入图片描述

输入参数1:LEDPORT(在led.h中宏定义为GPIOB)采用B组接口 输入参数2:LED1(在led.h中宏定义为GPIO_Pin_0)使用B组的0号接口 输入参数3:(BitAction)(1)表示置位,输出为高电平(0表示清零)

7.结果显示

在这里插入图片描述 LED1和LED2交替闪烁

三、四种方法实现LED的闪烁

1、GPIO_WriteBit()函数

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)); //LED1接口输出高电平1delay_us(50000); //延时1秒GPIO_WriteBit(LEDPORT,LED1,(BitAction)(0)); //LED1接口输出低电平0delay_us(50000); //延时1秒

2、GPIO_ReadOutputDataBit()函数

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //取反LED1delay_ms(500); //延时1秒

在这里插入图片描述 读取出端口管脚的值后利用“1-”来取它的反值(1-0=1 1-1=0)

3、GPIO_SetBits()和GPIO_ResetBits()函数

GPIO_SetBits(LEDPORT,LED1); //LED灯都为高电平(1)delay_s(1); //延时1秒GPIO_ResetBits(LEDPORT,LED1); //LED灯都为低电平(0)delay_s(1); //延时1秒

在这里插入图片描述 在这里插入图片描述

4、GPIO_Write()函数

GPIO_Write(LEDPORT,0x0001); //直接数值操作将变量值写入LEDdelay_s(2); //延时1秒GPIO_Write(LEDPORT,0x0000); //直接数值操作将变量值写入LEDdelay_s(2); //延时1秒

在这里插入图片描述


以上就是点亮LED灯的代码详解,通过修改闪灯延时时间可以得到不同的效果

标签: 英国michell露点变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司