【瑞萨RA4系列开发板体验】+ freeRTOS+串口中断+HC25+0.96显示屏实现阿里云下发命令控制板载LED灯
作者:jf_23522415
前言**基于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界面
- uart 1:用以从HC-25WiFi模块所在串口读取数据
- uart2:可以不用配置,我这里是通过该模块给板子供电
- led:显示屏的任务
- 显示屏有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模块所在串口处理逻辑
- #include "hal_data.h"
- #include "hc_25.h"
- #include "led_run.h"
- #include "oled.h"
- #include "string.h"
-
- 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);
-
-
- /* TODO: add your own code here */
- while (1)
- {
- vTaskDelay (500);
- }
- }
-
复制代码 OLED任务部分
- #include "oled_task.h"
- #include "oled.h"
- /* OLED Task entry function */
- /* pvParameters contains TaskHandle_t */
- 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();
- /* TODO: add your own code here */
- while (1)
- {
- oled.showString(0,0,"welcome!!");
- oled.showString(0,1, "task is running");
- oled.showString(0,2, &cmd);
- delay(500);
- }
- }
复制代码
有关这个0.96OLED显示部分的处理逻辑已封装好API,需要的话可以把仓库连接分享出来。
成果展示
总结由于内容比较杂,,仅仅是一次使用经验的分享,
|