6-2定时器定时中断&定时器外部时钟

常用TIM函数

12345678910111213141516171819202122
void TIM_DeInit(TIM_TypeDef* TIMx);//恢复缺省配置void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//时基单元初始化,配置时基单元void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);//把结构体变量赋默认值void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);//使能计数器void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//使能中断输出信号void TIM_InternalClockConfig(TIM_TypeDef* TIMx);//选择内部时钟void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);//选择ITRx其他定时器的时钟void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);//选择TIX捕获通道的时钟void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式1输入的时钟void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);//选择ETR通过外部时钟模式2输入的时钟void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);//配置ETR引脚的预分频器、极性、滤波器参数void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);//单独写预分频值void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);//改变计数器的计数模式void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);//自动重装器预装功能配置void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);//给计数器写一个值,手动给一个计数值void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);//给自动重装器一个值,手动给一个自动重装值uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);//获取当前计数器的值uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);//获取当前预分频器的值FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);//获取标志位void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);//清除标志位ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);//获取标志位,中断程序使用void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);//清除标志位,中断程序使用

定时器定时中断

Timer.c

12345678910111213141516171819202122232425262728293031323334353637
#include "stm32f10x.h"                  // Device headerextern uint16_t Num;//声明对应main里的Numvoid Timer_Init(void){	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟,TIM2是APB1总线的外设	TIM_InternalClockConfig(TIM2);//选择为内部时钟,选择TIM2,由内部时基驱动,这一行可以不写,因为会默认调用内部时钟	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置时基单元结构体	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//结构体成员:分频参数	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//结构体成员:计数模式,可以向上计数,向下计数,三种中央对齐模式	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//结构体成员:ARR自动重装器的值	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//结构体成员:PSC预分频器的值,要参考6-1TIM定时中断计算	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//结构体成员:重复计数器的值	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//完成配置时基单元 	TIM_ClearFlag(TIM2,TIM_FLAG_Update);	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//使能中断,更新中断 	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC优先级分组,选择分组2	NVIC_InitTypeDef NVIC_InitStructure;//NVIC结构体	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//结构体参数:中断通道	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//结构体参数:使能	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//结构体参数:抢占优先级	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//结构体参数:响应优先级	NVIC_Init(&NVIC_InitStructure);//完成配置NVIC 	TIM_Cmd(TIM2,ENABLE);//使能通道} void TIM2_IRQHandler(void)//TIM2的中断函数{	if (TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检查标志位	{		Num ++;		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位	}} 

main.c

123456789101112131415161718192021
#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "OLED.h"#include "Timer.h" uint16_t Num;//定义一个16位的全局变量Numint main(void){	OLED_Init();	Timer_Init();	OLED_ShowString(1,1,"Num:"); 	while(1)	{		OLED_ShowNum(1,5,Num,5);		OLED_ShowNum(2,5,TIM_GetCounter(TIM2),5);//获取TIM2当前计数器的值	} }  

定时器外部时钟

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
#include "stm32f10x.h"                  // Device headerextern uint16_t Num;void Timer_Init(void){	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA	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);  	TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x0F);//通过ETR引脚的外部时钟模式2配置 	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//分频参数	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式	TIM_TimeBaseInitStructure.TIM_Period = 10 - 1;//ARR	TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1;//PSC	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); 	TIM_ClearFlag(TIM2,TIM_FLAG_Update);	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); 	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	NVIC_InitTypeDef NVIC_InitStructure;	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	NVIC_Init(&NVIC_InitStructure); 	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 Timer_GetCounter(void){	return TIM_GetCounter(TIM2);} 

main.c

12345678910111213141516171819
#include "stm32f10x.h"                  // Device header#include "Delay.h"#include "OLED.h"#include "Timer.h" uint16_t Num;int main(void){	OLED_Init();	Timer_Init();	OLED_ShowString(1,1,"Num:");	OLED_ShowString(2,1,"CNT:");	while(1)	{		OLED_ShowNum(1,5,Num,5);		OLED_ShowNum(2,5,Timer_GetCounter(),5);//计数器的值	}	} 
🔍 ×