添加 I/O 口的端口根据开发板管脚分配表,可以知道 LED1 和 LED2 分别接在 E11 和 E12,五向开关的上下左右分别是 E1、E2、D6、E3。
在main.c中添加如下代码:
/*Global Variable */
#define LED1_PIN GET_PIN(E,11)
#define LED2_PIN GET_PIN(E,12)
#define UP_PIN GET_PIN(E,1)
#define DOWN_PIN GET_PIN(E,2)
#define LEFT_PIN GET_PIN(D,6)
#define RIGHT_PIN GET_PIN(E,3)
创建两个全局变量用来控制灯的延时时间,初始化为 500ms,代码如下:
/* Global Variable */
rt_uint32_t led1time = 500;
rt_uint32_t led2time = 500;
创建静态线程
由于系统里 main
也是一个线程,让 main
作为 LED1 灯的闪烁线程,还需要新建两个线程分别是 LED2 闪烁线程和按键扫描线程。
在 main()
函数里添加新建按键线程:
int main(void)
{
rt_kprintf("MCU: CH32V307\n");
rt_kprintf("SysClk: %dHz\n",SystemCoreClock);
rt_kprintf("www.wch.cn\n");
rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); //设置LED2端口为输出
rt_thread_init(&SW_thread, //线程控制块
"SW", //线程名称
SW_thread_entry, //线程入口函数
RT_NULL, //线程入口函数参数
&SW_stack[0], //线程栈起始地址
sizeof(SW_stack), //线程栈大小
4, //线程优先级
20); //线程时间片
rt_thread_startup(&SW_thread); //线程启动
rt_thread_init(&LED1_thread, //线程控制块
"LED1", //线程名称
led1_thread_entry, //线程入口函数
RT_NULL, //线程入口函数参数
&LED1_stack[0], //线程栈起始地址
sizeof(LED1_stack), //线程栈大小
13, //线程优先级
20); //线程时间片
rt_thread_startup(&LED1_thread); //线程启动
while(1)
{
rt_pin_write(LED2_PIN, PIN_LOW); //在main线程中控制LED2亮灭,延时led2time时间
rt_thread_mdelay(led2time);
rt_pin_write(LED2_PIN, PIN_HIGH);
rt_thread_mdelay(led2time);
}
}
其中线程入口函数,线程栈的起始地址等需要定义,同时需要编写按键线程的处理函数。
注意,它们要放在 main()
函数之前
代码如下:
ALIGN(RT_ALIGN_SIZE)
static char SW_stack[2048]; //线程栈
static struct rt_thread SW_thread; //线程控制块
static int SW_thread_entry(void)
{ //设置按键端口模式为输入
rt_pin_mode(UP_PIN, PIN_MODE_INPUT);
rt_pin_mode(DOWN_PIN, PIN_MODE_INPUT);
rt_pin_mode(LEFT_PIN, PIN_MODE_INPUT);
rt_pin_mode(RIGHT_PIN, PIN_MODE_INPUT);
while(1)
{
if (rt_pin_read(UP_PIN) == PIN_LOW) { //判断是否是上按键按下
rt_thread_mdelay(100); //去抖动
if (rt_pin_read(UP_PIN) == PIN_LOW) { //判断是否是上按键保持按下
led1time+=20; //LED1延时时间增加
}
}
if (rt_pin_read(DOWN_PIN) == PIN_LOW) { //判断是否是下按键按下
rt_thread_mdelay(100); //去抖动
if (rt_pin_read(DOWN_PIN) == PIN_LOW) { //判断是否是下按键保持按下
led1time-=20; //LED1延时时间减少
}
}
if (rt_pin_read(LEFT_PIN) == PIN_LOW) { //判断是否是左按键按下
rt_thread_mdelay(100); //去抖动
if (rt_pin_read(LEFT_PIN) == PIN_LOW) { //判断是否是左按键保持按下
led2time-=20; //LED2延时时间增加
}
}
if (rt_pin_read(RIGHT_PIN) == PIN_LOW) { //判断是否是右按键按下
rt_thread_mdelay(100); //去抖动
if (rt_pin_read(RIGHT_PIN) == PIN_LOW) { //判断是否是右按键保持按下
led2time+=20; //LED2延时时间减少
}
}
rt_thread_mdelay(20); //20ms扫描一次按键
}
return RT_EOK;
}
添加 LED1 闪烁线程
注意,要放在 main()
函数之前
代码如下:
ALIGN(RT_ALIGN_SIZE)
static char LED1_stack[2048];
static struct rt_thread LED1_thread;
static int led1_thread_entry(void){
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
while(1){
rt_pin_write(LED1_PIN, PIN_LOW);
rt_thread_mdelay(led1time);
rt_pin_write(LED1_PIN, PIN_HIGH);
rt_thread_mdelay(led1time);
}
return RT_EOK;
}