点亮第一个LED灯及按键输入
一、点亮第一个LED灯
在user_init()
函数中设置IO2为GPIO模式,如下所示:
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_GPIO2); /* 设置IO2为GPIO模式 */
然后将其设置为输出模式,并设置为低电平,从而将LED点亮:
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0); /* 使能GPIO2位输出模式并设置为低电平,点亮LED */
然后编译下载运行,可以看到,LED已经点亮了。
二、LED闪烁
新建一个LED闪烁任务,并在user_init()
中创建这个任务,要注意,RTOS SDK提供的任务优先级最高为14,但是有一些优先级被系统占用了,可供用户使用的优先级只有1~9
,数值越大,优先级越高,另外任务堆栈设置范围也被规定在 [176, 512]之间。
/* 创建一个任务,参数分别为:1、任务函数,2、任务名称,3、任务堆栈,4、任务函数的参数,5、任务优先级,6、任务句柄*/
xTaskCreate(led_blink, "led blink", 256, NULL, 2, NULL);
然后我们实现任务函数如下所示:
/* LED闪烁任务函数 */
void led_blink(void *pvParameters)
{
while(1)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 0);
vTaskDelay(500 / portTICK_RATE_MS); /* 延时500ms */
GPIO_OUTPUT_SET(GPIO_ID_PIN(2), 1);
vTaskDelay(500 / portTICK_RATE_MS); /* 延时500ms */
}
vTaskDelete(NULL);
}
然后编译下载运行,可以看到,LED一秒闪烁一次。
三、循环检测按键是否按下
首先将boot按键的引脚设置为GPIO模式,禁止输出,即设置为输入模式
PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U,FUNC_GPIO0); /* 设置IO0为GPIO模式 */
GPIO_DIS_OUTPUT(GPIO_ID_PIN(0)) ; /* 禁止GPIO2输出模式,即设置为输入模式 */
我们创建一个按键检测任务检测是否有按键按下,
/* 创建一个按键检测任务 */
xTaskCreate(key_task, "key task", 256, NULL, 3, NULL);
实现任务函数如下:
/* 按键检测任务函数 */
void key_task(void *pvParameters)
{
static int key_up = 1; /* 按键松开标志 */
while (1)
{
/* 检测按键是否按下 */
if (key_up && (GPIO_INPUT_GET(GPIO_ID_PIN(0)) == 0) )
{
vTaskDelay(50 / portTICK_RATE_MS); /* 延时50ms消抖*/
key_up = 0;
if (GPIO_INPUT_GET(GPIO_ID_PIN(0)) == 0)
{
/* 按键BOOT按下,按键按下处理*/
printf("BOOT Key pressed!\n");
}
}
else if(GPIO_INPUT_GET(GPIO_ID_PIN(0)) == 1 )
{
key_up = 1; /* 按键已松开 */
}
vTaskDelay(100 / portTICK_RATE_MS);
}
}
编译下载运行,可以看到,按键检测成功