AI嵌入式K210项目(7)-定时器


前言

本章简单介绍下K210定时器的使用,实现LED灯定时闪烁的小实验;


一、什么是定时器?

简单的说,定时器其实是加1计数器,对机器周期进行计数,每过一个机器周期,计数器自动加1,直到计数器计满溢出。由于计数的周期是固定的,所以根据计数的多少就可以很方便的计算出计数的时间,当符合自己设定的超时时间,则调用中断回调函数,然后重新开始计数。

但是定时器有很多种类,可以参考我的这篇博客 STM32开发(10)----CubeMX配置基本定时器

二、K210的timer

K210芯片定时器总共有3个,每个定时器有4路通道。每个定时器可以设置触发间隔,和定时器中断处理函数。
TIMER 模块具有以下功能:
• 启用或禁用定时器
• 配置定时器触发间隔
• 配置定时器触发处理程序

对应的头文件 timer.h
为用户提供以下接口
• timer_init
• timer_set_interval
• timer_set_irq (0.6.0 后不再支持,请使用 timer_irq_register)
• timer_set_enable
• timer_irq_register
• timer_irq_deregister
为了实现这个实验,还需要看下RGB灯的连接,可以看到他们分别连接到了IO12-IO14上,不同的IO控制不同颜色的灯,设置IO为输出模式,当IO设置为高电平时,对应的灯熄灭,当IO设置为低电平时,对应的灯点亮;
在这里插入图片描述

实验过程

新建一个timer的文件夹,在里面新建main.c
>代码如下(示例):

#include "fpioa.h"
#include "sleep.h"
#include "gpio.h"
#include "sysctl.h"
#include "plic.h"
#include "timer.h"
/*****************************HARDWARE-PIN*********************************/
// 硬件IO口,与原理图对应
#define PIN_RGB_R             (12)
/*****************************SOFTWARE-GPIO********************************/
// 软件GPIO口,与程序对应
#define RGB_R_GPIONUM          (0)

/*****************************FUNC-GPIO************************************/
// GPIO口的功能,绑定到硬件IO口
#define FUNC_RGB_R             (FUNC_GPIO0 + RGB_R_GPIONUM)
uint32_t g_count;
void hardware_init(void)
{
    /* fpioa映射 */
    fpioa_set_function(PIN_RGB_R, FUNC_RGB_R);
}

int timer_timeout_cb(void *ctx) {
    uint32_t *tmp = (uint32_t *)(ctx);
    (*tmp)++;
    if ((*tmp)%2)
    {
        gpio_set_pin(RGB_R_GPIONUM,GPIO_PV_HIGH);
    }
    else
    {
        gpio_set_pin(RGB_R_GPIONUM,GPIO_PV_LOW);
    }
    return 0;
}

void init_timer(void) {
    /* 定时器初始化 */
    timer_init(TIMER_DEVICE_0);
    /* 设置定时器超时时间,单位为ns */
    timer_set_interval(TIMER_DEVICE_0, TIMER_CHANNEL_0, 500 * 1e6);
    /* 设置定时器中断回调 */
    timer_irq_register(TIMER_DEVICE_0, TIMER_CHANNEL_0, 0, 1, timer_timeout_cb, &g_count);
    /* 使能定时器 */
    timer_set_enable(TIMER_DEVICE_0, TIMER_CHANNEL_0, 1);
}

int main()
{
        /* 硬件引脚初始化 */
    hardware_init();

    /* 初始化系统中断并使能 */
    plic_init();
    sysctl_enable_irq();

    /* 初始化RGB灯 */
    gpio_set_drive_mode(RGB_R_GPIONUM, GPIO_DM_OUTPUT);
    gpio_set_pin(RGB_R_GPIONUM,GPIO_PV_HIGH);
    init_timer();
    while(1);
    return 0;
}

代码写好后,我们开始编译,注意:如果你编译过程中出现错误,可以先make clean掉之前生成的过程文件,重新生成

cd build
//注意这里的目标文件目录改成gpio,和刚才新建的文件夹名称一致
cmake .. -DPROJ=timer  -G "MinGW Makefiles"
make

烧录
该处使用的url网络请求的数据。
实验结果:可以看到红灯周期闪烁
在这里插入图片描述


总结

本章介绍了K210定时器的使用方法,K210总共有三个定时器,每个定时器有四个通道,定时器可以设置纳秒级别的超时时间,并且可以设置中断回调,定时器可以通过控制使能与禁止的方式来暂停和重新启动,而不需要重新配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶与花语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值