|
一.导入工程,打开定时器例程 二.主程序 ? 1.初始化平台 (PLATFORM_INIT) 2.初始化时钟 (CLOCK_INIT) ? 3.调用user_init() 进行用户自定义初始化 ? 4.进入while (1) 无限循环,调用 main_loop() 处理主逻辑 ? 5.return0; 结束 main 函数 3.程序解析 void user_init(void) { // 启用 LED 引脚的 GPIO 功能 gpio_function_en(LED1); gpio_function_en(LED2); gpio_function_en(LED3); gpio_function_en(LED4);
// 设置 LED 引脚为输出模式 gpio_output_en(LED1); gpio_output_en(LED2); gpio_output_en(LED3); gpio_output_en(LED4);
// 校准 24MHz RC 振荡器 clock_cal_24m_rc();
#if (TIMER_MODE == TIMER_SYS_CLOCK_MODE) // 使能 TIMER0 和 TIMER1 的中断 plic_interrupt_enable(IRQ_TIMER0); plic_interrupt_enable(IRQ_TIMER1);
// 使能内核中断 core_interrupt_enable();
// 设置 TIMER0 和 TIMER1 初始计数值 timer_set_init_tick(TIMER0, 0); timer_set_cap_tick(TIMER0, 500 * sys_clk.pclk * 1000); // 500ms timer_set_init_tick(TIMER1, 0); timer_set_cap_tick(TIMER1, 500 * sys_clk.pclk * 1000); // 500ms
// 配置定时器模式 timer_set_mode(TIMER0, TIMER_MODE_SYSCLK); timer_set_mode(TIMER1, TIMER_MODE_SYSCLK);
#if defined(MCU_CORE_TL721X) || defined(MCU_CORE_TL321X) || defined(MCU_CORE_TL322X) // 使能定时器中断掩码 timer_set_irq_mask(FLD_TMR0_MODE_IRQ); timer_set_irq_mask(FLD_TMR1_MODE_IRQ); #endif
// 启动定时器 timer_start(TIMER1); timer_start(TIMER0);
#elif (TIMER_MODE == TIMER_GPIO_TRIGGER_MODE) // 使能内核和定时器中断 core_interrupt_enable(); plic_interrupt_enable(IRQ_TIMER0); plic_interrupt_enable(IRQ_TIMER1);
// 使能 GPIO 触发引脚功能,并设置为输出模式 gpio_function_en(TIMER0_TRIG_PIN | TIMER1_TRIG_PIN); gpio_output_en(TIMER0_TRIG_PIN | TIMER1_TRIG_PIN); gpio_set_low_level(TIMER0_TRIG_PIN | TIMER1_TRIG_PIN);
// 配置 TIMER0 为 GPIO 触发模式,触发方式为上升沿 timer_gpio_init(TIMER0, TIMER0_GPIO, POL_RISING); timer_set_init_tick(TIMER0, 0); timer_set_cap_tick(TIMER0, TIMER_MODE_GPIO_TRIGGER_TICK); timer_set_mode(TIMER0, TIMER_MODE_GPIO_TRIGGER);
#if defined(MCU_CORE_TL721X) || defined(MCU_CORE_TL321X) || defined(MCU_CORE_TL322X) timer_set_irq_mask(FLD_TMR0_MODE_IRQ); #endif
timer_start(TIMER0);
// 配置 TIMER1 为 GPIO 触发模式,触发方式为上升沿 timer_gpio_init(TIMER1, TIMER1_GPIO, POL_RISING); timer_set_init_tick(TIMER1, 0); timer_set_cap_tick(TIMER1, TIMER_MODE_GPIO_TRIGGER_TICK); timer_set_mode(TIMER1, TIMER_MODE_GPIO_TRIGGER);
#if defined(MCU_CORE_TL721X) || defined(MCU_CORE_TL321X) || defined(MCU_CORE_TL322X) timer_set_irq_mask(FLD_TMR1_MODE_IRQ); #endif
timer_start(TIMER1);
#endif }
void main_loop(void) { #if (TIMER_MODE == TIMER_GPIO_TRIGGER_MODE) // 切换 GPIO 触发引脚的电平 gpio_toggle(TIMER0_TRIG_PIN); gpio_toggle(TIMER1_TRIG_PIN);
#elif (TIMER_MODE == TIMER_TICK_MODE) // 监测 TIMER0 计时器是否达到 500ms if (timer0_get_tick() > 500 * sys_clk.pclk * 1000) { timer0_set_tick(0); // 复位计时器 gpio_toggle(LED2); // 切换 LED2 状态 gpio_toggle(LED3); // 切换 LED3 状态 } // 监测 TIMER1 计时器是否达到 500ms if (timer1_get_tick() > 500 * sys_clk.pclk * 1000) { timer1_set_tick(0); // 复位计时器 gpio_toggle(LED4); // 切换 LED4 状态 } #endif } 最终得到3个led每500ms闪烁一次,由于不能上场视频,留两张图
|