接下来我们来谈论一个这个教程里面最关键的一个问题:如何将Matlab/Simulink生成的代码迁移到其他平台上面运行呢。我们可以看到为什么Matlab公司会不断地嵌入式平台的底层配置直接生成代码,很大程度上底层配置代码生成的灵活性不够,我们看到ST官网出的支持包我们用起来的稳定也是特别差,几乎每次生成都会出现这样那样的问题。所以跨平台是特别好的选择。前面我们已经解决了代码的可读性及其优化的问题,下面就跟着我的脚步去实现如何跨平台调用代码。
我们打开Simulink与核心板通讯的实验工程,根据之前的实验把数据字典搭好;
我们配置一下生成代码的设置:请按照下面的步骤设置,不要多也不要少;
设置好了以后我们来生成C代码;
这个文件我们不用管,待会添加C文件到工程当中就不要添加这个就可以了;
我们可以看到生成的代码时非常的规范的:
生成代码这一步已经全部弄好了,直接而来我们利用ST的软件生成我们所需要的底层;
我们这个工程主要是实现两个功能:1、闪烁灯;2、串口通讯;
我们打开STM32cubeMX软件,选择核心板对应的硬件
我们来一步步配置我们的底层
到此STM32的底层配配置就已经结束了
我们打开对应的MDK文件,我们编译一下生成的代码有没有错误
我们生成的FreeRTOS系统,我们直接在这两个任务里面做我们想要的程序就可以了
添加包好的头文件对应的文件夹
接下来我们来添加对应包含的头文件代码
直接在我们对应的任务里面添加我们要运行的代码
一定要运行这个函数:Communication_step();只要这个函数被主程序运行起来
我们定义的这这些变量就会被赋予数值数值:
typedef struct UART_In_tag {
real32_T In_1;
real32_T In_2;
real32_T In_3;
real32_T In_4;
real32_T In_5;
} UART_In_type;
typedef struct UART_OUT_tag {
real32_T Out_1;
real32_T Out_2;
real32_T Out_3;
real32_T Out_4;
real32_T Out_5;
real32_T Out_6;
real32_T Out_7;
} UART_OUT_type;
extern real_T Rate; /* '
下图为一个任务中,运行Communication_step();,并利用Rate数值的变化进行闪烁灯功能的实现,操作的底层对象函数为:
if(Rate==1)
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
else
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
下图为我们调用下面的这些变量进行串口数据的发送
typedef struct UART_In_tag {
real32_T In_1;
real32_T In_2;
real32_T In_3;
real32_T In_4;
real32_T In_5;
} UART_In_type;
typedef struct UART_OUT_tag {
real32_T Out_1;
real32_T Out_2;
real32_T Out_3;
real32_T Out_4;
real32_T Out_5;
real32_T Out_6;
real32_T Out_7;
} UART_OUT_type;
只要主函数运行了Communication_step();,我们只需要关心怎么调用我们要电泳的变量就可以了
对于串口接受跟发送,操作的底层对象的函数为
HAL_UART_Receive_DMA(&huart1, (uint8_t *)UART1_Temp_Buffer,sizeof(UART1_Temp_Buffer));
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)UART1_Tx_Buffer, sizeof(UART1_Tx_Buffer));
到这里我们回过头来看一下我们的Simulink模型
只要定义好我们需要引用的变量,输入是什么,输出是什么,最后在C代码平台上面只要主程序运行了Communication_step();函数,不用管中间经过了什么,只要功能是跟我们仿真阶段是一样的这就可以了,而实验出来的结果完全跟我们仿真的功能是一样的;
最后我们编译一下,有没有报错
本节所需的全部文件代码如下,请自行下载:
链接:https://pan.baidu.com/s/10C9xdvA-wAwmDGp5ifVVpg
提取码:iqw1
如有疑问请留言