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; }