2025-01-15 11:01:26 +03:00
|
|
|
|
/**
|
|
|
|
|
**************************************************************************
|
|
|
|
|
* @dir ../MCU_Wrapper
|
|
|
|
|
* @brief <b> Папка с исходным кодом оболочки МК. </b>
|
|
|
|
|
* @details
|
|
|
|
|
В этой папке содержаться оболочка(англ. wrapper) для запуска и контроля
|
|
|
|
|
эмуляции микроконтроллеров в MATLAB (любого МК, не только STM).
|
|
|
|
|
Оболочка представляет собой S-Function - блок в Simulink, который работает
|
|
|
|
|
по скомпилированому коду. Компиляция происходит с помощью MSVC-компилятора.
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
**************************************************************************
|
|
|
|
|
* @file mcu_wrapper_conf.h
|
|
|
|
|
* @brief Заголовочный файл для оболочки МК.
|
|
|
|
|
**************************************************************************
|
|
|
|
|
@details
|
|
|
|
|
Главный заголовочный файл для матлаба. Включает дейфайны для S-Function,
|
|
|
|
|
объявляет базовые функции для симуляции МК и подключает базовые библиотеки:
|
|
|
|
|
- для симуляции "stm32fxxx_matlab_conf.h"
|
|
|
|
|
- для S-Function "simstruc.h"
|
|
|
|
|
- для потоков <process.h>
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
#ifndef _WRAPPER_CONF_H_
|
|
|
|
|
#define _WRAPPER_CONF_H_
|
|
|
|
|
|
|
|
|
|
// Includes
|
|
|
|
|
#include "simstruc.h" // For S-Function variables
|
|
|
|
|
#include <process.h> // For threads
|
|
|
|
|
|
2025-01-17 10:19:40 +03:00
|
|
|
|
#include "app_includes.h"
|
2025-01-15 11:01:26 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @defgroup MCU_WRAPPER MCU Wrapper
|
|
|
|
|
* @brief Всякое для оболочки МК
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @addtogroup WRAPPER_CONF Wrapper Configuration
|
|
|
|
|
* @ingroup MCU_WRAPPER
|
|
|
|
|
* @brief Параметры конфигурации для оболочки МК
|
|
|
|
|
* @details Здесь дефайнами задается параметры оболочки, которые определяют как она будет работать
|
|
|
|
|
* @{
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// Parametrs of MCU simulator
|
2025-01-17 10:19:40 +03:00
|
|
|
|
//#define RUN_APP_MAIN_FUNC_THREAD ///< Enable using thread for MCU main() func
|
2025-01-15 11:01:26 +03:00
|
|
|
|
#define DEKSTOP_CYCLES_FOR_MCU_APP 0xFFFF ///< number of for() cycles after which MCU thread would be suspended
|
2025-01-17 10:19:40 +03:00
|
|
|
|
#define MCU_CORE_CLOCK 150000000 ///< MCU clock rate for simulation
|
2025-01-15 11:01:26 +03:00
|
|
|
|
|
|
|
|
|
// Parameters of S_Function
|
2025-01-17 10:19:40 +03:00
|
|
|
|
#define IN_PORT_WIDTH 20 ///< width of input ports
|
|
|
|
|
#define IN_PORT_NUMB 1 ///< number of input ports
|
|
|
|
|
#define OUT_PORT_WIDTH 51 ///< width of output ports
|
|
|
|
|
#define OUT_PORT_NUMB 1 ///< number of output ports
|
2025-01-18 19:27:56 +03:00
|
|
|
|
|
2025-01-15 11:01:26 +03:00
|
|
|
|
|
|
|
|
|
#define RWORK_0_WIDTH 5 //width of the real-work vector
|
|
|
|
|
#define IWORK_0_WIDTH 5 //width of the integer-work vector
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** WRAPPER_CONF
|
|
|
|
|
* @}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @addtogroup MCU_WRAPPER
|
|
|
|
|
* @{
|
|
|
|
|
*/
|
|
|
|
|
|
2025-01-18 19:27:56 +03:00
|
|
|
|
// Fixed parameters(?) of S_Function
|
|
|
|
|
#define NPARAMS 1 ///< number of input parametrs (only Ts)
|
|
|
|
|
#define DISC_STATES_WIDTH OUT_PORT_WIDTH*OUT_PORT_NUMB ///< width of discrete states array (outbup buffer)
|
2025-01-17 10:19:40 +03:00
|
|
|
|
/**
|
|
|
|
|
* @brief Define for creating thread in suspended state.
|
|
|
|
|
* @details Define from WinBase.h. We dont wanna include "Windows.h" or smth like this, because of HAL there are a lot of redefine errors.
|
|
|
|
|
*/
|
|
|
|
|
#define CREATE_SUSPENDED 0x00000004
|
2025-01-15 11:01:26 +03:00
|
|
|
|
typedef void* HANDLE; ///< MCU handle typedef
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief MCU handle Structure definition.
|
|
|
|
|
* @note Prefixes: h - handle, s - settings, f - flag
|
|
|
|
|
*/
|
|
|
|
|
typedef struct {
|
|
|
|
|
// MCU Thread
|
|
|
|
|
HANDLE hMCUThread; ///< Хендл для потока МК
|
|
|
|
|
int idMCUThread; ///< id потока МК (unused)
|
|
|
|
|
// Flags
|
|
|
|
|
unsigned fMCU_Stop : 1; ///< флаг для выхода из потока программы МК
|
|
|
|
|
|
2025-01-15 12:35:47 +03:00
|
|
|
|
double SimTime; ///< Текущее время симуляции
|
2025-01-17 10:19:40 +03:00
|
|
|
|
long SystemClock; ///< Счетчик тактов для симуляции системных тиков (в целочисленном формате)
|
|
|
|
|
|
|
|
|
|
double SystemClockDouble; ///< Счетчик в формате double для точной симуляции системных тиков С промежуточными значений
|
|
|
|
|
double sSystemClock_step; ///< Шаг тиков для их симуляции, в формате double
|
|
|
|
|
double sSimSampleTime; ///< Период дискретизации симуляции
|
2025-01-15 11:01:26 +03:00
|
|
|
|
}SIM__MCUHandleTypeDef;
|
|
|
|
|
extern SIM__MCUHandleTypeDef hmcu; // extern для видимости переменной во всех файлах
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
|
//------------------ SIMULINK WHILE DEFINES -----------------//
|
2025-01-17 10:19:40 +03:00
|
|
|
|
#ifdef RUN_APP_MAIN_FUNC_THREAD
|
2025-01-15 11:01:26 +03:00
|
|
|
|
/* DEFINE TO WHILE WITH SIMULINK WHILE */
|
|
|
|
|
/**
|
|
|
|
|
* @brief Redefine C while statement with sim_while() macro.
|
|
|
|
|
* @param _expression_ - expression for while.
|
|
|
|
|
* @details Это while который будет использоваться в симулинке @ref sim_while для подробностей.
|
|
|
|
|
*/
|
|
|
|
|
#define while(_expression_) sim_while(_expression_)
|
2025-01-17 10:19:40 +03:00
|
|
|
|
#endif
|
2025-01-15 11:01:26 +03:00
|
|
|
|
|
|
|
|
|
/* SIMULINK WHILE */
|
|
|
|
|
/**
|
|
|
|
|
* @brief While statement for emulate MCU code in Simulink.
|
|
|
|
|
* @param _expression_ - expression for while.
|
|
|
|
|
* @details Данный while необходим, чтобы в конце симуляции, завершить поток МК:
|
|
|
|
|
* При выставлении флага окончания симуляции, все while будут пропускаться
|
|
|
|
|
* и поток сможет дойти до конца функции main и завершить себя.
|
|
|
|
|
*/
|
|
|
|
|
#define sim_while(_expression_) while((_expression_)&&(hmcu.fMCU_Stop == 0))
|
|
|
|
|
|
|
|
|
|
/* DEFAULT WHILE */
|
|
|
|
|
/**
|
|
|
|
|
* @brief Default/Native C while statement.
|
|
|
|
|
* @param _expression_ - expression for while.
|
|
|
|
|
* @details Данный while - аналог обычного while, без дополнительного функционала.
|
|
|
|
|
*/
|
|
|
|
|
#define native_while(_expression_) for(; (_expression_); )
|
|
|
|
|
/***************************************************************/
|
|
|
|
|
|
|
|
|
|
//------------------ SIMULINK WHILE DEFINES -----------------//
|
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
|
//---------------- SIMULATE FUNCTIONS PROTOTYPES -------------//
|
|
|
|
|
/* Step simulation */
|
|
|
|
|
void MCU_Step_Simulation(SimStruct *S, time_T time);
|
|
|
|
|
|
|
|
|
|
/* MCU peripheral simulation */
|
|
|
|
|
void MCU_Periph_Simulation(void);
|
|
|
|
|
|
|
|
|
|
/* Initialize MCU simulation */
|
|
|
|
|
void SIM_Initialize_Simulation(void);
|
|
|
|
|
|
|
|
|
|
/* Deinitialize MCU simulation */
|
|
|
|
|
void SIM_deInitialize_Simulation(void);
|
|
|
|
|
|
|
|
|
|
/* Read inputs S-function */
|
|
|
|
|
void MCU_readInputs(SimStruct* S);
|
|
|
|
|
|
|
|
|
|
/* Write pre-outputs S-function (out_buff states) */
|
|
|
|
|
void MCU_writeOutputs(SimStruct* S);
|
|
|
|
|
|
|
|
|
|
/* Write outputs of block of S-Function*/
|
|
|
|
|
void SIM_writeOutput(SimStruct* S);
|
|
|
|
|
//---------------- SIMULATE FUNCTIONS PROTOTYPES -------------//
|
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
|
|
|
|
|
|
/** MCU_WRAPPER
|
|
|
|
|
* @}
|
|
|
|
|
*/
|
|
|
|
|
#endif // _WRAPPER_CONF_H_
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------//
|
|
|
|
|
//---------------------BAT FILE DESCRIBTION--------------------//
|
|
|
|
|
/**
|
|
|
|
|
* @file run_mex.bat
|
|
|
|
|
* @brief Батник для компиляции оболочки МК.
|
|
|
|
|
* @details
|
2025-01-17 10:19:40 +03:00
|
|
|
|
* Вызывается в матлабе из allmex.m.
|
2025-01-15 11:01:26 +03:00
|
|
|
|
*
|
|
|
|
|
* Исходный код батника:
|
2025-01-17 10:19:40 +03:00
|
|
|
|
* @include run_mex.bat
|
2025-01-15 11:01:26 +03:00
|
|
|
|
*/
|