基于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,不会超过电流限制。


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

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>