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;
}
经验分享 程序员 微信小程序 职场和发展