/** * @file Timer.cpp * @brief 用户定时器初始化与中断处理实现。 */ #include "main.h" #include "device/Timer.h" #include "sys/task_manager.h" #include "sys/config.h" /** * @brief 配置定时器 2 参数:180MHz / 180 / 100 → 100us 中断周期。 */ static void timer2_config(void) { timer_parameter_struct timer_initpara; rcu_periph_clock_enable(CONFIG_SCHED_TIMER_RCU); timer_deinit(CONFIG_SCHED_TIMER_INSTANCE); timer_struct_para_init(&timer_initpara); timer_initpara.prescaler = CONFIG_SCHED_TIMER_PRESCALER; timer_initpara.alignedmode = TIMER_COUNTER_EDGE; timer_initpara.counterdirection = TIMER_COUNTER_UP; timer_initpara.period = CONFIG_SCHED_TIMER_PERIOD; timer_initpara.clockdivision = TIMER_CKDIV_DIV1; timer_init(CONFIG_SCHED_TIMER_INSTANCE, &timer_initpara); timer_interrupt_flag_clear(CONFIG_SCHED_TIMER_INSTANCE, TIMER_INT_FLAG_UP); timer_interrupt_enable(CONFIG_SCHED_TIMER_INSTANCE, TIMER_INT_UP); timer_enable(CONFIG_SCHED_TIMER_INSTANCE); } /** * @brief 配置定时器 2 的中断优先级并使能中断。 */ static void timer2_nvic_config(void) { nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2); nvic_irq_enable(CONFIG_SCHED_TIMER_IRQn, CONFIG_SCHED_TIMER_IRQ_PREEMPT_PRIO, CONFIG_SCHED_TIMER_IRQ_SUB_PRIO); } /** * @brief 初始化用户定时器及其中断配置。 * @note 当前用于建立 100us 基准节拍,驱动任务调度器时基。 */ void user_timer_init(void) { timer2_config(); timer2_nvic_config(); } /** * @brief 定时器 2 中断服务例程。 * @note 每次计数溢出时清除标志并推进一次 100us 任务调度节拍。 */ void TIMER2_IRQHandler(void) { if(timer_interrupt_flag_get(CONFIG_SCHED_TIMER_INSTANCE, TIMER_INT_FLAG_UP) == RESET) { return; } timer_interrupt_flag_clear(CONFIG_SCHED_TIMER_INSTANCE, TIMER_INT_FLAG_UP); task_manager_tick_100us(); }