Tim定时器初始化的方法

#include "stm32f10x.h"                  // Device header


void TimerInit(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	
	TIM_InternalClockConfig(TIM2);
	
	/**********
	初始化配置时基单元
	TIM_Period        TIM_Prescaler     描述
	10000 - 1           7200 - 1;		这样就变成了1S执行一次
	1000 - 1           7200 - 1;		这样就变成了100ms执行一次
	10000 - 1           720 - 1;		这样就变成了100ms执行一次
	********/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStructrue;
	TIM_TimeBaseInitTypeStructrue.TIM_ClockDivision = TIM_CKD_DIV1; // 是否分频
	TIM_TimeBaseInitTypeStructrue.TIM_CounterMode = TIM_CounterMode_Up; // 中心对齐模式1
	TIM_TimeBaseInitTypeStructrue.TIM_Period = 10000 - 1;  // 更新周期值
	TIM_TimeBaseInitTypeStructrue.TIM_Prescaler = 7200 - 1; // 预分频器值
	TIM_TimeBaseInitTypeStructrue.TIM_RepetitionCounter = 0;
	
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitTypeStructrue);
	
	// 使能中断  更新中断到NVIC的路
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
	
	
	// NVIC优先级分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	// 初始化NVIC
	NVIC_InitTypeDef NVIC_InitStructrue;
	NVIC_InitStructrue.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStructrue.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructrue.NVIC_IRQChannelPreemptionPriority=2;  // 配置抢断优先级
	NVIC_InitStructrue.NVIC_IRQChannelSubPriority=1; // 配置响应优先级
	NVIC_Init(&NVIC_InitStructrue);
	
	// 启动定时器
	TIM_Cmd(TIM2, ENABLE);
	
}


// 定时器2的中断函数
void TIM2_IRQHandler(void)
{
	// 检查一下中断是否真的触发了
	// 如果中断2的更新中断变成set了,就可以执行中断函数了
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		// 可以在这里执行中断事件
		
		
		// 清除中断标志位
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

这样之后就可以再任何地方使用中断函数 “TIM2_IRQHandler”了。

有个小问题是,设备一上电就会执行一次中断,并没有满足条件,为了防止这件事出现可以用下面的代码来解决这个问题

// TIM初始化完成之后
TIM_ClearFlag(TIM2, TIM_IT_Update); // 加上这句话是可以防止一上电就执行了一次中断
posted @ 2024-07-02 18:04  Abraverman  阅读(8)  评论(0编辑  收藏  举报