龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库。完整源码请移步到https://gitee.com/caogos/OpenLoongsonLib1c
龙芯1c库中硬件定时器接口使用示例
封装的接口函数简介
首先来看看有哪些接口,如下
// 硬件定时器
typedef enum
{
TIMER_PWM0, // PWM0用作硬件定时器
TIMER_PWM1, // PWM1用作硬件定时器
TIMER_PWM2, // PWM2用作硬件定时器
TIMER_PWM3 // PWM3用作硬件定时器
}ls1c_timer_t;
// 硬件定时器信息
typedef struct
{
ls1c_timer_t timer; // 硬件定时器
unsigned long time_ns; // 定时时间
}timer_info_t;
/*
* 初始化定时器,并开始定时
* @timer_info 定时器和定时时间信息
*/
void timer_init(timer_info_t *timer_info);
/*
* 停止定时器
* @timer_info 定时器
*/
void timer_stop(timer_info_t *timer_info);
/*
* 重启定时器
* @timer_info 定时器
*/
void inline timer_restart(timer_info_t *timer_info);
每个函数都有个参数“timer_info_t *timer_info”,先来说说这个参数。参数类型“timer_info_t”是一个结构体,里面有两个成员,一个是指那个硬件定时器,另外一个是指定时器超时时间。
目前是把龙芯1C上的4个硬件PWM用作硬件定时器,即硬件PWM和硬件定时器的区别是,硬件PWM要输出pwm波形,可以不使用中断,而硬件定时器不输出波形(不占用IO资源),需要使用中断。
除了前面提到的三个函数timer_init(),timer_stop()和timer_restart()之外,还有中断相关的两个函数irq_install(),irq_enable()。有了这几个函数就可以实现硬件定时器了。
伪代码如下
调用timer_init()初始化定时器,调用irq_install()设置中断处理函数,然后调用irq_enable()使能中断即可,这时硬件定时器就已经跑起来了。
如果只需要一次定时,那么需要在中断处理函数中,调用timer_stop(),;如果需要重复定时,那么需要在中断处理函数中,调用timer_restart()。记住在不再需要定时器(产生中断)时,一定要调用timer_stop()来停止定时器,不论是单次定时,还是多次循环定时。
把伪代码转换为真实的代码如下
// 测试硬件定时器的源文件
#include "../lib/ls1c_timer.h"
#include "../lib/ls1c_gpio.h"
#include "../lib/ls1c_delay.h"
#include "../lib/ls1c_irq.h"
timer_info_t timer_info = {0};
// 中断计数器
volatile int test_timer_pwm0_irq_counter = 0;
/*
* 定时器0的中断处理函数
* @IRQn 中断号
* @param 参数
*/
void test_timer_pwm0_irqhandler(int IRQn, void *param)
{
// 重启定时器
timer_restart(&timer_info);
// 计数器加一
test_timer_pwm0_irq_counter++;