单片机 STM32F407开发板DMF407电机开发板平台keil V5.31HSE 为8MHZHSI为16MHZ主函数int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ led_init(); /* 初始化LED */ btim_timx_int_init(5000 - 1, 8400 - 1); /* 10Khz的计数频率计数5K次为500ms */ while (1) { LED0_TOGGLE(); /*LED0(红灯) 翻转*/ delay_ms(200); } }配置#define BTIM_TIMX_INT TIM6 #define BTIM_TIMX_INT_IRQn TIM6_DAC_IRQn #define BTIM_TIMX_INT_IRQHandler TIM6_DAC_IRQHandler #define BTIM_TIMX_INT_CLK_ENABLE() do{ __HAL_RCC_TIM6_CLK_ENABLE(); }while(0) /* TIM6 时钟使能 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) { timx_handler.Instance BTIM_TIMX_INT; /* 定时器X */ timx_handler.Init.Prescaler psc; /* 设置预分频器 */ timx_handler.Init.CounterMode TIM_COUNTERMODE_UP; /* 向上计数器 */ timx_handler.Init.Period arr; /* 自动装载值 */ HAL_TIM_Base_Init(timx_handler); HAL_TIM_Base_Start_IT(timx_handler); /* 使能定时器x和定时器x更新中断 */ } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) { if (htim-Instance BTIM_TIMX_INT) { BTIM_TIMX_INT_CLK_ENABLE(); /* 使能TIM时钟 */ HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 抢占优先级1子优先级3 */ HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn); /* 开启ITM3中断 */ } }中断void BTIM_TIMX_INT_IRQHandler(void) { HAL_TIM_IRQHandler(timx_handler); /* 定时器中断公共处理函数 */ } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance BTIM_TIMX_INT) { LED1_TOGGLE(); /*LED1反转*/ } } void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) { /* Capture compare 1 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) ! RESET) { { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); htim-Channel HAL_TIM_ACTIVE_CHANNEL_1; /* Input capture event */ if ((htim-Instance-CCMR1 TIM_CCMR1_CC1S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } } /* Capture compare 2 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); htim-Channel HAL_TIM_ACTIVE_CHANNEL_2; /* Input capture event */ if ((htim-Instance-CCMR1 TIM_CCMR1_CC2S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } /* Capture compare 3 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); htim-Channel HAL_TIM_ACTIVE_CHANNEL_3; /* Input capture event */ if ((htim-Instance-CCMR2 TIM_CCMR2_CC3S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } /* Capture compare 4 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); htim-Channel HAL_TIM_ACTIVE_CHANNEL_4; /* Input capture event */ if ((htim-Instance-CCMR2 TIM_CCMR2_CC4S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } /* TIM Update event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-PeriodElapsedCallback(htim); #else HAL_TIM_PeriodElapsedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } /* TIM Break input event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-BreakCallback(htim); #else HAL_TIMEx_BreakCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } /* TIM Trigger detection event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-TriggerCallback(htim); #else HAL_TIM_TriggerCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } /* TIM commutation event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-CommutationCallback(htim); #else HAL_TIMEx_CommutCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } }实验结果btim_timx_int_init(5000 - 1, 8400 - 1); /* 10Khz的计数频率计数5K次为500ms */LED1 500ms翻转一次。btim_timx_int_init(50000 - 1, 8400 - 1); /* 10Khz的计数频率计数50K次为5000ms */LED1 5000ms翻转一次。
单片机基本定时器实验
发布时间:2026/6/8 2:11:13
单片机 STM32F407开发板DMF407电机开发板平台keil V5.31HSE 为8MHZHSI为16MHZ主函数int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(336, 8, 2, 7); /* 设置时钟,168Mhz */ delay_init(168); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ led_init(); /* 初始化LED */ btim_timx_int_init(5000 - 1, 8400 - 1); /* 10Khz的计数频率计数5K次为500ms */ while (1) { LED0_TOGGLE(); /*LED0(红灯) 翻转*/ delay_ms(200); } }配置#define BTIM_TIMX_INT TIM6 #define BTIM_TIMX_INT_IRQn TIM6_DAC_IRQn #define BTIM_TIMX_INT_IRQHandler TIM6_DAC_IRQHandler #define BTIM_TIMX_INT_CLK_ENABLE() do{ __HAL_RCC_TIM6_CLK_ENABLE(); }while(0) /* TIM6 时钟使能 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) { timx_handler.Instance BTIM_TIMX_INT; /* 定时器X */ timx_handler.Init.Prescaler psc; /* 设置预分频器 */ timx_handler.Init.CounterMode TIM_COUNTERMODE_UP; /* 向上计数器 */ timx_handler.Init.Period arr; /* 自动装载值 */ HAL_TIM_Base_Init(timx_handler); HAL_TIM_Base_Start_IT(timx_handler); /* 使能定时器x和定时器x更新中断 */ } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) { if (htim-Instance BTIM_TIMX_INT) { BTIM_TIMX_INT_CLK_ENABLE(); /* 使能TIM时钟 */ HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 抢占优先级1子优先级3 */ HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn); /* 开启ITM3中断 */ } }中断void BTIM_TIMX_INT_IRQHandler(void) { HAL_TIM_IRQHandler(timx_handler); /* 定时器中断公共处理函数 */ } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance BTIM_TIMX_INT) { LED1_TOGGLE(); /*LED1反转*/ } } void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) { /* Capture compare 1 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) ! RESET) { { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1); htim-Channel HAL_TIM_ACTIVE_CHANNEL_1; /* Input capture event */ if ((htim-Instance-CCMR1 TIM_CCMR1_CC1S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } } /* Capture compare 2 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2); htim-Channel HAL_TIM_ACTIVE_CHANNEL_2; /* Input capture event */ if ((htim-Instance-CCMR1 TIM_CCMR1_CC2S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } /* Capture compare 3 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3); htim-Channel HAL_TIM_ACTIVE_CHANNEL_3; /* Input capture event */ if ((htim-Instance-CCMR2 TIM_CCMR2_CC3S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } /* Capture compare 4 event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); htim-Channel HAL_TIM_ACTIVE_CHANNEL_4; /* Input capture event */ if ((htim-Instance-CCMR2 TIM_CCMR2_CC4S) ! 0x00U) { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-IC_CaptureCallback(htim); #else HAL_TIM_IC_CaptureCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } /* Output compare event */ else { #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-OC_DelayElapsedCallback(htim); htim-PWM_PulseFinishedCallback(htim); #else HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } htim-Channel HAL_TIM_ACTIVE_CHANNEL_CLEARED; } } /* TIM Update event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-PeriodElapsedCallback(htim); #else HAL_TIM_PeriodElapsedCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } /* TIM Break input event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-BreakCallback(htim); #else HAL_TIMEx_BreakCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } /* TIM Trigger detection event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-TriggerCallback(htim); #else HAL_TIM_TriggerCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } /* TIM commutation event */ if (__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) ! RESET) { if (__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) ! RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM); #if (USE_HAL_TIM_REGISTER_CALLBACKS 1) htim-CommutationCallback(htim); #else HAL_TIMEx_CommutCallback(htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ } } }实验结果btim_timx_int_init(5000 - 1, 8400 - 1); /* 10Khz的计数频率计数5K次为500ms */LED1 500ms翻转一次。btim_timx_int_init(50000 - 1, 8400 - 1); /* 10Khz的计数频率计数50K次为5000ms */LED1 5000ms翻转一次。