查看: 352|回复: 1

[分享] [LPC54628试用]-6-基于CAN总线的车速与车内温度模拟系统

[复制链接]
  • TA的每日心情
    慵懒
    2024-5-23 06:13
  • 签到天数: 1082 天

    连续签到: 1 天

    [LV.10]以坛为家III

    24

    主题

    1989

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    6611
    最后登录
    2026-3-28
    发表于 2025-11-24 14:34:20 | 显示全部楼层 |阅读模式
    本帖最后由 SensorYoung 于 2025-11-24 14:33 编辑

    项目背景:
    LPC54628开发板带有CAN fd接口可以用于与车内其它can节点的通信。板载电容触摸屏,可以结合恩智浦Gui Guider,快速生成基于LVGL 9版本的HMI界面。值得一提的是Gui Guider支持Custom Code,可以添加用户代码,在模拟环境下实现与真实场景非常接近的运行效果。


    一、HMI界面
    创建Gui Guider项目的时候,要选择开发板型号,屏幕型号,然后选择一个模板开启HMI设计。
    第一个screen是车速:
    Snipaste_2025-11-24_14-01-37.png



    第二个屏幕是车内温度:
    Snipaste_2025-11-24_14-04-49.png

    Gui Guider底部的Event栏可以展示当前组件的关联的一些操作。这个非常实用。


    二、CAN接收
    这部分可以参考:
    [LPC54628试用]-5-LPC54628 - CAN 测试 https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=810444&fromuid=349725

    三、整合应用代码
    3.1 创建FreeRTOS CAN Task,分配优先级。
    1. stat = xTaskCreate(CANTask, "CAN", 1024, NULL, tskIDLE_PRIORITY + 2, NULL);

    2.     if (pdPASS != stat)
    3.     {
    4.         PRINTF("Failed to create CAN task");
    5.         while (1)
    6.             ;
    7.    
    复制代码
    lvgl Task的优先级为:
    1. stat = xTaskCreate(AppTask, "lvgl", 1024, NULL, tskIDLE_PRIORITY + 3, NULL);
    复制代码
    测试发现如果CAN中断优先级比LVGL高,屏幕显示任务不能正确运行。


    3.2. 定义全局变量传递车速Speed,温度Temperature:
    这一对数据都是通过CAN总线传递过来,发送方是电脑上的USB-CAN工具。
    1. while (1)
    2.     {
    3.         while (!rxComplete)
    4.         {
    5.        }
    6.                                 
    7.        rxComplete = false;

    8.         rxFrame.size = CAN_DATASIZE;
    9.           /* After call the API of rMCAN_TransferReceiveFifoNonBlocking success, we can
    10.           * only get a point (rxFrame.data) to the fifo reading entrance.
    11.             * Copy the received frame data from the FIFO by the pointer(rxFrame.data). */
    12.             memcpy(rx_data, rxFrame.data, rxFrame.size);

    13.              PRINTF("\r\nReceived Frame ID: 0x%x", rxFrame.id >> STDID_OFFSET);
    14.             PRINTF("\r\nReceived Frame DATA: ");
    15.                cnt = 0;
    16.                while (cnt < rxFrame.size)
    17.                  {
    18.                      PRINTF("0x%x ", rx_data[cnt++]);
    19.                   }
    20.                                 
    21.                speed = rx_data[0];
    22.                 sensorVal = rx_data[2];
    23.                  PRINTF("\r\n");

    24.     }        
    复制代码


    3.3 在LVGL组件更新的回调函数中更新车速与温度数据:
    1. void speed_meter_timer_cb(lv_timer_t * t)
    2. {
    3.     lv_ui * gui = lv_timer_get_user_data(t);

    4.     lv_scale_set_line_needle_value(gui->speed_meter_board, gui->speed_meter_board_ndline_0, 103, speed);
    5.     lv_label_set_text_fmt(gui->speed_label_digit, "%"LV_PRId32, speed);
    6. }
    复制代码

    1. void record_chart_timer_cb(lv_timer_t * t)
    2. {
    3.     lv_obj_t * obj = lv_timer_get_user_data(t);

    4.     lv_chart_series_t * ser = lv_chart_get_series_next(obj, NULL);
    5.     int32_t * ser_array = lv_chart_get_y_array(obj, ser);


    6.     for(int i = 0; i < CHART1_POINTS - 1; i++)
    7.     {
    8.         spd_chart[i] = spd_chart[i+1];
    9.         ser_array[i] = spd_chart[i];
    10.     }

    11.                 spd_chart[CHART1_POINTS - 1] = sensorVal;
    12. ser_array[CHART1_POINTS - 1] = spd_chart[CHART1_POINTS - 1];
    13.     lv_chart_refresh(obj);
    14. }
    复制代码


    测试1. 发送报文(id: 0x123):2c 00 14 00 3f 00 a0 60

    Snipaste_2025-11-24_14-22-10.png


    2. 发送报文(id: 0x123):3c 00 10 00 3f 00 a0 60
    Snipaste_2025-11-24_14-25-22.png



    总结
    1. 恩智浦MCU产品具有非常完善的开发生态,SDK Buider可以在线生成适配MCUXpresso,Keil,IAR GCC等不同工具链的SDK.
    2. 借助于Gui Guider,可以选择开发版本是LVGL 8或者9版本,参考模板可以快速开启HMI设计。自定义代码可以逼真模拟显示状况。
    3. LPC-link ii具有强大的调试功能,可以用在keil,MCUxpresso等,助力调试找bug。


    回复

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-6 09:03
  • 签到天数: 220 天

    连续签到: 1 天

    [LV.7]常住居民III

    43

    主题

    1182

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2531
    最后登录
    2026-2-9
    发表于 2025-11-25 11:11:39 | 显示全部楼层
    学习了,简单代码就可以实现一个高级功能
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2026-4-16 02:00 , Processed in 0.087084 second(s), 22 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表