ICode9

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

【嵌入式】STM32学习(4)——点亮LED灯(库函数版本)

2021-03-03 14:01:39  阅读:322  来源: 互联网

标签:输出 LED Pin 电平 STM32 IO GPIO 库函数


点灯LED灯

一、GPIO库函数介绍

操作IO口之前必须要引入的源文件和头文件为:

  • 头文件:stm32f10x_gpio.h
  • 源文件:stm32f10x_gpio.c

对于调用方式不清晰的函数均可以先选中,右键Go To Definition 查看相关内容。
GPIO库函数

1、初始化函数(1个)

void GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);

作用:初始化一个或多个IO口(同一组)的工作方式和速度。 主要操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的时候有设置BSRR或者BRR寄存器。

参数一GPIOx:GPIOA——GPIOG
参数二GPIO_InitStruct(结构体变量,名称任意起):包括GPIO_Pin、GPIO_Mode、GPIO_Speed。

typedef struct
{
  uint16_t GPIO_Pin;//指定要初始化的IO口
  GPIOSpeed_TypeDef GPIO_Speed;  //设置IO口输出速度
  GPIOMode_TypeDef GPIO_Mode;//设置工作模式,8种中的一种
}GPIO_InitTypeDef;

初始换函数示例:

	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量 
	
    //指定结构体成员变量	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0→PB.5 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHZ	
	//根据设定参数初始化GPIOB.5
	GPIO_Init(GPIOB,&GPIO_InitStructure);

2、读取输入电平函数(2个)

  • 读取某个GPIO输入电平(操作GPIOx_IDR寄存器)
 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

例如:

 uint8_t GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5);//读取GPIOA.5的输入电平
  • 读取某组GPIO输入电平(操作GPIOx_IDR寄存器)
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

例如:

GPIO_ReadInputData(GPIOA);//读取GPIO组所有IO口的输入电平

3、读取输出电平函数(2个)

  • 读取某个GPIO输出电平(操作GPIOx_ODR寄存器)
 uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

例如:

 uint8_t GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5);//读取GPIOA.5的输出电平
  • 读取某组GPIO输出电平(操作GPIOx_ODR寄存器)
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

例如:

GPIO_ReadOutputData(GPIOA);//读取GPIO组所有IO口的输出电平

4、设置输出电平函数(4个)

  • 设置某个IO口输出为高电平(1)(操作BSRR寄存器)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • 设置某个IO口输出为低电平(0)(操作BRR寄存器)
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • 设置IO口输出电平(不常用)
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

二、硬件连接

IO口输出高电平,LED灭;输出低电平,LED点亮。(1灭0亮)
在这里插入图片描述

GPIO的输出方式需要设置为推挽输出。 推挽输出既可以输出高电平,也可以输出低电平。输出高电平时,电流输出到负载,理解成推,输出低电平时,负载电流流向芯片,理解为拉,即挽。而开漏输出只能输出低电平,如果需要输出高电平,则需要外接上拉电阻,且开漏输出具有“线与”功能,一个为低,全部为低,多用于I2C和SMBUS总线。

三、点亮LED灯

1、三个步骤:

  • 操作IO口之前,使能IO口时钟。不同的IO组,调用的时钟使能函数不一样。这里调用的是
    Void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
  • 初始化IO口模式。调用函数GPIO_Init()
  • 初始IO口,输出高低电平。
    GPIO_SetBits();
    GPIO_ResetBits();

2、点亮

首先再建立一个文件夹HardWare,并添加LED相关的头文件和源文件。
在这里插入图片描述

led.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
   
#endif

led.c

#include "led.h"
#include "stm32f10x.h"

void LED_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//使能GPIOB时钟
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE ,ENABLE);//使能GPIOE时钟
   
   //指定结构体成员变量	
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0→PB.5 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHZ
   
   GPIO_Init(GPIOB,&GPIO_InitStructure);//根据设定参数初始化GPIOB.5
   GPIO_SetBits(GPIOB,GPIO_Pin_5);//初始默认LED熄灭,设置GPIOB.5输出为高电平
   
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//LED0→PE.5 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHZ
   GPIO_Init(GPIOE,&GPIO_InitStructure);//根据设定参数初始化GPIOE.5
   GPIO_SetBits(GPIOE,GPIO_Pin_5);//设置GPIOE.5输出为高电平
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"

int main()
{
   delay_init();//定义在SYSTEM文件夹里
   LED_Init();
   
   while(1)
   {
   	GPIO_SetBits(GPIOB,GPIO_Pin_5);//置1,熄灭LED灯
   	GPIO_SetBits(GPIOE,GPIO_Pin_5);
   	delay_ms(500);//通过延时简单达到闪烁的效果
   	
   	GPIO_ResetBits(GPIOB,GPIO_Pin_5);//置0,点亮LED灯
   	GPIO_ResetBits(GPIOE,GPIO_Pin_5);
   	delay_ms(500);	
   }
   
}

注意:(否则可能有警告)

  • 主函数大括号前后要空一行(最后一行要回车)
  • .h文件定义时#endif也要前后空一行

前一篇: STM32学习(3)——GPIO的8种工作方式及相关寄存器说明

标签:输出,LED,Pin,电平,STM32,IO,GPIO,库函数
来源: https://blog.csdn.net/qq_43732429/article/details/114307832

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

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

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

ICode9版权所有