//main.c
#include <rthw.h>
#include <stdio.h>
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"
#include "gd32f3x0.h"
/* defined the LED2 pin: PC6 */
#define LED1_PIN GET_PIN(B, 1)
#define LED2_PIN GET_PIN(B, 2)
#define delay_ms(x) rt_thread_mdelay(x)
#define RT_USR1_THREAD_PRIO 6
#define USR1_THREAD_NAME "usr1"
static struct rt_thread usr1_thread;
static rt_uint8_t usr1_thread_stack[500];
void rt_thread_usr1_entry(void *parameter)
{
/* set LED2 pin mode to output */
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED2_PIN, PIN_HIGH);
rt_thread_mdelay(2000);
rt_pin_write(LED2_PIN, PIN_LOW);
rt_thread_mdelay(3000);
}
}
void keyscan_init(void);
int main(void)
{
keyscan_init();
rt_thread_init(&usr1_thread,
USR1_THREAD_NAME,
rt_thread_usr1_entry,
RT_NULL,
&usr1_thread_stack[0],
sizeof(usr1_thread_stack),
RT_USR1_THREAD_PRIO,
20);
rt_thread_startup(&usr1_thread);
/* set LED1 pin mode to output */
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
while (1)
{
rt_pin_write(LED1_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_mdelay(600);
}
}
//usrtimer.c
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_gpio.h"
/* 定时器的控制块 */
static struct rt_timer timer1;
static struct rt_timer timer2;
static struct rt_timer timer3;
static int cnt = 0;
#define KEY1_PIN GET_PIN(C, 11)
static uint8_t keyVal = 0;
/* 定时器 1 超时函数 */
static void timeout1(void* parameter)
{
rt_kprintf("periodic timer is timeout\n");
/* 运行 10 次 */
if (cnt++>= 9)
{
rt_timer_stop(&timer1);
}
}
/* 定时器 2 超时函数 */
static void timeout2(void* parameter)
{
rt_kprintf("one shot timer is timeout\n");
}
static void keyscan(void* parameter)
{
static uint8_t i = 0;
uint8_t val;
val = rt_pin_read(KEY1_PIN);
if(val == 0)
{
if(i < 200)
{
i ++;
}
}
else
{
if(i >= 2)
{
keyVal = 1;
rt_kprintf("key press val is %d\n",keyVal);
keyVal = 0;
}
i = 0;
}
}
int timer_static_sample(void)
{
/* 初始化定时器 */
rt_timer_init(&timer1,
"timer1", /* 定时器名字是 timer1 */
timeout1, /* 超时时回调的处理函数 */
RT_NULL, /* 超时函数的入口参数 */
100, /* 定时长度,以 OS Tick 为单位,即 10 个 OS Tick */
RT_TIMER_FLAG_PERIODIC); /* 周期性定时器 */
rt_timer_init(&timer2,
"timer2", /* 定时器名字是 timer2 */
timeout2, /* 超时时回调的处理函数 */
RT_NULL, /* 超时函数的入口参数 */
300, /* 定时长度为 30 个 OS Tick */
RT_TIMER_FLAG_ONE_SHOT); /* 单次定时器 */
/* 启动定时器 */
rt_timer_start(&timer1);
rt_timer_start(&timer2);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(timer_static_sample, timer_static sample);
void keyscan_init(void)
{
rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT);
rt_timer_init(&timer3,
"timerKeyscan", /* 定时器名字是 timer2 */
keyscan, /* 超时时回调的处理函数 */
RT_NULL, /* 超时函数的入口参数 */
5, /* 定时长度为 5 个 OS Tick */
RT_TIMER_FLAG_PERIODIC); /* 单次定时器 */
rt_timer_start(&timer3);
}
按下按键1,串口输出