笔记:
外部时钟模式1的输入可以是ETR引脚、其它定时器(用于定时器的级联)、(CH1引脚的边沿、CH1引脚和CH2引脚(用于输入捕获和测频率时))。一般情况下,外部时钟通过ETR引脚模式2即可。
****TIM2定时器外部中断初始化**** ___ ___ ___ ___ ___ ___ | | | | | | | | | | | | | |-------->| |-------->| |---------->| |--------->| |-------->| | |___| |___| |___| |___| |___| |___| GPIO ETR外部时钟 外部时钟模式2 时基单元 中断控制输出 NVIC 程序配置流程图 void Timer_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //TIM2是APB1总线外设 //外部中断初始化**// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ETR是APB2总线外设 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, 0x00); //通过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; //自动重装值,计数器计满后申请中断 TIM_TimeBaseInitStructure.TIM_Prescaler = 1 - 1; //预分频值、手动分频不需要预分频,预分频器和计数器都有1个数的偏差 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; //重复计数器设置,是高级定时器才有的。不用的话可以赋0 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //初始化时基单元 TIM_ClearFlag(TIM2, TIM_FLAG_Update); //手动清除更新标志位,能避免刚初始化完就进中断的问题 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //更新中断到NVIC的通路 *****打通中断通道***** NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //定时器2在NVIC里的通道 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级 NVIC_Init(&NVIC_InitStructure); *****启动定时器***** TIM_Cmd(TIM2, ENABLE); }