STM32——led灯的点亮+闪烁+流水灯的实现

news/2024/11/29 11:50:23/

文章目录

    • 一、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.结果展示

流水灯


http://www.ppmy.cn/news/888697.html

相关文章

【操作系统】几种基本页面置换算法的基本思想和流程图

目录 一、概述二、最佳置换算法&#xff08;OPT&#xff09;三、先进先出置换算法&#xff08;FIFO&#xff09;四、最近最久未使用置换算法&#xff08;LRU&#xff09;五、三种页面置换算法优缺点对比六、运行结果七、总结 一、概述 在地址映射过程中&#xff0c;若在页面中发…

T6账簿打印显示打印机缺纸

问题现象&#xff1a;在打印总账账簿的时候点打印显示打印机缺纸&#xff0c;实际有放纸进去&#xff0c;预览进去空白或者横线 解决方法&#xff1a;打开总账账簿点击表头还原然后再去打印即可&#xff0c;其他账簿如果也出现这个问题到相应的账表中还原一下格式即可。

打印机提示手动进纸解决办法

今天公司打印机打印时提示手动进纸&#xff0c;奇怪的是之前好好的&#xff0c;也没人动他&#xff0c;咋突然就提示这个呢&#xff0c;更奇怪的是其他人打印都没问题&#xff0c;唯独另外一个同事&#xff0c;已打印就提示手动进纸。 在网上搜索解决办法&#xff1a; 很多说法…

计算机装打印机,电脑怎么安装打印机

打印机是现在我们办公设备的必要用品之一&#xff0c;任何档案&#xff0c;文件的纸质版都需要经过打印机进行&#xff0c;所以说打印机在一个办公室里是必不可少的&#xff0c;那么&#xff0c;相对来说是一个问题&#xff0c;安装打印机&#xff0c;一个对于会电脑的人是一个…

html怎么消除打印的进纸,打印机缺纸状态怎么消除?

打印机总是提示缺纸 故障描述&#xff1a;用户最近在使用打印机的时候发现&#xff0c;明明打印机进纸槽中装有不少打印纸张。可是在执行打印操作时&#xff0c;印机控制面板中的缺纸信号灯却总是闪烁。 故障诊断&#xff1a;产生这种故障的原因一般是打印机的纸张传动结构出现…

打印机服务器属性纸张自动改,“打印机设置自定义纸张”的解决方案

\n\t问题描述\n\n \n\t随着电脑配置的档次越来越高档&#xff0c;操作系统也从Windows 98向Windows XP过渡。现在随机配套的操作系统一般都为Windows XP操作系统。在Windows 98中打印机纸张设置中有专门的自定义选项&#xff0c;而在Windows XP中打印机纸张设置中没有了自定义选…

posix ipc之匿名信号量

note 使用信号量进行进程间通信时&#xff0c;信号量要放置在共享内存上&#xff1b;若是线程间通信&#xff0c;放堆上或全局变量区就行 code // 使用信号量进行进程间通信时&#xff0c;信号量要放置在共享内存上&#xff1b;若是线程间通信&#xff0c;放堆上或全局变量区…

Spring Boot使用DataFreezer操作Aerospike

DataFreezer是一个用于将Aerospike数据转储到磁盘上的工具&#xff0c;它可以备份和导出Aerospike数据&#xff0c;也可以将冷数据从Aerospike中释放并转储到磁盘上&#xff0c;以减轻Aerospike的负载。Spring Boot集成了Aerospike的官方Java客户端&#xff0c;因此可以使用Dat…