From f856b33e1cfc763271a201907037fd0ec3d50218 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Mon, 31 Mar 2025 16:29:01 +0300 Subject: [PATCH] =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=B4=D0=B5?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BD=20=D1=83=D0=B1=D1=80=D0=B0=D0=BD=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=82=D0=BE=D0=BA=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App_Wrapper/main.c | 18 +++++----- .../STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c | 32 +++++++++++++----- MCU_Wrapper/mcu_wrapper.c | 12 +++++-- MCU_Wrapper/mcu_wrapper_conf.h | 24 +++++++++---- mcu_test_r2021a.slx | Bin 50078 -> 50075 bytes 5 files changed, 60 insertions(+), 26 deletions(-) diff --git a/App_Wrapper/main.c b/App_Wrapper/main.c index ee8aeec..a7b229b 100644 --- a/App_Wrapper/main.c +++ b/App_Wrapper/main.c @@ -152,7 +152,7 @@ void Periph_reInit(void) * @brief The application entry point. * @retval int */ -int main(void) +int main_init(void) { /* USER CODE BEGIN 1 */ __HAL_DBGMCU_FREEZE_TIM1(); @@ -212,14 +212,14 @@ int main(void) // MODBUS_Transmit_IT(&hmodbus1, &MODBUS_MSG); //RS_Receive_IT(&hmodbus1, &MODBUS_MSG); - while (1) - { - /* USER CODE END WHILE */ - Periph_reInit(); - /* USER CODE BEGIN 3 */ -// HAL_Delay(200); -// MB_Toogle_Coil_Local(&GPIOD->ODR, COIL_GPIOD_LED3); - } +// while (1) +// { +// /* USER CODE END WHILE */ +// Periph_reInit(); +// /* USER CODE BEGIN 3 */ +//// HAL_Delay(200); +//// MB_Toogle_Coil_Local(&GPIOD->ODR, COIL_GPIOD_LED3); +// } /* USER CODE END 3 */ } diff --git a/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c b/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c index cf93d00..c3c83ee 100644 --- a/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c +++ b/MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK/stm32f4xx_matlab_tim.c @@ -40,7 +40,6 @@ void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS) Channels_Simulation(TIMx, TIMS); // CaptureCompare and PWM channels simulation break; - // включение слейв таймера по ивенту case(TIM_SLAVEMODE_TRIGGER): // SLAVE MODE: TRIGGER MODE Slave_Mode_Check_Source(TIMx, TIMS); @@ -83,17 +82,34 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS) if ((TIMx->CR1 & TIM_CR1_UDIS) == 0) // UPDATE enable { if ((TIMx->CR1 & TIM_CR1_ARPE) == 0) TIMS->RELOAD = TIMx->ARR; // PRELOAD disable - update ARR every itteration + if (TIMS->tx_cnt > TIMS->RELOAD || TIMS->tx_cnt < 0) // OVERFLOW { - TIMS->RELOAD = TIMx->ARR; // RELOAD ARR - if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER - TIMS->tx_cnt = 0; - else if (TIMS->tx_cnt < 0) - TIMS->tx_cnt = TIMx->ARR; + switch (TIMx->CR1 & TIM_CR1_CMS) + { + case TIM_COUNTERMODE_CENTERALIGNED1: + case TIM_COUNTERMODE_CENTERALIGNED2: + case TIM_COUNTERMODE_CENTERALIGNED3: + TIMx->CR1 ^= TIM_CR1_DIR; - if(TIMx->DIER & TIM_DIER_UIE) // if update interrupt enable - call_IRQHandller(TIMx); // call HANDLER + if (TIMx->DIER & TIM_DIER_UIE) // if update interrupt enable + call_IRQHandller(TIMx); // call HANDLER + break; + + // default counting + default: + TIMS->RELOAD = TIMx->ARR; // RELOAD ARR + + if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER + TIMS->tx_cnt = 0; + else if (TIMS->tx_cnt < 0) + TIMS->tx_cnt = TIMx->ARR; + + if (TIMx->DIER & TIM_DIER_UIE) // if update interrupt enable + call_IRQHandller(TIMx); // call HANDLER + break; + } } } } diff --git a/MCU_Wrapper/mcu_wrapper.c b/MCU_Wrapper/mcu_wrapper.c index ef96489..b64b403 100644 --- a/MCU_Wrapper/mcu_wrapper.c +++ b/MCU_Wrapper/mcu_wrapper.c @@ -21,6 +21,7 @@ SIM__MCUHandleTypeDef hmcu; ///< Хендл для управления //-------------------------------------------------------------// //-----------------CONTROLLER SIMULATE FUNCTIONS---------------// /* THREAD FOR MCU APP */ +#ifdef RUN_APP_MAIN_FUNC_THREAD /** * @brief Главная функция приложения МК. * @details Функция с которой начинается выполнение кода МК. Выход из данной функции происходит только в конце симуляции @ref mdlTerminate @@ -35,6 +36,7 @@ unsigned __stdcall MCU_App_Thread(void) { return 0; // end thread // note: this return will reached only at the end of simulation, when all whiles will be skipped due to @ref sim_while } +#endif //RUN_APP_MAIN_FUNC_THREAD /* SIMULATE MCU FOR ONE SIMULATION STEP */ /** * @brief Симуляция МК на один такт симуляции. @@ -56,11 +58,15 @@ void MCU_Step_Simulation(SimStruct* S, time_T time) MCU_Periph_Simulation(); // simulate peripheral + extern void Periph_reInit(void); + Periph_reInit(); +#ifdef RUN_APP_MAIN_FUNC_THREAD ResumeThread(hmcu.hMCUThread); for (int i = DEKSTOP_CYCLES_FOR_MCU_APP; i > 0; i--) { } SuspendThread(hmcu.hMCUThread); +#endif //RUN_APP_MAIN_FUNC_THREAD MCU_writeOutputs(S); // запись портов (по факту запись в буфер. запись в порты в mdlOutputs) } @@ -142,13 +148,15 @@ void SIM_writeOutputs(SimStruct* S) */ void SIM_Initialize_Simulation(void) { +#ifdef RUN_APP_MAIN_FUNC_THREAD // инициализация потока, который будет выполнять код МК hmcu.hMCUThread = (HANDLE)CreateThread(NULL, 0, MCU_App_Thread, 0, CREATE_SUSPENDED, &hmcu.idMCUThread); - +#endif //RUN_APP_MAIN_FUNC_THREAD /* user initialization */ Initialize_Periph_Sim(); - + extern int main_init(void); + main_init(); /* wrapper initialization */ hmcu.SystemClock_step = MCU_CORE_CLOCK * hmcu.SIM_Sample_Time; // set system clock step } diff --git a/MCU_Wrapper/mcu_wrapper_conf.h b/MCU_Wrapper/mcu_wrapper_conf.h index 2a47ed8..f3d066e 100644 --- a/MCU_Wrapper/mcu_wrapper_conf.h +++ b/MCU_Wrapper/mcu_wrapper_conf.h @@ -21,8 +21,8 @@ - для S-Function "simstruc.h" - для потоков **************************************************************************/ -#ifndef _CONTROLLER_H_ -#define _CONTROLLER_H_ +#ifndef _WRAPPER_CONF_H_ +#define _WRAPPER_CONF_H_ // Includes #include "stm32f4xx_matlab_conf.h" // For stm simulate functions @@ -44,12 +44,13 @@ */ // Parametrs of MCU simulator -#define CREATE_SUSPENDED 0x00000004 ///< 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 RUN_APP_MAIN_FUNC_THREAD ///< Enable using thread for MCU main() func #define DEKSTOP_CYCLES_FOR_MCU_APP 0xFF ///< number of for() cycles after which MCU thread would be suspended +#define MCU_CORE_CLOCK 150000000 ///< MCU clock rate for simulation + + #define PORT_WIDTH 16 ///< width of one port #define PORT_NUMB 3 ///< amount of ports - // Parameters of S_Function #define NPARAMS 1 ///< number of input parametrs (only Ts) #define IN_PORT_WIDTH (9) ///< width of input ports @@ -69,6 +70,14 @@ * @{ */ +// 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) +/** + * @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 typedef void* HANDLE; ///< MCU handle typedef /** @@ -92,6 +101,7 @@ extern SIM__MCUHandleTypeDef hmcu; // extern для видимос //-------------------------------------------------------------// //------------------ SIMULINK WHILE DEFINES -----------------// +#ifdef RUN_APP_MAIN_FUNC_THREAD /* DEFINE TO WHILE WITH SIMULINK WHILE */ /** * @brief Redefine C while statement with sim_while() macro. @@ -99,7 +109,7 @@ extern SIM__MCUHandleTypeDef hmcu; // extern для видимос * @details Это while который будет использоваться в симулинке @ref sim_while для подробностей. */ #define while(_expression_) sim_while(_expression_) - +#endif /* SIMULINK WHILE */ /** * @brief While statement for emulate MCU code in Simulink. @@ -152,7 +162,7 @@ void SIM_writeOutput(SimStruct* S); /** MCU_WRAPPER * @} */ -#endif // _CONTROLLER_H_ +#endif // _WRAPPER_CONF_H_ //-------------------------------------------------------------// diff --git a/mcu_test_r2021a.slx b/mcu_test_r2021a.slx index 4c2ee9b11a52e2f5ee6f1a5a5de4e76c6fdaad30..8f4752b4ef78c985a5b72a7d73749c0e1095f2b7 100644 GIT binary patch delta 10290 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 delta 10320 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