猪百岁 发表于 2021-3-9 17:38:31

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

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

**开发板:K210 AIRV R3版 widora**

**开发环境:kendryte IDE 官方的**

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

### 1.新建文件夹05my_code_timer



礼物 + 地球



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



老规矩 安装依赖



清理+ 构建



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

### 2.修改代码

定时器在第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)// 等待中断
    ;
}
```

---
版权声明:本文为CSDN博主「jwdeng1995」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jwdeng1995/article/details/108032724
页: [1]
查看完整版本: K210入门-裸机开发(五)之定时器TIMER定时