tpgf 发表于 2023-3-16 14:46

Simulink自动生成嵌入式代码体验

Matlab版本:MatlabR2016b
开发板:AC7811QBFE开发板
直接上模型(Motorola_Creat_Signal模块为自定义模块用于解析Motorola格式的CAN报文,模块内部根据StartBit进入不同的分支再结合Length、Factor进行移位等算术运算):




模型的功能:从底层输入Test_Msg报文,解析后将结果输出给底层。
CAN报文的DBC文件如下:

首先配置Simulink的解算器Solver

选择定步长(基础采样时间设置为0.1S)解算器算法选用离散算法。
再配置下Code Generation

系统生成目标文件选择ert.tlc(Embedded Coder)。
Build之后会生成test_ert_rtw文件夹(因为模型文件名为test.slx),将该文件夹拷贝至Keil工程根目录下。

在Keil中进行设置(C/C++包含路径),随后将test.c和test_data.c文件加入工程。

打开test.c和test.h文件查看模型的输入输出量。


在底层CAN中断中调用。

                        else if(RxMessage_Can1.IDE == 1)
                        {
                                if(RxMessage_Can1.ID == TEST_ADDRESS_1801FF33)
                                {
                                        Can_Rec_Test_Frame_Flag = 1;
                       
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        test_U.Test_Msg =(uint8_t) RxMessage_Can1.Data;
                                        //Debug_Frame_Management();
                                        test_step();
                                        send_can_message_task2();
                                }
                               
                        }               



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

extern voidsend_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 = test_Y.Test_Enable;
                TxMessage.Data = ((test_Y.Test_Vol * 10) >> 8) & 0xFF;
                TxMessage.Data = (test_Y.Test_Vol * 10) & 0xFF;
                TxMessage.Data = (((test_Y.Test_Curr + 300) * 100) >> 8 ) & 0xFF;
                TxMessage.Data = ((test_Y.Test_Curr + 300) * 100) & 0xFF;;
                TxMessage.Data = 0;
                TxMessage.Data = 0;
                TxMessage.Data = 0;
               
                if(CAN_MessageSend(CAN1, &TxMessage, TRANSMIT_SECONDARY) != 0)
                        {
                               
                        }
                Can_Rec_Test_Frame_Flag = 0;
        }
}


效果:



————————————————
版权声明:本文为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

受启发!不知道这种**,实战效果如何,可变通性如何
页: [1]
查看完整版本: Simulink自动生成嵌入式代码体验