CODE3:TIM定时器

一、定时器定时中断

1.1 计数自增

main.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Timer.h"

/* 声明全局变量 ------------------------------------------------------------------*/
uint16_t Num = 0;

/* 主函数 ------------------------------------------------------------------*/
int main(void)
{
	/*-------- 初始化硬件 --------*/
	OLED_Init();		// OLED初始化
	Timer_Init();	// 定时器初始化
	
	/*-------- OLED显示 --------*/
	OLED_ShowString(1, 1, "Num: ");	// 5
//	OLED_ShowString(2, 1, "Count: "); // 7
	
	while(1)
	{
		OLED_ShowNum(1, 8, Num, 5);			//从1行6列开始,显示十进制数字
//		OLED_ShowNum(2, 8, TIM_GetCounter(TIM2), 5);			//从1行6列开始,显示十进制数字
	}
	
}

/* 定时器中断函数 ------------------------------------------------------------------*/
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ // 检查更新中断标志位
		Num++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除更新中断标志位
	}
}

Timer.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"                  // Device header

/**
  * @brief  TIM初始化函数,每秒触发一次中断
  * @param  
  * @note   TIM2-APB1
  * @retval 
  */
void Timer_Init(void)
{
	/*-------- 声明和初始化变量 --------*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; // 滤波时钟的分频配置
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
	TIM_TimeBaseInitStruct.TIM_Period = 10000 - 1; // 自动重装值(相当于1s重装载1次)
	TIM_TimeBaseInitStruct.TIM_Prescaler = 7200 - 1; // 预分频值(当前f = 10,000Hz, T = 0.1ms)
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; // 重复计数器只有高级定时器才有
	
	NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; // 指定中断通道
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; // 响应优先级
	
	/*-------- 配置时钟 --------*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 使能TIM2时钟
	TIM_InternalClockConfig(TIM2); // 选择内部时钟源
	
	/*-------- 配置时基单元 --------*/
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);
	
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);	// 手动清除中断标志位
	
	/*-------- 使能更新中断 --------*/
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	/*-------- 配置NVIC --------*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 注意:整个芯片只能使用1种分组
	NVIC_Init(&NVIC_InitStruct);
	
	/*-------- 启动TIM --------*/
	TIM_Cmd(TIM2, ENABLE);
	
}

1.2 LED闪烁

main.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"                  // Device header
#include "Timer.h"
#include "LED.h"
#include "OLED.h"

/* 声明全局变量 ------------------------------------------------------------------*/
uint16_t BlinkFlag = 0;
uint16_t Num = 0;

/* 主函数 ------------------------------------------------------------------*/
int main(void)
{
	/*-------- 初始化 --------*/
	Timer_Init();	// 初始化定时器
	LED_Init(); // 初始化LED
	OLED_Init(); // 初始化OLED
	
	/*-------- OLED显示 --------*/
	OLED_ShowString(1, 1, "Num: ");	// 5	

	while(1)
	{
		OLED_ShowNum(1, 8, Num, 5);	// 放判断里外都可以
		if(BlinkFlag){
			LED_Blink();
			BlinkFlag = 0; // 清除标志位
		}
	}
}

/* 定时器中断函数 ------------------------------------------------------------------*/
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){ // 检查更新中断标志位
		BlinkFlag = 1;
		Num++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除更新中断标志位
	}
}

LED.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"                  // Device header

/* 声明全局变量 ------------------------------------------------------------------*/
uint16_t BlinkTemp = 0x0;

/**
  * @brief  LED初始化函数
  * @param  
  * @note   PA0-APB2
  * @retval 
  */
void LED_Init(void)
{
	/*-------- 声明和初始化变量 --------*/
	GPIO_InitTypeDef GPIO_InitStruct;
	  
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	//	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

	/*-------- 使能时钟 --------*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	/*-------- 初始化IO口 --------*/
	GPIO_Init(GPIOA, &GPIO_InitStruct);

	/*GPIO_SetBits & GPIO_ResetBits*/
	//	GPIO_SetBits(GPIOA, GPIO_Pin_0);
	//	GPIO_ResetBits(GPIOA, GPIO_Pin_0);

	/*GPIO_WriteBit*/
	//	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
	//	GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
	//	GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1);
	//	GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0);

	/*GPIO_Write*/
	//	GPIO_Write(GPIOA, 0x1);
	GPIO_Write(GPIOA, 0x0);	  // 输出低电平
}

/**
* @brief  LED闪烁函数
* @param  
* @note   
* @retval 
*/
void LED_Blink(void)
{
	BlinkTemp = ~BlinkTemp;
	GPIO_Write(GPIOA, BlinkTemp);
}

posted @ 2025-11-20 19:07  LI,Yi-han  阅读(9)  评论(0)    收藏  举报