回答

收藏

[评测分享] 【TL7218X开发板】定时器

#板卡评测 #板卡评测 1028 人阅读 | 0 人回复 | 2025-03-10

一.导入工程,打开定时器例程
二.主程序
?  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闪烁一次,由于不能上场视频,留两张图



分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

267 积分
4 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条