STM32实现LED灯点亮、闪烁和流水灯效果详解

文章目录

  • 一、LED点亮
  • 1.原理
  • 2.寄存器方式–代码
  • 3.库函数–代码
  • 4.结果展示
  • 二、LED闪烁
  • 三、LED流水灯
  • 1.代码
  • 2.结果展示
  • 一、LED点亮

    1.原理

    其方式有两种一种是寄存器方式一种是库函数方式,但其原理都是一样的。如原理图所示,与LED相连接的IO口置低电平即可点亮led灯

    2.寄存器方式–代码

    	//寄存器方式
    	//主频8Mhz的时候实现1us延时的方法
    	//LED灯
    	//1,开时钟PE时钟
    	RCC->APB2ENR |= 1<<6;
    	//2,配置IO口
    	GPIOE->CRL &= ~(0xffff<<8);//先清零指定寄存器位
    	GPIOE->CRL |= 0x1111<<8;//设置模式为推挽输出模式
    	//3, 设置开关灯
    	GPIOE->ODR |= 0xf<<2;//关灯操作
    

    3.库函数–代码

    (1)led.c:函数led_config()

    	//库函数
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);	
    	GPIO_InitTypeDef GPIO_InitStruct={0};
    	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
    	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
    	GPIO_Init(GPIOE,&GPIO_InitStruct);
    	GPIO_ResetBits(GPIOE,GPIO_Pin_2);
    

    (2)main.c调用led_config

    4.结果展示

    二、LED闪烁

    原理:让连接的IO口先置零再置1可以使其先亮再灭,我们先使灯置1,然后宏定义让灯反转,delay一个时间,代码如下
    (1)led.c函数led_config()置1:

    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);	
    	GPIO_InitTypeDef GPIO_InitStruct={0};
    	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
    	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
    	GPIO_Init(GPIOE,&GPIO_InitStruct);
    	GPIO_SetBits(GPIOE,GPIO_Pin_2);
    

    (2)led.h宏定义灯的反转

    #define LED1_Toggle() GPIOE->ODR ^= (1<<2)//反转灯操作
    

    (3)main.c调用

    int main(void){
    LED_Config();
    while(1)
    {
    		if(sys_time>=1000)
    		{
    			sys_time = 0;
    			LED1_Toggle();
    		}
    }
    

    sys_time在delay.c中定义

    #include "delay.h"
    
    //主频72Mhz的时候实现1us延时的方法
    #define delay_1us()   __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
    __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();\
    __nop();__nop();
    void Delay_us(uint32_t time)
    {
    	while(time--)
    	{
    		delay_1us();
    	}
    }
    void Delay_ms(uint32_t time)
    {
    	while(time--)
    	{
    		Delay_us(1000);
    	}
    }
    
    uint32_t led_time = 0;
    uint32_t sys_time = 0;
    uint32_t dht11_time = 0;
    
    void SysTick_Handler(void)//1ms进入一次
    {
    	led_time++;
    	sys_time++;
    	dht11_time++;
    }
    
    void Sys_ms(uint32_t time)
    {
    	uint32_t temp = time+sys_time;
    	while(temp>sys_time);
    }
    
    
    

    delay.h

    #ifndef __DELAY_H
    #define __DELAY_H
    
    #include "stm32f10x.h"
    //extern uint16_t temperature;
    //extern uint16_t humidity;
    extern uint32_t led_time ;
    extern uint32_t sys_time ;
    extern uint32_t dht11_time ;
    void Delay_us(uint32_t time);
    void Delay_ms(uint32_t time);
    
    #endif
    

    ps:systick_handler是由系统定时器(SysTick)触发的中断处理函数。SysTick是一种基于硬件的定时器,它可以在每个时钟周期结束时触发中断。在ARM Cortex-M系列处理器中,SysTick定时器是由内核提供的,并且可以用于实现操作系统的时间片轮转调度、延时等功能。当SysTick定时器计数器减到时,就会触发systick_handler中断处理函数。因此,systick_handler的触发是由SysTick定时器的计数器减到时自动触发的。

    三、LED流水灯

    使这四个灯轮流亮起-代码如下

    1.代码

    int main(void){
    LED_Config();
    while(1)
    {
    		if(sys_time>=1000)
    		{
    			sys_time = 0;
    			LED1_Toggle();
    			Delay_ms(300);
    			LED2_Toggle();
    			Delay_ms(300);
    			LED3_Toggle();
    			Delay_ms(300);
    			LED4_Toggle();
    			Delay_ms(300);
    		}
    }
    

    2.结果展示

    流水灯

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32实现LED灯点亮、闪烁和流水灯效果详解

    发表评论