freeRTOS+串口中断+HC25+0.96显示屏实现阿里云下发命令控制板载LED灯
前言
**基于RA2E1 48PIN的瑞萨板子实现,虽然这里没有用到试用板子RA4M2,但实现原理在RA4M2上也是一样实现,区别只是修改下引脚的定义。其实也没必要用到freeRTOS,这里之所以用到它是因为想借此机会涉猎一下freeRTOS。
这篇文章不是一个教程,实现过程代码很基础,不要介意
实现功能
- 通过阿里云、手机端给HC-25发指令,HC-25接收到指令后,发给板子,触发中断,在中断处处理切换LED灯的逻辑,0-led0 1-led1
- 在触摸屏中实时显示下发指令内容
HC-25模块配置
HC-25是一个物联网WIFI串口通讯模块,详细信息可自行tb搜索。按照官方配置MQTT上云的流程后,配置指令给模块连接WiFi,配置过程省略,需要的评论区可以提。
0.96寸OLED显示屏
开始
e2studio工程配置
创建工程
创建工程时,添加RTOS
配置stack界面
调整heap size
按需求配,这里随便配的。
切换到stack界面
- 添加Task
- uart 1:用以从HC-25WiFi模块所在串口读取数据
- uart2:可以不用配置,我这里是通过该模块给板子供电
- led:led灯切换的任务
- oled:显示屏的任务
- 显示屏有7pin,分配如下
均配置成output mode initial low
** cs --- p409 ** **
dc --- p302
rst ----p201
sda ----p206
sck --- p208
vdd ----vdd
**gnd ---- gnd
- 添加这些任务时均按默认配置配置,除了修改了task name和Symbol以及串口中断回调
代码片段
HC-25部分
LED定义
#define LED_1 \
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH);\
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_LOW);
#define LED_2 \
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW);\
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH);
#define LED_ON \
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH);\
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH);
#define LED_OFF \
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW);\
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_LOW);
HC-25模块所在串口处理逻辑
volatile bool uart9_send_complete_flag = false;
u8 cmd;
/**
* uart-1 callback function
void g_uart9_callback(uart_callback_args_t *p_args)
{
memcpy(cmd, (uint8_t*)&(p_args->data), strlen(p_args->data));
switch (p_args->event)
{
case UART_EVENT_RX_CHAR:
{
switch (p_args->data)
{
case '0':
{
LED_1;
break;
}
case '1':
{
LED_2;
break;
}
case '2':
{
LED_ON;
break;
}
case '3':
{
LED_OFF;
break;
}
default:
break;
}
break;
}
case UART_EVENT_TX_COMPLETE:
{
uart9_send_complete_flag = true;
break;
}
default:
break;
}
}
HC-25串口任务入口定义
ains TaskHandle_t */
void hc_25_entry(void *pvParameters)
{
FSP_PARAMETER_NOT_USED (pvParameters);
fsp_err_t err;
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS==err);
while (1)
{
vTaskDelay (500);
}
}
OLED任务部分
#include "oled_task.h"
#include "oled.h"
void oled_task_entry(void *pvParameters)
{
FSP_PARAMETER_NOT_USED (pvParameters);
u8 i;
extern u8 cmd;
R_IOPORT_Open(&g_ioport_ctrl, &g_bsp_pin_cfg);
OLED_init();
oled.showStart();
delay(500);
oled.clear();
while (1)
{
oled.showString(0,0,"welcome!!");
oled.showString(0,1, "task is running");
oled.showString(0,2, &cmd);
delay(500);
}
}
有关这个0.96OLED显示部分的处理逻辑已封装好API,需要的话可以把仓库连接分享出来。
成果展示
总结
由于内容比较杂,,仅仅是一次使用经验的分享,