[其他] Simulink自动生成嵌入式代码体验

[复制链接]
 楼主| tpgf 发表于 2023-3-16 14:46 | 显示全部楼层 |阅读模式
Matlab版本:MatlabR2016b
开发板:AC7811QBFE开发板
直接上模型(Motorola_Creat_Signal模块为自定义模块用于解析Motorola格式的CAN报文,模块内部根据StartBit进入不同的分支再结合Length、Factor进行移位等算术运算):
794036412baea43d8d.png
899996412baf4023cb.png
620906412bafbb7294.png

模型的功能:从底层输入Test_Msg报文,解析后将结果输出给底层。
CAN报文的DBC文件如下:
356226412bb04a5acc.png
首先配置Simulink的解算器Solver
954356412bb0a93f37.png
选择定步长(基础采样时间设置为0.1S)解算器算法选用离散算法。
再配置下Code Generation
665536412bb1233633.png
系统生成目标文件选择ert.tlc(Embedded Coder)。
Build之后会生成test_ert_rtw文件夹(因为模型文件名为test.slx),将该文件夹拷贝至Keil工程根目录下。
11966412bb1a3be8c.png
在Keil中进行设置(C/C++包含路径),随后将test.c和test_data.c文件加入工程。
327956412bb29ead54.png
打开test.c和test.h文件查看模型的输入输出量。
272706412bb230ba29.png

在底层CAN中断中调用。

                        else if(RxMessage_Can1.IDE == 1)
                        {
                                if(RxMessage_Can1.ID == TEST_ADDRESS_1801FF33)
                                {
                                        Can_Rec_Test_Frame_Flag = 1;
                       
                                        test_U.Test_Msg[0] =  (uint8_t) RxMessage_Can1.Data[0];
                                        test_U.Test_Msg[1] =  (uint8_t) RxMessage_Can1.Data[1];
                                        test_U.Test_Msg[2] =  (uint8_t) RxMessage_Can1.Data[2];
                                        test_U.Test_Msg[3] =  (uint8_t) RxMessage_Can1.Data[3];
                                        test_U.Test_Msg[4] =  (uint8_t) RxMessage_Can1.Data[4];
                                        test_U.Test_Msg[5] =  (uint8_t) RxMessage_Can1.Data[5];
                                        test_U.Test_Msg[6] =  (uint8_t) RxMessage_Can1.Data[6];
                                        test_U.Test_Msg[7] =  (uint8_t) RxMessage_Can1.Data[7];
                                        //Debug_Frame_Management();
                                        test_step();
                                        send_can_message_task2();
                                }
                               
                        }               



test_step函数定义在test.c中即模型中Motorola_Creat_Signal模块执行的解析功能。然后将解析后的数据还原作为响应报文在中断中发送。

extern void  send_can_message_task2(void)
{
       
        if(Can_Rec_Test_Frame_Flag ==1)
        {
                uint8_t i = 0;
                TxMessage.ID = ACK_TEST_ADDRESS_1801FF66;     
                TxMessage.RTR = 0;
                TxMessage.IDE = 1;       
                TxMessage.DLC = 8;
               
                TxMessage.Data[i++] = test_Y.Test_Enable;
                TxMessage.Data[i++] = ((test_Y.Test_Vol * 10) >> 8) & 0xFF;
                TxMessage.Data[i++] = (test_Y.Test_Vol * 10) & 0xFF;
                TxMessage.Data[i++] = (((test_Y.Test_Curr + 300) * 100) >> 8 ) & 0xFF;
                TxMessage.Data[i++] = ((test_Y.Test_Curr + 300) * 100) & 0xFF;;
                TxMessage.Data[i++] = 0;
                TxMessage.Data[i++] = 0;
                TxMessage.Data[i++] = 0;
               
                if(CAN_MessageSend(CAN1, &TxMessage, TRANSMIT_SECONDARY) != 0)
                        {
                               
                        }
                Can_Rec_Test_Frame_Flag = 0;
        }
}


效果:
786396412bb3d765fd.png
505646412bb438ac39.jpg

————————————————
版权声明:本文为CSDN博主「无名小屁喵」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_46099600/article/details/125772895

chenjun89 发表于 2023-3-21 08:03 来自手机 | 显示全部楼层
学习了,matlab真的强大啊!
feiying20044002 发表于 2023-3-21 10:04 | 显示全部楼层
能不能提供下原码学习学习啊
chenqianqian 发表于 2023-3-21 20:06 来自手机 | 显示全部楼层
还能这样玩,了解新招式.
WJdemo 发表于 2023-4-24 22:05 | 显示全部楼层
受启发!不知道这种**,实战效果如何,可变通性如何
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2350

主题

17466

帖子

21

粉丝
快速回复 在线客服 返回列表 返回顶部