本章简单介绍下K210定时器的使用,实现LED灯定时闪烁的小实验;
简单的说,定时器其实是加1计数器,对机器周期进行计数,每过一个机器周期,计数器自动加1,直到计数器计满溢出。由于计数的周期是固定的,所以根据计数的多少就可以很方便的计算出计数的时间,当符合自己设定的超时时间,则调用中断回调函数,然后重新开始计数。
但是定时器有很多种类,可以参考我的这篇博客 STM32开发(10)----CubeMX配置基本定时器
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
烧录
实验结果:可以看到红灯周期闪烁
本章介绍了K210定时器的使用方法,K210总共有三个定时器,每个定时器有四个通道,定时器可以设置纳秒级别的超时时间,并且可以设置中断回调,定时器可以通过控制使能与禁止的方式来暂停和重新启动,而不需要重新配置。