Начата работа с документацией

This commit is contained in:
2024-10-11 14:09:52 +03:00
parent ac187eb2d3
commit 6a08b0462d
759 changed files with 370188 additions and 223 deletions

View File

@@ -1,7 +1,12 @@
#include "stm32f4xx_matlab_gpio.h"
#include "modbus.h"
/**
* @brief Write S-Function disc ports from MCU GPIOs.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @details Функция для записи дискретных выходов S-Function из GPIO.
После в @ref SIM_writeOutputs из disc формируются выходы S-Function.
*/
void GPIO_to_SFUNC(real_T* disc)
{
for (int i = 0; i < PORT_WIDTH; i++)
@@ -23,6 +28,12 @@ void GPIO_to_SFUNC(real_T* disc)
}
}
/**
* @brief Write S-Function inputs to MCU.
* @param disc - discrete array of S-Function. Outputs would be written from disc.
* @details Функция для считывания входов S-Function в МК.
Можно абстрагироваться от считывания в GPIO и записывать напрямую в переменные МК.
*/
void SFUNC_to_GPIO(real_T* in)
{
// write pwm ctrl registers

View File

@@ -5,7 +5,20 @@
#include "simstruc.h"
#include "mcu_wrapper_conf.h"
/**
* @addtogroup GPIO_SIMULATOR
* @ingroup MAIN_SIMULATOR
* @brief Simulator for GPIO
* @details Определяет взаимодействие портов МК и оболочки (S-Function)
* @{
*/
/* Функция для записи дискретных выходов S-Function из GPIO */
void SFUNC_to_GPIO(real_T* disc);
/* Функция для считывания входов S-Function в МК */
void GPIO_to_SFUNC(real_T* in);
/** GPIO_SIMULATOR
* @}
*/
#endif // _MATLAB_GPIO_H_

View File

@@ -3,6 +3,14 @@
#include "mcu_wrapper_conf.h"
/**
* @addtogroup RCC_SIMULATOR
* @ingroup MAIN_SIMULATOR
* @brief Simulator for RCC and Clocks
* @details Определ¤ет параметры тактирования МК.
Содержит дефайны дл¤ скипа бесконечных циклов ожидающих выставление флагов
* @{
*/
//#define SYSLCK_Value ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)
@@ -15,8 +23,8 @@
#define ABP2_Value (double)72000000;
#define ABP2_TIMS_Value (double)72000000;
/* Ýòè äåôàéíû äîáàâëåíû â êîä stm32f4xx_hal_rcc.c, ÷òîáû íå ïîïàñòü â áåñêîíå÷íûé öèêë */
/* Ìá ïåðåíåñòè â MCU_Periph_Simulation(), íî ÷åò íå õî÷åòñÿ íàãðóæàòü ñèìóëÿöèþ ýòîé õåðíåé*/
/* Эти дефайны добавлены в код stm32f4xx_hal_rcc.c, чтобы не попасть в бесконечный цикл */
/* Мб перенести в MCU_Periph_Simulation(), но чет не хочется нагружать симуляцию этой херней*/
#define _RCC_SET_FLAG(__FLAG__) \
if(((__FLAG__) >> 5U) == 1U) RCC->CR |= (1U << ((__FLAG__) & RCC_FLAG_MASK)); \
else if(((__FLAG__) >> 5U) == 2U) RCC->BDCR |= (1U << ((__FLAG__) & RCC_FLAG_MASK)); \
@@ -35,4 +43,8 @@ if(_condition_) _RCC_CLEAR_FLAG(_flag_)
#define Clear_Flag_If_Its_Expected(_flag_, _condition_) \
if(_condition_) _RCC_SET_FLAG(_flag_)
/** RCC_SIMULATOR
* @}
*/
#endif // _MATLAB_RCC_H_

View File

@@ -6,11 +6,11 @@
struct SlaveChannels Slave_Channels; // структура для связи и синхронизации таймеров
struct SlaveChannels Slave_Channels; ///< структура для связи и синхронизации таймеров
//----------------------TIMER BASE FUNCTIONS-----------------------//
/* Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */
/** Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */
void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{
Overflow_Check(TIMx, TIMS);
@@ -36,7 +36,7 @@ switch (TIMx->SMCR & TIM_SMCR_SMS) // TIMER MODE
}
}
/* Счет таймера за один такт */
/** Счет таймера за один такт */
void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
if ((TIMx->CR1 & TIM_CR1_DIR) && TIMx->CR1) // up COUNTER and COUNTER ENABLE
@@ -45,7 +45,7 @@ void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
TIMS->tx_cnt += TIMS->tx_step / TIMx->PSC;
TIMx->CNT = (uint32_t)TIMS->tx_cnt;
}
/* Проверка на переполнение и дальнейшая его обработка */
/** Проверка на переполнение и дальнейшая его обработка */
void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
// Переполнение таймера: сброс таймера и вызов прерывания
@@ -70,7 +70,7 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
//----------------------------CHANNELS-----------------------------//
/* Симуляция каналов таймера */
/** Симуляция каналов таймера */
void Channels_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
CC_PWM_Ch1_Simulation(TIMx, TIMS);
@@ -83,7 +83,7 @@ void Channels_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
Write_OC_to_TRGO(TIMx, TIMS);
}
//-----------------CAPTURE COPMARE & PWM FUNCTIONS------------------//
/* Выбор режима CaptureCompare или PWM и симуляция для каждого канала */
/** Выбор режима CaptureCompare или PWM и симуляция для первого канала */
void CC_PWM_Ch1_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR1 & TIM_CCMR1_OC1M)
@@ -125,6 +125,7 @@ switch (TIMx->CCMR1 & TIM_CCMR1_OC1M)
}
}
/** Выбор режима CaptureCompare или PWM и симуляция для второго канала */
void CC_PWM_Ch2_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
@@ -166,6 +167,7 @@ switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
}
}
/** Выбор режима CaptureCompare или PWM и симуляция для третьего канала */
void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
@@ -207,6 +209,7 @@ switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
}
}
/** Выбор режима CaptureCompare или PWM и симуляция для четвертого канала */
void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR2 & TIM_CCMR1_OC2M)
@@ -248,7 +251,7 @@ switch (TIMx->CCMR2 & TIM_CCMR1_OC2M)
}
}
/* Запись каналов таймера в порты GPIO */
/** Запись каналов таймера в порты GPIO */
void Write_OC_to_GPIO(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{
// write gpio pin if need
@@ -322,7 +325,7 @@ void Write_OC_to_GPIO(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
}
}
}
/* Запись результата compare в глабальную структуру с TRIGGER OUTPUT */
/** Запись результата compare в глабальную структуру с TRIGGER OUTPUT */
void Write_OC_to_TRGO(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
// write trigger output from OCxREF pin if need
@@ -368,7 +371,7 @@ void Write_OC_to_TRGO(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
//--------------------MISC (temporary) FUNCTIONS--------------------//
/* Определение источника для запуска таймера в SLAVE MODE */
/** Определение источника для запуска таймера в SLAVE MODE */
void Slave_Mode_Check_Source(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
if (TIMx == TIM2)
@@ -420,7 +423,7 @@ void Slave_Mode_Check_Source(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
//------------------------SIMULINK FUNCTIONS------------------------//
// Симулирование выбранных таймеров
/** Симулирование выбранных через дефайн таймеров */
void Simulate_TIMs(void)
{
#ifdef USE_TIM1
@@ -466,7 +469,7 @@ void Simulate_TIMs(void)
TIM_Simulation(TIM14, &tim14s);
#endif
}
// Деинициализирование выбранных таймеров (вызывается в конце симуляции)
/* Деинициализирование выбранных через дефайн таймеров (вызывается в конце симуляции) */
void TIM_SIM_DEINIT(void)
{
#ifdef USE_TIM1
@@ -555,7 +558,7 @@ void TIM8_BRK_TIM12_IRQHandler(void) {}
void TIM8_TRG_COM_TIM14_IRQHandler(void) {}
#endif
/* Вызов прерывания */
/** Вызов прерывания */
void call_IRQHandller(TIM_TypeDef* TIMx)
{ // calling HANDLER
if ((TIMx == TIM1) || (TIMx == TIM10))

View File

@@ -1,5 +1,5 @@
/**************************************************************************
Äàííûé ôàéë ñîäåðæèò îáúÿâëåíèÿ âñÿêîãî äëÿ ñèìóëÿöèè òàéìåðîâ STM32F407xx.
Данный файл содержит объявления всякого для симуляции таймеров STM32F407xx.
**************************************************************************/
#ifndef _MATLAB_TIM_H_
@@ -9,67 +9,79 @@
#include "stm32f4xx_it.h"
#include "mcu_wrapper_conf.h"
/**
* @addtogroup TIM_SIMULATOR
* @ingroup MAIN_SIMULATOR
* @brief Simulator for TIM
* @details Дефайны и функции для симуляции таймеров.
* @{
*/
/////////////////////////////---DEFINES---/////////////////////////////
/* äåôàéí äëÿ ñäâèãà ìåæäó ïåðâîé è âòîðîé ïîëîâèíîé CCMRx ðåãèñòðîâ */
#define TIM_OCMODE_SECOND_SHIFT TIM_CCMR1_OC2M_Pos - TIM_CCMR1_OC1M_Pos
/** Дефайн для сдвига между первой и второй половиной CCMRx регистров */
#define TIM_OCMODE_SECOND_SHIFT (TIM_CCMR1_OC2M_Pos - TIM_CCMR1_OC1M_Pos)
/* äåôàéíû äëÿ ïðîâåðêè âûâîäèòü ëè êàíàë íà GPIO (íàñòðîåí ëè GPIO íà àëüòåðíàòèâíóþ ôóíêöèþ) */
#define Check_OC1_GPIO_Output(_tims_) (_tims_->Channels.OC1_GPIOx->MODER & (0b11<<(2*_tims_->Channels.OC1_PIN_SHIFT))) == (0b10<<(2*_tims_->Channels.OC1_PIN_SHIFT))
#define Check_OC2_GPIO_Output(_tims_) (_tims_->Channels.OC2_GPIOx->MODER & (0b11<<(2*_tims_->Channels.OC2_PIN_SHIFT))) == (0b10<<(2*_tims_->Channels.OC2_PIN_SHIFT))
#define Check_OC3_GPIO_Output(_tims_) (_tims_->Channels.OC3_GPIOx->MODER & (0b11<<(2*_tims_->Channels.OC3_PIN_SHIFT))) == (0b10<<(2*_tims_->Channels.OC3_PIN_SHIFT))
#define Check_OC4_GPIO_Output(_tims_) (_tims_->Channels.OC4_GPIOx->MODER & (0b11<<(2*_tims_->Channels.OC4_PIN_SHIFT))) == (0b10<<(2*_tims_->Channels.OC4_PIN_SHIFT))
/** Дефайн для проверки выводить ли канал на GPIO (настроен ли GPIO на альтернативную функцию) */
#define Check_OCx_GPIO_Output(_tims_, _OCx_GPIOx_, _OCx_PIN_SHIFT_) (_tims_->Channels._OCx_GPIOx_->MODER & (0b11<<(2*_tims_->Channels._OCx_PIN_SHIFT_))) == (0b10<<(2*_tims_->Channels._OCx_PIN_SHIFT_))
/** Дефайн для проверки выводить ли канал 1 на GPIO (настроен ли GPIO на альтернативную функцию) */
#define Check_OC1_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC1_GPIOx, OC1_PIN_SHIFT)
/** Дефайн для проверки выводить ли канал 2 на GPIO (настроен ли GPIO на альтернативную функцию) */
#define Check_OC2_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC2_GPIOx, OC2_PIN_SHIFT)
/** Дефайн для проверки выводить ли канал 3 на GPIO (настроен ли GPIO на альтернативную функцию) */
#define Check_OC3_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC3_GPIOx, OC3_PIN_SHIFT)
/** Дефайн для проверки выводить ли канал 4 на GPIO (настроен ли GPIO на альтернативную функцию) */
#define Check_OC4_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC4_GPIOx, OC4_PIN_SHIFT)
/////////////////////////////////////////////////////////////////////
///////////////////////////---STRUCTURES---//////////////////////////
/* Ñòðóêòóðà äëÿ óïðàâëåíèÿ Ñëåéâ Òàéìåðàìè */
/** Структура для управления Слейв Таймерами */
struct SlaveChannels
{
unsigned TIM1_TRGO : 1;
unsigned TIM2_TRGO : 1;
unsigned TIM3_TRGO : 1;
unsigned TIM4_TRGO : 1;
unsigned TIM5_TRGO : 1;
unsigned TIM6_TRGO : 1;
unsigned TIM7_TRGO : 1;
unsigned TIM8_TRGO : 1;
unsigned TIM1_TRGO : 1; ///< Синган синхронизации таймера 1
unsigned TIM2_TRGO : 1; ///< Синган синхронизации таймера 2
unsigned TIM3_TRGO : 1; ///< Синган синхронизации таймера 3
unsigned TIM4_TRGO : 1; ///< Синган синхронизации таймера 4
unsigned TIM5_TRGO : 1; ///< Синган синхронизации таймера 5
unsigned TIM6_TRGO : 1; ///< Синган синхронизации таймера 6
unsigned TIM7_TRGO : 1; ///< Синган синхронизации таймера 7
unsigned TIM8_TRGO : 1; ///< Синган синхронизации таймера 8
};
/* Ñòðóêòóðà äëÿ ìîäåëèðîâàíèÿ êàíàëîâ òàéìåðà */
/** Структура для моделирования каналов таймера */
struct Channels_Sim
{
// ñâÿçàííûå ñ êàíàëàìè GPIO ïîðòû è ïèíû
GPIO_TypeDef *OC1_GPIOx;
uint32_t OC1_PIN_SHIFT;
// Каналы таймера
unsigned OC1REF:1; ///< Первый канал
unsigned OC2REF:1; ///< Второй канал
unsigned OC3REF:1; ///< Третьий канал
unsigned OC4REF:1; ///< Четвертый канал
GPIO_TypeDef *OC2_GPIOx;
uint32_t OC2_PIN_SHIFT;
// связанные с каналами GPIO порты и пины
GPIO_TypeDef *OC1_GPIOx; ///< Порт первого канала
uint32_t OC1_PIN_SHIFT; ///< Пин первого канала
GPIO_TypeDef *OC3_GPIOx;
uint32_t OC3_PIN_SHIFT;
GPIO_TypeDef *OC2_GPIOx; ///< Порт второго канала
uint32_t OC2_PIN_SHIFT; ///< Пин второго канала
GPIO_TypeDef *OC4_GPIOx;
uint32_t OC4_PIN_SHIFT;
GPIO_TypeDef *OC3_GPIOx; ///< Порт третьего канала
uint32_t OC3_PIN_SHIFT; ///< Пин третьего канала
GPIO_TypeDef *OC4_GPIOx; ///< Порт четвертого канала
uint32_t OC4_PIN_SHIFT; ///< Пин четвертого канала
// Êàíàëû òàéìåðà
unsigned OC1REF:1;
unsigned OC2REF:1;
unsigned OC3REF:1;
unsigned OC4REF:1;
};
/* Ñòðóêòóðà äëÿ ìîäåëèðîâàíèÿ òàéìåðà */
/** Структура для моделирования таймера */
struct TIM_Sim
{
double tx_cnt; // ñ÷åò÷èê òàéìåðà
double tx_step; // øàã ñ÷åòà çà îäèí øàã ñèìóëÿöèè
int RELOAD; // áóôåð, åñëè PRELOAD = 1
struct Channels_Sim Channels; // ñòðóêòóðà äëÿ ñèìóëÿöèè êàíàëîâ
double tx_cnt; ///< Счетчик таймера
double tx_step; ///< Шаг счета за один шаг симуляции
int RELOAD; ///< Буфер, если PRELOAD = 1
struct Channels_Sim Channels; ///< Структура для симуляции каналов
};
/////////////////////////////////////////////////////////////////////
@@ -78,43 +90,46 @@ struct TIM_Sim
///////////////////////////---FUNCTIONS---///////////////////////////
//----------------------TIMER BASE FUNCTIONS-----------------------//
/* Áàçîâàÿ ôóíêöèÿ äëÿ ñèìóëÿöèè òàéìåðà: îíà âûçûâàåòñÿ êàæäûé øàã ñèìóëÿöèè */
/* Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */
void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS);
/* Ñ÷åò òàéìåðà çà îäèí òàêò */
/* Счет таймера за один такт */
void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
/* Ïðîâåðêà íà ïåðåïîëíåíèå è äàëüíåéøàÿ åãî îáðàáîòêà */
/* Проверка на переполнение и дальнейшая его обработка */
void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
/* Âûçîâ ïðåðûâàíèÿ */
/* Вызов прерывания */
void call_IRQHandller(TIM_TypeDef *TIMx);
//-----------------------------------------------------------------//
//------------------------CHANNELS FUNCTIONS-----------------------//
/* Ñèìóëÿöèÿ êàíàëîâ òàéìåðà */
/* Симуляция каналов таймера */
void Channels_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS);
/*---------------- - CAPTURE COPMARE & PWM FUNCTIONS------------------*/
/* Âûáîð ðåæèìà CaptureCompare èëè PWM è ñèìóëÿöèÿ äëÿ êàæäîãî êàíàëà */
/* Выбор режима CaptureCompare или PWM и симуляция для каждого канала */
void CC_PWM_Ch1_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
void CC_PWM_Ch2_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
void CC_PWM_Ch3_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
void CC_PWM_Ch4_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
/* Çàïèñü êàíàëîâ òàéìåðà â ïîðòû GPIO */
/* Запись каналов таймера в порты GPIO */
void Write_OC_to_GPIO(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
/* Çàïèñü ðåçóëüòàòà compare â ãëàáàëüíóþ ñòðóêòóðó ñ TRIGGER OUTPUT */
/* Запись результата compare в глабальную структуру с TRIGGER OUTPUT */
void Write_OC_to_TRGO(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
//------------------------------------------------------------------//
//--------------------MISC (temporary) FUNCTIONS--------------------//
/* Îïðåäåëåíèå èñòî÷íèêà äëÿ çàïóñêà òàéìåðà â SLAVE MODE */
/* Определение источника для запуска таймера в SLAVE MODE */
void Slave_Mode_Check_Source(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
//------------------------------------------------------------------//
//------------------------SIMULINK FUNCTIONS------------------------//
// Ñèìóëèðîâàíèå âûáðàííûõ òàéìåðîâ
// Симулирование выбранных таймеров
void Simulate_TIMs(void);
// Äåèíèöèàëèçèðîâàíèå âûáðàííûõ òàéìåðîâ (âûçûâàåòñÿ â êîíöå ñèìóëÿöèè)
// Деинициализирование выбранных таймеров (вызывается в конце симуляции)
void TIM_SIM_DEINIT(void);
//------------------------------------------------------------------//
/** TIM_SIMULATOR
* @}
*/
#endif // _MATLAB_TIM_H_

View File

@@ -7,6 +7,13 @@
**************************************************************************/
#include "stm32f407xx_matlab.h"
/**
* @addtogroup PERIPH_VARS_FOR_DEBUG
* @ingroup STM_SIMULATION
* @brief Varables of peripheral registers for debug watches
* @{
*/
TIM_TypeDef* tim2 = TIM2;
TIM_TypeDef* tim3 = TIM3;
@@ -91,4 +98,9 @@ FSMC_Bank2_3_TypeDef* fsmc_bank2_3_r = FSMC_Bank2_3;
FSMC_Bank4_TypeDef* fsmc_bank4_r = FSMC_Bank4;
DBGMCU_TypeDef* dbgmcu = DBGMCU;
USB_OTG_GlobalTypeDef* usb_otg_fs_periph = USB_OTG_FS;
USB_OTG_GlobalTypeDef* usb_otg_hs_periph = USB_OTG_HS;
USB_OTG_GlobalTypeDef* usb_otg_hs_periph = USB_OTG_HS;
/** PERIPH_VARS_FOR_DEBUG
* @}
*/