查看: 642|回复: 1

【瑞萨RA4系列开发板体验】freeRTOS+阿里云下发命令控制板...

[复制链接]

116

主题

133

帖子

3768

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3768
发表于 2023-2-3 15:50:22 | 显示全部楼层 |阅读模式
【瑞萨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界面
  • 添加Task


  • uart 1:用以从HC-25WiFi模块所在串口读取数据


  • uart2:可以不用配置,我这里是通过该模块给板子供电


  • led:led灯切换的任务


    • 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定义

  1. #define LED_1 \
  2.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH);\
  3.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_LOW);

  4. #define LED_2 \
  5.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW);\
  6.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH);


  7. #define LED_ON \
  8.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_HIGH);\
  9.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_HIGH);

  10. #define LED_OFF \
  11.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_03, BSP_IO_LEVEL_LOW);\
  12.         R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_04, BSP_IO_LEVEL_LOW);
复制代码

HC-25模块所在串口处理逻辑
  1. #include "hal_data.h"
  2. #include "hc_25.h"
  3. #include "led_run.h"
  4. #include "oled.h"
  5. #include "string.h"

  6. volatile bool uart9_send_complete_flag = false;
  7. u8 cmd;
  8. /**
  9. * uart-1 callback function
  10. void g_uart9_callback(uart_callback_args_t *p_args)
  11. {
  12.     memcpy(cmd, (uint8_t*)&(p_args->data), strlen(p_args->data));
  13.     switch (p_args->event)
  14.     {
  15.         case UART_EVENT_RX_CHAR:
  16.         {
  17.             switch (p_args->data)
  18.             {
  19.                 case '0':
  20.                 {
  21.                     LED_1;
  22.                     break;
  23.                 }
  24.                 case '1':
  25.                 {
  26.                     LED_2;
  27.                     break;
  28.                 }
  29.                 case '2':
  30.                 {
  31.                     LED_ON;
  32.                     break;
  33.                 }
  34.                 case '3':
  35.                 {
  36.                     LED_OFF;
  37.                     break;
  38.                 }
  39.                 default:
  40.                     break;
  41.             }
  42.             break;
  43.         }
  44.         case UART_EVENT_TX_COMPLETE:
  45.         {
  46.             uart9_send_complete_flag = true;
  47.             break;
  48.         }
  49.         default:
  50.             break;
  51.     }
  52. }
复制代码
HC-25串口任务入口定义
  1. ains TaskHandle_t */
  2. void hc_25_entry(void *pvParameters)
  3. {
  4.     FSP_PARAMETER_NOT_USED (pvParameters);

  5.     fsp_err_t err;
  6.     err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
  7.     assert(FSP_SUCCESS==err);


  8.     /* TODO: add your own code here */
  9.     while (1)
  10.     {
  11.         vTaskDelay (500);
  12.     }
  13. }
复制代码
OLED任务部分
  1. #include "oled_task.h"
  2. #include "oled.h"
  3. /* OLED Task entry function */
  4. /* pvParameters contains TaskHandle_t */
  5. void oled_task_entry(void *pvParameters)
  6. {
  7.     FSP_PARAMETER_NOT_USED (pvParameters);
  8.     u8 i;
  9.     extern u8 cmd;

  10.     R_IOPORT_Open(&g_ioport_ctrl, &g_bsp_pin_cfg);

  11.     OLED_init();
  12.     oled.showStart();
  13.     delay(500);
  14.     oled.clear();
  15.     /* TODO: add your own code here */
  16.     while (1)
  17.     {
  18.         oled.showString(0,0,"welcome!!");
  19.         oled.showString(0,1, "task is running");
  20.         oled.showString(0,2, &cmd);
  21.         delay(500);
  22.     }
  23. }
复制代码

有关这个0.96OLED显示部分的处理逻辑已封装好API,需要的话可以把仓库连接分享出来。

成果展示





总结
由于内容比较杂,,仅仅是一次使用经验的分享,


回复

使用道具 举报

3

主题

195

帖子

1206

积分

金牌会员

Rank: 6Rank: 6

积分
1206
发表于 2023-3-14 11:03:48 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:133精华:0

RA_Lance

主题: 92帖子:132精华:9

lugl

主题: 38帖子:126精华:0

xujiwei263

主题: 16帖子:73精华:0

books咦

主题: 11帖子:11精华:2

Juggernaut

主题: 9帖子:95精华:0
快速回复 返回顶部 返回列表