定时器控制LED灯的亮灭(每隔1s翻转一次灯的状态)

这篇具有很好参考价值的文章主要介绍了定时器控制LED灯的亮灭(每隔1s翻转一次灯的状态)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 实验目的

写一个1s的定时器,来控制LED灯的亮灭。这里LED1的端口是GPIOF,引脚是PIN10。定时器是通用定时器TIM3。

2. 实验流程

初始化LED;
初始化定时器;
编写时钟中断函数;
编写LED.h函数;
编写main.c函数;

2.1 初始化LED

//初始化GPIO端口
void LED_GPIO_Config(void)
{
	//初始化结构体 GPIO_InitStruct(取的一个随机的名字)
	//里面是GPIO的速度,上下拉,输出类型
	 GPIO_InitTypeDef   GPIO_InitStruct;
	//打开时钟(一般开时钟要放到前面的位置,然后再是设置上拉,输出这些)
	 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);  //使能时钟必须放到前面,不然后面的操作不会使灯点亮
	//驱动是哪个引脚  PF10
	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_10;
	//推挽输出
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
	//上拉
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;
	//输出的速度
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	//变量获取它的指针,取地址就行(&)
	GPIO_Init(GPIOF,&GPIO_InitStruct);
	GPIO_SetBits(GPIOF,GPIO_Pin_10);//GPIOF10设置高,灯灭
}

2.2 初始化定时器

这里定时器的计算公式是:
Tout= ((arr+1)*(psc+1))/Tclk;
arr:自动重装载值;
psc:时钟预分频系数;
Tclk:TIM3 的输入时钟频率(单位为 Mhz),这里TIM3的时钟频率为是84Mhz;
Tout:TIM3 溢出时间。
按照下面的设置:计数一次的时间是 (1000 * 84) / 84000000 = 1ms (后面计数1000次就是1s,所以就是LED经过1s亮灭一次)

//这里使用了中断,就要配置中断的初始化
 void BASIC_TIM_NVIC_Config(void){
	//NVIC初始化结构体
	NVIC_InitTypeDef  NVIC_InitStruct;
	//设置中断优先级的分组
	//就是设置主抢占优先级和子抢占优先级各是几,这里是分组为1,代表主优先级可以是0和1(就是1个位来设置主优先级),子优先级是0-7,是2的3次方
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	//配置TIM6_IRQn为中断源
	NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;     //配置时钟
	//配置抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	//配置子优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
	//使能中断
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStruct);
}
//定时器初始化
 void BASIC_TIM_Config(void){
	 //时钟基结构体
	 TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	 //开启定时器时钟,即内部时钟CK_INT = 84M
	 //BASIC_TIM_APB1Clock_FUN(RCC_APB1Periph_TIM3, ENABLE); 
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); ///使能 TIM3 时钟
	 //自动重装载寄存器的值,累计TIM_Period+1个评率后产生一个更新或者中断 
	 TIM_TimeBaseStructure.TIM_Period = 1000-1;     //自动重装载值arr  这就是500ms
	 //时钟预分频系数为
	 TIM_TimeBaseStructure.TIM_Prescaler = 84-1; //定时器分频  
	 //时钟分频因子,基本定时器没有,不用管
	 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	 //计数器计数模式,基本定时器只能向上计数,没有计数模式的设置
	 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
	 //重复计数器的值,基本定时器没有,不用管
	 //TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  //扩大定时器的周期的
	 //初始化定时器
	 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //哪一个定时器初始化
	 //清除计数器中断标志
	 TIM_ClearFlag(TIM3, TIM_FLAG_Update);         
	 //开启计数器中断
	 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);        //允许定时器3更新中断
	 //使能计数器
	 TIM_Cmd(TIM3,ENABLE);
 }
//初始化上面两个函数,在main函数只调用这一个就可以了
 void BASIC_TIM_Init(void){
	 //初始化中断优先级
   BASIC_TIM_NVIC_Config();
	 //初始化定时器配置
   BASIC_TIM_Config();
 }

2.3 编写时钟中断函数

extern uint16_t time;  //计数用的
//编写时钟中断函数
//void BASIC_TIM_IRQHandler(){
	void TIM3_IRQHandler(void){
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET){     //判断更新中断状态位
		time++;                                           //全局变量,在main.c里面的
		TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);      //清除中断标志位
	}
}

2.4 编写LED.h函数

里面主要是翻转的宏定义。
^异或相同为0,不同为1。
定时器控制LED灯的亮灭(每隔1s翻转一次灯的状态)
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}

LED_G_GPIO_PORT->ODR就是GPIOF->ODR,GPIOF->ODR ^= GPIO_Pin_10;
其中 #define GPIO_Pin_10 ((uint16_t)0x0400), 0000 0100 0000 0000就是第10位为1,GPIOF的ODR寄存器的初始值都是0,所以异或GPIO_Pin_10 就是把ODR寄存器的第10位置1,再置0这样进行反转。

#ifndef   LED.h
#define   LED.h
	//包含GPIO的头文件
  #include "stm32f4xx.h"
  #define  LED_G_GPIO_PIN     GPIO_Pin_10
  #define  LED_G_GPIO_PORT    GPIOF
	// \c语言里面的续行符,后面不能有任何的东西
	//带参宏的主体
	#define LED_G(a)  if(a) \
		GPIO_SetBits(GPIOF,GPIO_Pin_10);\
	  else GPIO_ResetBits(GPIOF,GPIO_Pin_10);
	#define LED_G_TOGGLE  {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;} //异或相同为0,不同为1
	void LED_GPIO_Config(void); //初始化LED
	
#endif /*__LED.h */	

2.5 编写main.c函数

int main(void){
	LED_GPIO_Config();
	BASIC_TIM_Init();
	while(1){	
		if(time == 1000){   //1000ms就是1s
			LED_G_TOGGLE;   //反转小灯
		    time = 0;       //清除这个计数的值
		}
}

3. 实验结果

每隔1s闪烁一次文章来源地址https://www.toymoban.com/news/detail-434455.html

到了这里,关于定时器控制LED灯的亮灭(每隔1s翻转一次灯的状态)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32入门笔记10_USART串口通信+案例:上位机控制LED亮灭(USART串口通信、TIM定时器、EXTI综合案例)

    通信的目的: 将一个设备的数据传送到另一个设备, 扩展硬件系统 通信协议: 制定通信的规则, 通信双方按照协议规则进行数据收发 名称 引脚 双工 时钟 电平 设备 USART TX、RX 全双工 异步 单端 点对点 I2C SCL、SDA 半双工 同步 单端 多设备 SPI SCLK、MOSI、MISO、CS 全双工 同步 单端

    2024年02月09日
    浏览(42)
  • STM32使用定时器更新中断使LED亮灭交替1S闪烁

    在向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR(自动装载寄存器)计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。每次计数器溢出时可以产生更新事件,当使能了更新中断以后,计数器溢出时则产生更新中断。 上图源自一位b站up主的定时器中断

    2024年02月05日
    浏览(57)
  • 51-定时器与按键控制LED流水灯模式&定时器时钟

    按键(以独立按键为例)控制LED流水灯模式: 在按键控制LED流水灯模式中,如果仅仅简单的把独立按键与LED流水灯拼接起来,则会出现一些问题:在LED流水灯的代码中会有长时间的Delay,此时按键检测就会很不灵敏:按下时不灵敏,需要一些时间才能被检测到,按下后再松手时

    2024年02月08日
    浏览(47)
  • 驱动控制STM32LED灯的两秒,亮灭

    2024年02月12日
    浏览(46)
  • C51单片机——通过使用定时器控制LED闪灭

    目录 0 引言 1 定时的原理 1.1 生活中的定时 1.2单片机中的定时器 2 C语言程序设计 2.1 定时器的内部功能 2.2 设置寄存器 2.3 实验程序 3 有两个小问题(算是延伸吧) 3.1 只能0.05s闪一次吗? 3.2 每次都要在草稿纸手算初始值好麻烦

    2024年02月06日
    浏览(73)
  • STM32+摁键与定时器实现Led灯控制(中断)

    中断作为单片机开发必须掌握的内容,它能够在不搭载操作系统的情况下让我们体验多任务处理的快感,保证了高优先级任务的实时性,同时系统中断也能够提供给用户在核心发生错误之后进行处理的机会。STM32F103系列单片机中断非常强大,每个外设都可以产生中断,F103 在

    2024年02月04日
    浏览(64)
  • STC15W104 定时器实现灯的闪烁(定时器原理讲解)

    STC15W104单片机共有2个定时器,分别为定时器0、定时器2。 定时器是单片机中的一种常用外设,用于在一定时间间隔内产生中断。 定时器通常用于计时、测量时间间隔、生成PWM信号等应用中。 在STC15W104单片机中,定时器可以被配置为定时器/计数器模式。 在定时器模式下,定

    2024年02月13日
    浏览(44)
  • STM32第二课:灯的亮灭、流水灯、有源蜂鸣器

             STM32的第二课,我们来学习如何使用STM32控制等的亮灭,使用多重控制制作我们自己的流水灯,然后再了解一下有源蜂鸣器的用法,创造出不一样的声音。         首先开头包含STM32的头文件#include \\\"stm32f10x.h\\\",这个头文件包含STM32众多的重要驱动,一定要把这个头文

    2024年01月24日
    浏览(41)
  • 定时器+中断 闪烁led

    ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 1)定时器 类似闹钟,设定好对应时间,会在设定的时刻响起铃声。 分频:降低频率 计数:用来计数 重载:清零 当定时器中的计数值达到重载值时,计数值就会被清零,触发中断 2)轮询和中断 例如厨房里烧着

    2024年02月01日
    浏览(33)
  • STM32 基本定时器反转LED

    引脚是什么为什么要初始化引脚?      在嵌入式系统中,引脚是微控制器或微处理器上的物理引脚,用于连接外部设备、传感器或其他芯片。每个引脚都有特定的功能和用途,例如输入、输出、模拟输入、电源供应等。STM32F103C8T6引脚图: 初始化引脚的目的在于: 确定引脚

    2024年01月25日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包