653浏览
查看: 653|回复: 0

[官方教程] K210入门-裸机开发(五)之定时器TIMER定时

[复制链接]
本帖最后由 猪百岁 于 2021-3-9 17:38 编辑

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

开发板:K210 AIRV R3版 widora

开发环境:kendryte IDE 官方的

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

1.新建文件夹05my_code_timer

TueMarch-202103092441..png

礼物 + 地球

TueMarch-202103092246..png

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

TueMarch-202103097538..png

老规矩 安装依赖

TueMarch-202103093299..png

清理+ 构建

TueMarch-202103093860..png

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

2.修改代码

定时器在第18章

TueMarch-202103098293..png

TueMarch-202103099121..png

文档中有举例 等下就抄

TueMarch-202103091338..png

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

发现LED对应IO17和18

TueMarch-202103096069..png

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

TueMarch-202103096180..png

TueMarch-202103099051..png

初始化定时器

TueMarch-202103099817..png

TueMarch-202103092306..png

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

TueMarch-202103094236..png

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

TueMarch-202103094396..png

TueMarch-202103092013..png
设置时间间隔 (配置定时器)

TueMarch-202103094118..png

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

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

TueMarch-202103092966..png

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

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

TueMarch-202103095738..png

注册以及配置中断

TueMarch-202103094012..png

TueMarch-202103099907..png

使能定时器

TueMarch-202103093535..png

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

TueMarch-202103092123..png
都写好之后 把总中断打开

TueMarch-202103092973..png

然后补充一下LED灯的配置

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

TueMarch-202103097787..png

TueMarch-202103093761..png

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

TueMarch-202103098263..png

下面写定时器中断函数

TueMarch-202103095538..png

200ms翻转LED1

500ms翻转LED2

TueMarch-202103094646..png

TueMarch-202103092980..png

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

插上开发板 一条龙服务

清理+构建+下载

TueMarch-202103093747..png

效果

TueMarch-202103092492..png

就是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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail