定时器定时中断&定时器外部时钟----TIM定时中断

该教程介绍了如何在STM32微控制器中使用TIM2定时器进行初始化设置,包括时钟源选择、中断配置、NVIC设置以及计数模式。通过TIM_TimeBaseInitStruct结构体配置定时器参数,并在主函数中显示计数值。同时提到了外部时钟模式2的配置,用于红外传感器中断应用。
摘要由CSDN通过智能技术生成

来源B站江科大stm32入门教程


时钟源选择 

 时基单元用TIM_TimeBaseInit()函数

中断输出控制用TIM_ITConfig()函数

NVIC用上一节的NVIC_Init()函数

运行控制用TIM_Cmd()函数

写预分频值的函数TIM_PrescalerConfig()

改变计数器的计数模式TIM_CounterModeConfig()

自动重装器预装功能配置TIM_ARRPreloadConfig()

TIM_GetCounter()  :Gets the TIMx Counter value

TIM_GetPrescaler()

 定时器定时中断

定时器模块

实现功能:num从零开始计时。counter记到ARR指定值时num++。

根据定时中断基本结构(上个博客上的图)配置定时器。

如果中断函数在这个模块下,需要用extern声明外部变量;这里选择直接将中断函数写到主函数里。

//extern uint16_t num;
void Timer_Init(void)
{
	//RCC
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//默认使用内部时钟
	TIM_InternalClockConfig(TIM2);
	
	//时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
	//ARR自动重装器的值;0-65535,更改这两个数的值看效果;
	TIM_TimeBaseInitStruct.TIM_Period=10000-1;
	//PSC预分频器;0-65535
	TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;
	//重复计数器(高级定时器才有)
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	//清除更新中断标志位
	TIM_ClearFlag(TIM2,TIM_FLAG_Update);
	
	//使能更新中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
	
	//NVIC
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStruct);
	
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

//void TIM2_IRQHandler(void)
//{
//	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
//	{
//		
//		num++;
//		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
//	}
//}

 主函数

uint16_t num;
int main(void)
{
	OLED_Init();
	OLED_ShowString(1,1,"num:");
	Timer_Init();
	while(1)
	{
		OLED_ShowNum(1,5,num,5);
		//Gets the TIMx Counter value;值从0到ARR自动重装值;也就是Timer配置中的TIM_Period
		OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);
	}
}
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
	{
		num++;
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

定时器外部时钟

实现功能:每次遮挡对射式红外传感器counter++,达到ARR值时产生中断,在中断函数中判断是否产生中断,若产生中断num++;

使用外部中断模式2根据结构图可以看到还要配置GPIO,根据需要修改上述代码。

//使用外部时钟  TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);

//GPIO配置
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

 再改一下ARR的值。则该功能为遮挡20次num++;

TIM_TimeBaseInitStruct.TIM_Period=20-1;
    //PSC预分频器;0-65535
    TIM_TimeBaseInitStruct.TIM_Prescaler=1-1; 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值