用龙芯1c库在裸机编程环境中实现硬件定时器中断

龙芯1c库是为龙芯1c单片机封装的常用外设接口集合,类似于STM32库。不仅可以用于裸机编程,还可以和实时系统(比如RT-Thread等)配合使用。这里就是讨论如何龙芯1c库实现硬件定时器中断,龙芯1c库的完整的代码在https://gitee.com/caogos/OpenLoongsonLib1c

在裸机编程中和实时系统RT-Thread中类似,《用龙芯1c库在RT-Thread下实现硬件定时器中断》http://blog.csdn.net/caogos/article/details/75356294

测试思路

将龙芯1c的PWM0用作定时器,定时时间为100ms,用一个变量对中断次数进行计数,中断处理函数中对计数变量加一,并停止定时器。Main()函数中每间隔1s将变量打印出来,并重启定时器。

主要代码

// 中断计数器
volatile int test_timer_pwm0_irq_counter = 0;

/*
 * 定时器0的中断处理函数
 * @IRQn 中断号
 * @param 参数
 */
void test_timer_pwm0_irqhandler(int IRQn, void *param)
{
    timer_info_t timer_info = {0};
    
    // 计数器加一
    test_timer_pwm0_irq_counter++;

    timer_info.timer    = TIMER_PWM0;
    timer_info.time_ns  = 100*1000*1000;
    timer_stop(&timer_info);

    return ;
}



// 测试硬件定时器的中断
void test_timer_irq(void)
{
    timer_info_t timer_info = {0};

    // 初始化定时器
    timer_info.timer    = TIMER_PWM0;
    timer_info.time_ns  = 100*1000*1000;        // 100ms
    timer_init(&timer_info);

    // 设置中断处理函数,并使能中断
    irq_install(LS1C_PWM0_IRQ, test_timer_pwm0_irqhandler, NULL);
    irq_enable(LS1C_PWM0_IRQ);

    while (1)
    {
        myprintf("[%s] test_timer_pwm0_irq_counter=%d\r\n", 
                  __FUNCTION__, 
                  test_timer_pwm0_irq_counter);

        /*
         * 重启定时器
         * 中断处理函数中已经定时器停止了,
         * 如果需要反复中断的话,需要重启定时器,
         * 可以在中断处理函数中把停止定时器改为重启定时器
         */
        timer_init(&timer_info);
        
        delay_s(1);
    }

    return ;
}

更多更完整的代码,请移步到git查看,谢谢!

测试结果

串口打印






猜你喜欢

转载自blog.csdn.net/caogos/article/details/78166348