龙芯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查看,谢谢!