在线时间940 小时
UID349725
注册时间2012-3-27
NXP金币124
TA的每日心情 | 慵懒 2024-5-23 06:13 |
|---|
签到天数: 1082 天 连续签到: 1 天 [LV.10]以坛为家III
金牌会员
 
- 积分
- 6611
- 最后登录
- 2026-3-28
|
本帖最后由 SensorYoung 于 2025-11-24 14:33 编辑
项目背景:
LPC54628开发板带有CAN fd接口可以用于与车内其它can节点的通信。板载电容触摸屏,可以结合恩智浦Gui Guider,快速生成基于LVGL 9版本的HMI界面。值得一提的是Gui Guider支持Custom Code,可以添加用户代码,在模拟环境下实现与真实场景非常接近的运行效果。
一、HMI界面
创建Gui Guider项目的时候,要选择开发板型号,屏幕型号,然后选择一个模板开启HMI设计。
第一个screen是车速:
第二个屏幕是车内温度:
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,分配优先级。
- stat = xTaskCreate(CANTask, "CAN", 1024, NULL, tskIDLE_PRIORITY + 2, NULL);
- if (pdPASS != stat)
- {
- PRINTF("Failed to create CAN task");
- while (1)
- ;
-
复制代码 lvgl Task的优先级为:
- stat = xTaskCreate(AppTask, "lvgl", 1024, NULL, tskIDLE_PRIORITY + 3, NULL);
复制代码 测试发现如果CAN中断优先级比LVGL高,屏幕显示任务不能正确运行。
3.2. 定义全局变量传递车速Speed,温度Temperature:
这一对数据都是通过CAN总线传递过来,发送方是电脑上的USB-CAN工具。
- while (1)
- {
- while (!rxComplete)
- {
- }
-
- rxComplete = false;
- rxFrame.size = CAN_DATASIZE;
- /* After call the API of rMCAN_TransferReceiveFifoNonBlocking success, we can
- * only get a point (rxFrame.data) to the fifo reading entrance.
- * Copy the received frame data from the FIFO by the pointer(rxFrame.data). */
- memcpy(rx_data, rxFrame.data, rxFrame.size);
- PRINTF("\r\nReceived Frame ID: 0x%x", rxFrame.id >> STDID_OFFSET);
- PRINTF("\r\nReceived Frame DATA: ");
- cnt = 0;
- while (cnt < rxFrame.size)
- {
- PRINTF("0x%x ", rx_data[cnt++]);
- }
-
- speed = rx_data[0];
- sensorVal = rx_data[2];
- PRINTF("\r\n");
- }
复制代码
3.3 在LVGL组件更新的回调函数中更新车速与温度数据:
- void speed_meter_timer_cb(lv_timer_t * t)
- {
- lv_ui * gui = lv_timer_get_user_data(t);
- lv_scale_set_line_needle_value(gui->speed_meter_board, gui->speed_meter_board_ndline_0, 103, speed);
- lv_label_set_text_fmt(gui->speed_label_digit, "%"LV_PRId32, speed);
- }
复制代码
- void record_chart_timer_cb(lv_timer_t * t)
- {
- lv_obj_t * obj = lv_timer_get_user_data(t);
- lv_chart_series_t * ser = lv_chart_get_series_next(obj, NULL);
- int32_t * ser_array = lv_chart_get_y_array(obj, ser);
- for(int i = 0; i < CHART1_POINTS - 1; i++)
- {
- spd_chart[i] = spd_chart[i+1];
- ser_array[i] = spd_chart[i];
- }
- spd_chart[CHART1_POINTS - 1] = sensorVal;
- ser_array[CHART1_POINTS - 1] = spd_chart[CHART1_POINTS - 1];
- lv_chart_refresh(obj);
- }
复制代码
测试1. 发送报文(id: 0x123):2c 00 14 00 3f 00 a0 60
2. 发送报文(id: 0x123):3c 00 10 00 3f 00 a0 60
总结
1. 恩智浦MCU产品具有非常完善的开发生态,SDK Buider可以在线生成适配MCUXpresso,Keil,IAR GCC等不同工具链的SDK.
2. 借助于Gui Guider,可以选择开发版本是LVGL 8或者9版本,参考模板可以快速开启HMI设计。自定义代码可以逼真模拟显示状况。
3. LPC-link ii具有强大的调试功能,可以用在keil,MCUxpresso等,助力调试找bug。
|
|