来源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;