当前位置:   article > 正文

STM32——led灯的点亮+闪烁+流水灯的实现_stm32led灯闪烁程序代码

stm32led灯闪烁程序代码

一、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;//关灯操作
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

(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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

(3)main.c调用

int main(void){
LED_Config();
while(1)
{
		if(sys_time>=1000)
		{
			sys_time = 0;
			LED1_Toggle();
		}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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);
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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);
		}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

2.结果展示

流水灯

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/365740
推荐阅读
相关标签
  

闽ICP备14008679号