基于STM32单片机通过GPIO输出点亮LED灯

2023-08-25  

一. GPIO初始化


STM32单片机和51单片机不同,51单片机只需与引脚相连后就可以使用引脚发出高低电平信号控制外部器件,而STM32单片机需要先对引脚进行配置(初始化),如果使用引脚用作I2C、SPI、USART等通讯接口时,就是所谓的复用功能时,就需要再配置外设的工作参数。



1.使能GPIO端口时钟;


RCC_APBxPeriphClockCmd(RCC_APBxPeriph_GPIOy , ENANLE/DISABLE);

函数表示使能或者不使能APBx(Advanced Peripheral Bus)的外设时钟,APBx表示时钟总线APB1或APB2,APB1为低速的外设时钟(最大为36MHz),APB2为高速的外设时钟(最大为72MHz)。GPIOy表示GPIO的端口(A.B.C...)。两个时钟总线上都挂载着不同的引脚端口和外设,使用时需要注意,APB1的使能函数不能使能挂载在APB2总线上的引脚端口和外设。


2.初始化GPIO目标引脚的工作模式


因为官方库函数已经将初始化GPIO的所需要的功能进行了封装,成为一个结构体,所以需要先定义一个GPIO_InitTypeDef类型的结构体。注意:定义结构体要放在GPIO配置函数内的第一行。


GPIO_InitTypeDef GPIO_InitStructure;

然后选择需要控制的引脚,x表示所控制端口的第几个引脚。


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;

然后设置引脚模式,xx表示8种不同的引脚模式,如果只是想要控制引脚的高低电平用于LED的亮灭控制,则可以选择GPIO_Mode_Out_PP(通用推挽输出);


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_xx;

然后设置引脚的速率,xx表示输出最大的频率,共有10MHz、2MHz、50MHz三种选择,速度越大,I/O口的相应速度越快,但相应的功耗和噪声也大。


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_xxMHz;

3.调用库函数,初始化GPIO端口


GPIOx为需要使用端口,在前面已经使能其的时钟;GPIO_InitStructure为第2步定义的结构体。


GPIO_Init(GPIOx, &GPIO_InitStructure);

4.定义引脚的高低电平


GPIO_SetBits(GPIOx , GPIO_Pin_y)表示将Px(y)的引脚拉高;


GPIO_ResetBits(GPIOx , GPIO_Pin_y)表示将Px(y)的引脚拉低;


二. 示例程序:通过控制引脚PB5输出高低电平实现led灯的亮灭。


“bsp_led.c”  //led驱动文件


#include "bsp_led.h"


void LED_GPIO_Config(void)




{


    GPIO_InitTypeDef GPIO_InitStructure; 


    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;


    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


    GPIO_Init(GPIOB, &GPIO_InitStructure);  


}




"bsp_led.h"  //led头文件


#ifndef  __LED_H


#define __LED_H


#include "stm32f10x.h"


void LED_GPIO_Config(void);


#define  LED_OFF     GPIO_SetBits(GPIOB , GPIO_Pin_5);        //PB5引脚为低电平


#define  LED_ON      GPIO_ResetBits(GPIOB , GPIO_Pin_5);    //PB5引脚为高电平


#endif /* __LED_H */




"main.c"  //主函数文件


#include "stm32f10x.h"


#include "bsp_led.h"


void delay_ms(uint16_t nms)    //延时函数,ms级别


{


    uint16_t i , j;


    for(i=0;i< 1000;i++)


    { for(j=0 ; i< 1000 ; j++) }


}


int main(void)    //led循环亮灭各0.5秒


{


    LED_GPIO_Config();


    while(1)


    {


        LED_ON;


        delay_ms(500); //延时500ms


        LED_OFF;


        delay_ms(500); //延时500ms


    }


}

三. 电路图示意


图片

LED接线示意图


当PB5为低电平时,led亮;当PB5为高电平时,led灭。由于led的内阻较小,而且有最大电流限制,所以需要串联电阻调节电流,我选用的led的最大电流为20mA,所以我使用330Ω的电阻,使其电流为10mA,不会超过电流限制。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。