Maix Bit(K210) 裸机开发教程(三) 定时的使用
定时器(TIMER)K210有3个,每个定时器有4个通道。实现使用定时控制RGB LED灯循环闪烁。
TIMER有如下功能:
启动或者禁用定时器 配置定时器触发间隔 配置定时器触发处理程序
1、常用API
定时器初始化:
timer_init(timer_device_number_t timer_number)
设置定时器参数:
timer_set_interval(timer_device_number_t timer_number, timer_channel_number_t channel, size_t nanoseconds)
设置定时器触发中断回调函数:
timer_irq_register(timer_device_number_t device, timer_channel_number_t channel, int is_single_shot, uint32_t priority, timer_callback_t callback, void *ctx)
使能或者禁用定时器:
timer_set_enable(timer_device_number_t timer_number, timer_channel_number_t channel, uint32_t enable)
2 代码
#include <fpioa.h>
#include <plic.h>
#include <stdio.h>
#include <sysctl.h>
#include <timer.h>
#include "gpio.h"
static int flag = 0;
/* 定时器0 通道0 定时1秒 打印 */
int timer_callback_led(int i) {
printf("Time %d timer_channel %d ", i, 0);
flag++;
if (flag == 1) {
printf(" LED G
");
gpio_set_pin(3, GPIO_PV_LOW);
gpio_set_pin(4, GPIO_PV_HIGH);
gpio_set_pin(5, GPIO_PV_HIGH);
} else if (flag == 2) {
printf(" LED R
");
gpio_set_pin(3, GPIO_PV_HIGH);
gpio_set_pin(4, GPIO_PV_LOW);
gpio_set_pin(5, GPIO_PV_HIGH);
} else if (flag == 3) {
printf(" LED B
");
gpio_set_pin(3, GPIO_PV_HIGH);
gpio_set_pin(4, GPIO_PV_HIGH);
gpio_set_pin(5, GPIO_PV_LOW);
flag = 0;
}
}
void led_init(void) {
gpio_init(); //初始化GPIO
fpioa_set_function(12, FUNC_GPIO3); //管脚映射
fpioa_set_function(13, FUNC_GPIO4);
fpioa_set_function(14, FUNC_GPIO5);
gpio_set_drive_mode(3, GPIO_DM_OUTPUT); //设置GPIO驱动模式
gpio_set_drive_mode(4, GPIO_DM_OUTPUT);
gpio_set_drive_mode(5, GPIO_DM_OUTPUT);
gpio_set_pin(3, GPIO_PV_LOW); //低电平
gpio_set_pin(4, GPIO_PV_LOW);
gpio_set_pin(5, GPIO_PV_LOW);
}
int main(void) {
plic_init();
led_init();
timer_init(TIMER_DEVICE_0); //初始化定时器
printf("Start Timer
");
timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0,
1e9); //设定定时间隔 时间间隔 纳秒
timer_irq_register(TIMER_DEVICE_0, TIMER_CHANNEL_0, 0, 1, timer_callback_led,
0);
//这个函数已经被废弃
// timer_set_irq(TIMER_DEVICE_0, TIMER_CHANNEL_0, irq_time,1);
timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0,
1); //使能定时器 0禁用 1使能
sysctl_enable_irq();
while (1) {
/* code */
}
return 0;
}
