江科大-定时器中断定时器外部时钟

📅 2026/7/13 3:16:32
江科大-定时器中断定时器外部时钟
1.时钟源选择void TIM_InternalClockConfig(TIM_TypeDef* TIMx);void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler,uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);2.时基单元void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);3.中断输出控制void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);4.NVICNVIC_Init函数5.运行控制void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);6.简单配置的函数1.写预分频值void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);2.用来改变计数器的计数模式void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);3.自动重装器预装功能配置void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);4.给寄存器写入一个值void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);5.给自动重装器写入一个值void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);6.查看当前计数器的值uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);7.获取当前预分频器的值uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);8.获取标志位和清除标志位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#include stm32f10x.h // Device header void Timer_init(void){ //内部时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); TIM_InternalClockConfig(TIM2);//定时器默认配置的是内部时钟不写也行 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; TIM_TimeBaseInitStruct.TIM_ClockDivisionTIM_CKD_DIV1 ; TIM_TimeBaseInitStruct.TIM_CounterModeTIM_CounterMode_Up ; TIM_TimeBaseInitStruct.TIM_Period10000-1; TIM_TimeBaseInitStruct.TIM_Prescaler7200-1; TIM_TimeBaseInitStruct.TIM_RepetitionCounter0; 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_IRQChannelTIM2_IRQn; NVIC_InitStruct.NVIC_IRQChannelCmdENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority2; NVIC_InitStruct.NVIC_IRQChannelSubPriority1; NVIC_Init(NVIC_InitStruct); //启动定时器 TIM_Cmd(TIM2,ENABLE); }TIM_TimeBaseInitStruct.TIM_Period10000-1;TIM_TimeBaseInitStruct.TIM_Prescaler7200-1;timer.h#ifndef __TIMER_H #define __TIMER_H void Timer_init(void); #endifmian.c#include stm32f10x.h #include OLED.h #include Delay.h //需自带延时库若无可自行添加简单延时函数 #include OLED_font.h #include Timer.h uint16_t Num; int main(void) { // OLED初始化 OLED_Init(); Timer_init(); // 显示固定文字 OLED_ShowString(1, 1, NUM:); while(1) { OLED_ShowNum(1,5,Num,5); } } void TIM2_IRQHandler(void){ if(TIM_GetITStatus(TIM2,TIM_IT_Update)SET){ Num; TIM_ClearITPendingBit(TIM2,TIM_IT_Update); } }修仙一途道阻且长共勉