利用定时器中断实现LED亮一秒灭一秒

time.h

#ifndef TIM_H_
#define TIM_H_

	void TIM_TimeBase_init(void);


#endif

time.c

#include "stm32f10x.h"
#include "time.h"

void TIM_TimeBase_init(void)
{
		TIM_TimeBaseInitTypeDef TIM_TimeBase_initstruct;
		NVIC_InitTypeDef NVIC_TIM_Initstruct;
	

		 RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2,  ENABLE);        //时钟初始化

	//定时器初始化,定时一秒
		TIM_TimeBase_initstruct.TIM_ClockDivision = TIM_CKD_DIV1;
		TIM_TimeBase_initstruct.TIM_CounterMode = TIM_CounterMode_Up;
		TIM_TimeBase_initstruct.TIM_Period = 7200;			//最大65535
		TIM_TimeBase_initstruct.TIM_Prescaler = 10000;
		TIM_TimeBase_initstruct.TIM_RepetitionCounter = 0;
		TIM_TimeBaseInit( TIM2, &TIM_TimeBase_initstruct);

		TIM_Cmd( TIM2,  ENABLE);	//定时器使能
		TIM_ITConfig(TIM2,  TIM_IT_Update, ENABLE  );		//定时器中断更新使能

	
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //中断分组
//中断初始化
		NVIC_TIM_Initstruct.NVIC_IRQChannel = TIM2_IRQn;
		NVIC_TIM_Initstruct.NVIC_IRQChannelCmd = ENABLE;
		NVIC_TIM_Initstruct.NVIC_IRQChannelPreemptionPriority = 0;
		NVIC_TIM_Initstruct.NVIC_IRQChannelSubPriority = 0;
		NVIC_Init(&NVIC_TIM_Initstruct);

}

led.h

#ifndef LED_H_
#define LED_H_



void LED_Init(void);

#endif

led.c

#include "led.h"
#include "stm32f10x.h"

//初始化LED灯的函数————函数的定义、声明、调用(led.c    led.h  main.c)
void LED_Init(void)
{
	//1.初始化led引脚GPIOA1
	GPIO_InitTypeDef  led_initstruct;  //定义GPIO的结构体
	

	
		//2.时钟初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//时钟的初始化
		
		
		
		led_initstruct.GPIO_Pin = GPIO_Pin_1;
		led_initstruct.GPIO_Speed = GPIO_Speed_2MHz;
		led_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;
	
	GPIO_Init(GPIOA,&led_initstruct);  //初始化GPIO结构体
	
	
	
	
	
}

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "shake.h"
#include "usart.h"
#include "stdio.h"
#include "time.h"

void delay(uint16_t time) 
{
	uint16_t i=0;
	while(time--)
	{
		i =12000;
		while(i--);
	}

}
 
int  main() 
{
		Key_Init();

		my_usart_init();
		LED_Init();
		TIM_TimeBase_init();
//	My_Usart_Send_Byte( USART1,  'A');
//	My_Usart_Send_Byte( USART1,  'B');
//	My_Usart_Send_Byte( USART1,  'C');
//	My_Usart_Send_Sting( USART1,  "\r\n");
//	My_Usart_Send_Sting(USART1 , "fei \r\n");
		printf("Hello,shi \r\n");
	

	
	
	while(1)
	{
			
	}		
}



void TIM2_IRQHandler(void)
{
		if( TIM_GetITStatus( TIM2,TIM_IT_Update  ) != RESET)
		{
				GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)));//对A1引脚进行电平取反
				//GPIO_ResetBits(GPIOA,GPIO_Pin_1);
				
				TIM_ClearITPendingBit(TIM2, TIM_IT_Update );
		}
}

本文介绍了使用STM32定时器中断实现LED每秒闪烁的方法。通过配置TIM2定时器(周期7200,预分频10000)产生1秒中断,在中断服务程序中翻转GPIOA1引脚电平。系统包含定时器初始化、LED驱动和主程序三部分:定时器模块设置时钟和中断,LED模块初始化GPIOA1为推挽输出,主程序启动各模块后进入循环。中断处理函数TIM2_IRQHandler检测更新事件并执行LED状态切换,实现精确的1秒亮灭周期控制。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐