#include 'gd32e23x.h'

void timer2_init(void) { /* 选择时钟源为 APB1 时钟的 2 倍 */ rcu_periph_clock_enable(RCU_TIMER2); timer_ck_div_config(TIMER2, TIMER_CKDIV_PRESCALER_DIV2);

/* 配置定时器 2 为定时器模式 */
timer_mode_set(TIMER2, TIMER_MODE_TIMER);

/* 设置定时器 2 的周期为 1ms */
timer_autoreload_value_config(TIMER2, 71999);

/* 使能定时器 2 更新事件中断 */
timer_interrupt_enable(TIMER2, TIMER_INT_UP);

/* 使能定时器 2 */
timer_enable(TIMER2);

}

void timer2_irq_handler(void) { /* 清除定时器 2 更新事件中断标志位 */ timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);

/* 在此处编写定时器 2 中断服务程序 */

}

int main(void) { /* 初始化定时器 2 */ timer2_init();

while(1)
{
    /* 在此处编写主程序 */
}

}

在该示例代码中,我们首先调用 timer2_init() 函数来初始化定时器 2。在函数中,我们首先使能了定时器 2 的时钟,并设置定时器时钟分频为 APB1 时钟的 2 倍。然后,我们将定时器 2 配置为定时器模式,并设置定时器的周期为 1ms。最后,我们使能了定时器 2 更新事件中断,并启动了定时器 2。

在主程序中,我们可以编写需要定时执行的任务,例如:

void timer2_irq_handler(void)
{
    /* 清除定时器 2 更新事件中断标志位 */
    timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);

    /* 在此处编写定时器 2 中断服务程序 */

    /* 定时执行的任务 */
    task();
}

void task(void)
{
    static int count = 0;

    count++;

    if(count >= 1000)
    {
        /* 每隔 1s 执行一次的任务 */
        do_something();

        count = 0;
    }
}

在定时器 2 的中断服务程序中,我们首先清除定时器 2 更新事件中断标志位,然后调用需要定时执行的任务函数 task()。在 task() 函数中,我们设置了一个静态计数器 count,每次定时器 2 中断时对计数器加 1,当计数器达到 1000 时,执行需要每隔 1s 执行一次的任务 do_something(),并将计数器清零。

注意,定时器 2 的中断服务程序需要在 nvic_priority_group_set() 函数中设置中断优先级,并在 nvic_enable_irq() 函数中使能中断。在本示例中,我们可以在 main() 函数中添加以下代码:

nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_enable_irq(TIMER2_IRQn);

其中,NVIC_PRIGROUP_PRE2_SUB2 表示中断优先级分组为 2 位抢占优先级和 2 位子优先级,TIMER2_IRQn 表示定时器 2 的中断号。

GD32E230C8T6 使用 72M 系统晶振实现定时器 2 定时 1ms 代码示例

原文地址: http://www.cveoy.top/t/topic/nsYG 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录