打印
[其他]

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

[复制链接]
1291|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2023-3-16 14:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
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[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;
        }
}


效果:



————————————————
版权声明:本文为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 | 只看该作者
还能这样玩,了解新招式.

使用特权

评论回复
5
WJdemo| | 2023-4-24 22:05 | 只看该作者
受启发!不知道这种**,实战效果如何,可变通性如何

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1931

主题

15611

帖子

11

粉丝