功能描述:将外部引脚的输入时钟作为定时器的基准时钟。外部方波信号通过PA5引脚输入作为TIM2的外部时钟,定时器在外部时钟模式2下实现计数计时功能。
- main.c文件内容如下
#include "stm32f4xx.h" // Device header #include "OLED.h" #include "Timer.h" uint8_t cnt = 0; int main(void) { Timer_Init(); OLED_Init(); OLED_Clear(); //清屏OLED OLED_Refresh(); //刷新OLED while(1) { OLED_Printf(0,0,8,"cnt = %d",cnt); //在OLED上显示cnt OLED_Refresh(); } } //TIM2中断服务函数 void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET) //判断相应的中断挂起标志位是否置SET { cnt++; TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除上述中断挂起标志位 } }
- Timer.c文件内容如下
#include "Timer.h" /** * @摘要 初始化TIM * @参数 无 * @返回值 无 * @说明 无 */ void Timer_Init(void) { //开启GPIOA的时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //将PA5配置为复用模式,复用为TIM2的ETR外部触发输入引脚 GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2); //定义GPIO初始化结构体 GPIO_InitTypeDef GPIO_InitStructure; //初始化上述结构体 GPIO_StructInit(&GPIO_InitStructure); //配置GPIO模式为复用模式 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //配置GPIO输出类型为推挽输出(此处无用) GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //指定GPIO引脚为Pin5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //配置GPIO输入类型为浮空输入 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //配置GPIO的速度为快速50MHZ GPIO_InitStructure.GPIO_Speed = GPIO_Fast_Speed; //初始化对应的GPIO GPIO_Init(GPIOA, &GPIO_InitStructure); //开启TIM2时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //选择TIM2的时钟模式为外部时钟模式2,时钟源为ETR引脚的输入 TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x03); //定义时基单元初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //初始化上述结构体 TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure); //配置预分频系数为1 TIM_TimeBaseInitStructure.TIM_Prescaler = 1-1; //配置自动重装值为10 TIM_TimeBaseInitStructure.TIM_Period = 10-1; //配置计数模式为向上计数 TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //配置定时器时钟频率与数字滤波器所使用的采样时钟之间的分频比 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //配置重复计数器的值为0 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //初始化时基单元 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //清除TIM2更新中断标志位,因为初始化结束会立刻置该中断标志位为1 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //使能TIM2的更新中断到NVIC TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //NVIC优先级分组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //定义NVIC初始化结构体 NVIC_InitTypeDef NVIC_InitStructure; //选择NVIC通道为TIM2_IRQn NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //使能该通道 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //配置抢占优先级为1 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //配置响应优先级为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //初始化NVIC NVIC_Init(&NVIC_InitStructure); //开启TIM2,此时计数器开始工作 TIM_Cmd(TIM2, ENABLE); }
- Timer.h文件内容如下
#ifndef __TIMER_H #define __TIMER_H #include "stm32f4xx.h" // Device header void Timer_Init(void); #endif