K210入门-裸机开发(五)之定时器TIMER定时

开发板:K210 AIRV R3版 widora

开发环境:kendryte IDE 官方的

必须的参考文档:Standalone SDK编程指南v0.5.0,以及widora的原理图

(一) 新建文件夹05my_code_timer

礼物 + 地球

实例 -> 搜索timer 选择开发版本(develop) 然后下载到刚才的文件夹中

老规矩 安装依赖

清理+ 构建

环境搭建完成 下面开始改代码

(二) 修改代码

定时器在第18章

文档中有举例 等下就抄

要用到LED灯,同样查看开发板原理图

发现LED对应IO17和18

下面开始说代码  初始化中断

初始化定时器

看下这个参数怎么填 右键函数名称 跳到定义

有3个定时器 我用定时器0 复制TIMER_DEVICE_0过去

设置时间间隔 (配置定时器)

参数一,填刚才的定时器0(TIMER_DEVICE_0)

参数二 他这里有4个通道,我萌新 不知道什么意思,填通道0试试

参数 3 填定时时间, 单位他写的是ns(纳秒)

我这里定时1ms =1000us = 1000 000ns

注册以及配置中断

使能定时器

参数1 填定时器几, 参数2填定时器的通道, 参数3 是否使能

都写好之后 把总中断打开

然后补充一下LED灯的配置

添加头文件 #include "gpio.h" ,然后安装依赖 -> 清理 + 构建

然后加上之前学的LED配置代码

下面写定时器中断函数

200ms翻转LED1

500ms翻转LED2

两个flag的作用域不同,不会影响

插上开发板 一条龙服务 

清理+构建+下载

效果

就是2个LED闪烁呗(周期不同) 还能有什么效果

 

定时器中断学习完毕, 下次再见

 

代码

#include <fpioa.h>
#include <plic.h>
#include <pwm.h>
#include <stdio.h>
#include <sysctl.h>
#include <syslog.h>
#include <timer.h>

#include "gpio.h"

int timer_callback(void)  // 1ms来一次
{
  static uint16_t flag200ms = 0;
  static uint16_t flag500ms = 0;

  if (++flag200ms == 200) {
    static uint8_t flag = 0;
    if (flag)
      gpio_set_pin(0, GPIO_PV_LOW);  // LED0
    else
      gpio_set_pin(0, GPIO_PV_HIGH);

    flag200ms = 0;
    flag = !flag;
  }

  if (++flag500ms == 500) {
    static uint8_t flag = 0;
    if (flag)
      gpio_set_pin(1, GPIO_PV_LOW);  // LED1
    else
      gpio_set_pin(1, GPIO_PV_HIGH);

    flag500ms = 0;
    flag = !flag;
  }
}

int main(void) {
  /* Init Platform-Level Interrupt Controller(PLIC) */
  // 初始化中断模块
  plic_init();

  gpio_init();
  fpioa_set_function(17, FUNC_GPIO0);
  fpioa_set_function(18, FUNC_GPIO1);
  gpio_set_drive_mode(0, GPIO_DM_OUTPUT);
  gpio_set_drive_mode(1, GPIO_DM_OUTPUT);
  gpio_set_pin(0, GPIO_PV_LOW);  // 熄灭LED
  gpio_set_pin(1, GPIO_PV_LOW);

  timer_init(TIMER_DEVICE_0);  //定时器0
  // 参数1 定时器0, 参数2定时器通道,参数3 定时时间(纳秒)
  timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1000000);
  // 定时器0, 通道0,定时器回调函数,优先级
  timer_set_irq(TIMER_DEVICE_0, TIMER_CHANNEL_0, timer_callback, 1);
  // 定时器0, 通道0, 使能(1)/失效(0)
  timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1);

  sysctl_enable_irq();

  while (1)  // 等待中断
    ;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值