Сделана документация на то, что есть сейчас

This commit is contained in:
2024-10-16 16:03:37 +03:00
parent 6a08b0462d
commit 8939ab257f
750 changed files with 10725 additions and 350180 deletions

View File

@@ -1,13 +1,23 @@
/**
**************************************************************************
* @file arm_defines.h
* @brief Заголовочный файл портирующий ARM дефайны.
**************************************************************************
@details
Данный файл переопределяет ARM дефайны так, чтобы они компилировались
MSVC. Дефайны представляют собой или заглушку или заменены выражением
с аналогичным ARM компилятору функционалом.
**************************************************************************/
#define __disable_irq()
/* CMSIS compiler specific defines */
#ifndef __ASM
#define __ASM __asm
#endif
#ifndef __IO
#define __IO volatile
#endif
#ifndef __inline
#define __inline inline
#endif
@@ -31,11 +41,13 @@
#define __USED __attribute__((used))
#endif
#ifndef __WEAK
#define __WEAK __declspec(selectany)
// #define __weak __WEAK
#endif
#ifndef __weak
#define __weak
#endif
#ifndef __PACKED
#define __PACKED __attribute__((packed))
@@ -76,21 +88,8 @@
#ifndef __RESTRICT
#define __RESTRICT __restrict
#endif
#ifndef __weak
#define __weak
#endif
//#define __ASM()
//#define __DSB()
//#define __ISB()
//#define __NOP()
//#define __WFI()
//#define __SEV()
//#define __WFE()
//#define __DMB()
/* ########################## Core Instruction Access ######################### */
/**
\brief No Operation
\details No Operation does nothing. This instruction can be used for code alignment purposes.

View File

@@ -1,10 +1,18 @@
/************************************************************************
/**
**************************************************************************
* @file core_cm4_matlab.h
* @brief Заголовочный файл ядра Core CM4 для MATLAB.
**************************************************************************
@details
Данный файл является копией core_cm4.h, только первые ~160 строк, которые
определяют компилятор АРМ, удалены.
МАТЛАБ компилирует через код через комплилятор MSVC для блока S-Function
Также добавлена структура имитирующая память ядра (~1360)
Также добавлена инклюд с имитирацией памяти ядра (~10)
**************************************************************************/
#ifndef __CMSIS_GENERIC
#include "stm32f407xx_matlab_memory.h"
/* IO definitions (access restrictions to peripheral registers) */
/**
\defgroup CMSIS_glob_defs CMSIS Global Defines
@@ -1344,52 +1352,7 @@ typedef struct
/*@} end of group CMSIS_core_bitfield */
/**
\ingroup CMSIS_core_register
\defgroup CMSIS_core_base Core Definitions
\brief Definitions for base addresses, unions, and structures.
@{
*/
/* Memory mapping of Core Hardware */
#define SCS_BASE_SHIFT (0x0000E000UL) /*!< System Control Space Base Address */
#define ITM_BASE_SHIFT (0x00000000UL) /*!< ITM Base Address */
#define DWT_BASE_SHIFT (0x00001000UL) /*!< DWT Base Address */
#define TPI_BASE_SHIFT (0x00040000UL) /*!< TPI Base Address */
#define CoreDebug_BASE_SHIFT (0x0000EDF0UL) /*!< Core Debug Base Address */
typedef struct _cortex_memory
{
uint8_t CORTEX_PERIPH_BASE[0xE0100000 - 0xE0000000];
}MCU_CortexMemoryTypeDef;
extern MCU_CortexMemoryTypeDef MCU_CORTEX_MEM;
#define SCS_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< System Control Space Base Address */
#define ITM_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< ITM Base Address */
#define DWT_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< DWT Base Address */
#define TPI_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< TPI Base Address */
#define CoreDebug_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< Core Debug Base Address */
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */
#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */
#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */
#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
#define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */
#define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */
#endif
#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */
#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */
/*@} */
/*@} */

View File

@@ -1,37 +1,20 @@
/************************************************************************
/**
**************************************************************************
* @file stm32f4xx_matlab.h
* @brief Заголовочный файл для работы с STM32F4xx в MATLAB.
**************************************************************************
@details
Данный файл является копией stm32f407xx.h с некоторыми изменениями:
- добавлен кейловский stdint.h (через "", вместо <>) (~170)
- добавлен cmsis_armcc_matlab.h с дефайнами из оригинального cmsis_armcc.h (~170)
- добавлен core_cm4.h с дефайнами из оригинального core_cm4.h (~170)
- добавлена структура имитирующая память МК (для работы дефайнов адресов регистров) (~950)
(надо допилить)
Необходимо допилить поддержку всех дефайнов, которые объявляются в
arm_acle.h, arm_compat.h, cmsis_armclang.h, cmsis_compiler.h, cmsis_version.h,
core_cm4.h, mpu_armv7.h, stddef
**************************************************************************/
/**
******************************************************************************
* @file stm32f407xx.h
* @author MCD Application Team
* @brief CMSIS STM32F407xx Device Peripheral Access Layer Header File.
*
* This file contains:
* - Data structures and the address mapping for all peripherals
* - peripherals registers declarations and bits definition
* - Macros to access peripherals registers hardware
*
******************************************************************************
* @attention
*
* Copyright (c) 2017 STMicroelectronics.
* All rights reserved
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/** @addtogroup CMSIS_Device
* @{
@@ -912,84 +895,9 @@ typedef struct
* @}
*/
/** @addtogroup Peripheral_memory_map
* @{
*/
#define FLASH_BASE_SHIFT 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */
#define FLASH_END_SHIFT 0x080FFFFFUL /*!< FLASH end address */
#define CCMDATARAM_BASE_SHIFT 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */
#define CCMDATARAM_END_SHIFT 0x1000FFFFUL /*!< CCM data RAM end address */
#define FLASH_OTP_BASE_SHIFT 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define FLASH_OTP_END_SHIFT 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define SRAM1_BASE_SHIFT 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */
#define SRAM2_BASE_SHIFT 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */
#define SRAM1_BB_BASE_SHIFT 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */
#define SRAM2_BB_BASE_SHIFT 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */
#define PERIPH_BASE_SHIFT 0x40000000UL /*!< Peripheral base address in the alias region */
#define BKPSRAM_BASE_SHIFT 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */
#define PERIPH_BB_BASE_SHIFT 0x42000000UL /*!< Peripheral base address in the bit-band region */
#define BKPSRAM_BB_BASE_SHIFT 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */
#define FSMC_R_BASE_SHIFT 0xA0000000UL /*!< FSMC registers base address */
#define MCU_MEM_END 0xA0000FFFUL /*!< CCM data RAM end address */
#define CCMDATARAM_SIZE 0x10000UL /* (64 KB) */
#define SRAM1_SIZE 0x1C000UL /* (112 KB) */
#define SRAM2_SIZE 0x4000UL /* (16 KB) */
#define BKPSRAM_SIZE 0x1000UL /* (4 KB) */
#define FLASH_SIZE (CCMDATARAM_BASE_SHIFT - FLASH_BASE_SHIFT)
//#define CCMDATARAM_SIZE (FLASH_OTP_BASE_SHIFT - CCMDATARAM_BASE_SHIFT)
#define FLASH_OTP_SIZE (SRAM1_BASE_SHIFT - FLASH_OTP_BASE_SHIFT)
//#define SRAM1_SIZE (SRAM2_BASE_SHIFT - SRAM1_BASE_SHIFT)
//#define SRAM2_SIZE (SRAM1_BB_BASE_SHIFT - SRAM2_BASE_SHIFT)
#define SRAM1_BB_SIZE (SRAM2_BB_BASE_SHIFT - SRAM1_BB_BASE_SHIFT)
#define SRAM2_BB_SIZE (PERIPH_BASE_SHIFT - SRAM2_BB_BASE_SHIFT)
#define PERIPH_SIZE (BKPSRAM_BASE_SHIFT - PERIPH_BASE_SHIFT)
//#define BKPSRAM_SIZE (PERIPH_BB_BASE_SHIFT - BKPSRAM_BASE_SHIFT)
#define PERIPH_BB_SIZE (BKPSRAM_BB_BASE_SHIFT - PERIPH_BB_BASE_SHIFT)
//#define BKPSRAM_BB_SIZE (FSMC_R_BASE_SHIFT - BKPSRAM_BB_BASE_SHIFT)
#define FSMC_R_SIZE (MCU_MEM_END - FSMC_R_BASE_SHIFT)
typedef struct _memory
{
//uint8_t RESERVED[FLASH_BASE_SHIFT];
uint8_t FLASH_BASE[FLASH_SIZE];
uint8_t CCMDATARAM_BASE[CCMDATARAM_SIZE];
uint8_t FLASH_OTP_BASE[FLASH_OTP_SIZE];
uint8_t SRAM1_BASE[SRAM1_SIZE];
uint8_t SRAM2_BASE[SRAM2_SIZE];
uint8_t SRAM1_BB_BASE[SRAM1_SIZE];
uint8_t SRAM2_BB_BASE[SRAM2_SIZE];
uint8_t PERIPH_BASE[PERIPH_SIZE];
uint8_t BKPSRAM_BASE[BKPSRAM_SIZE];
uint8_t PERIPH_BB_BASE[PERIPH_BB_SIZE];
uint8_t BKPSRAM_BB_BASE[BKPSRAM_SIZE];
uint8_t FSMC_R_BASE[FSMC_R_SIZE];
}MCU_MemoryTypeDef;
extern MCU_MemoryTypeDef MCU_MEM;
DBGMCU_TypeDef DEBUG_MCU;
/** @addtogroup Peripheral_memory_map
* @{
*/
#define FLASH_BASE (MCU_MEM.CCMDATARAM_BASE) /*!< FLASH(up to 1 MB) base address in the alias region */
#define CCMDATARAM_BASE (MCU_MEM.CCMDATARAM_BASE) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */
#define SRAM1_BASE (MCU_MEM.SRAM1_BASE) /*!< SRAM1(112 KB) base address in the alias region */
#define SRAM2_BASE (MCU_MEM.SRAM2_BASE) /*!< SRAM2(16 KB) base address in the alias region */
#define PERIPH_BASE (MCU_MEM.PERIPH_BASE) /*!< Peripheral base address in the alias region */
#define BKPSRAM_BASE (MCU_MEM.BKPSRAM_BASE) /*!< Backup SRAM(4 KB) base address in the alias region */
#define FSMC_R_BASE (MCU_MEM.FSMC_R_BASE) /*!< FSMC registers base address */
#define SRAM1_BB_BASE (MCU_MEM.SRAM1_BB_BASE) /*!< SRAM1(112 KB) base address in the bit-band region */
#define SRAM2_BB_BASE (MCU_MEM.SRAM2_BB_BASE) /*!< SRAM2(16 KB) base address in the bit-band region */
#define PERIPH_BB_BASE (MCU_MEM.PERIPH_BB_BASE) /*!< Peripheral base address in the bit-band region */
#define BKPSRAM_BB_BASE (MCU_MEM.BKPSRAM_BB_BASE) /*!< Backup SRAM(4 KB) base address in the bit-band region */
#define FLASH_END (MCU_MEM.FLASH_END) /*!< FLASH end address */
#define FLASH_OTP_BASE (MCU_MEM.FLASH_OTP_BASE) /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define FLASH_OTP_END (MCU_MEM.FLASH_OTP_END) /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define CCMDATARAM_END (MCU_MEM.CCMDATARAM_END) /*!< CCM data RAM end address */
/* Legacy defines */
#define SRAM_BASE SRAM1_BASE
@@ -1097,8 +1005,6 @@ DBGMCU_TypeDef DEBUG_MCU;
#define FSMC_Bank4_R_BASE (FSMC_R_BASE + 0x00A0UL)
/*!< Debug MCU registers base address */
#define DBGMCU_BASE (&DEBUG_MCU)
/*!< USB registers base address */
#define USB_OTG_HS_PERIPH_BASE 0x40040000UL
#define USB_OTG_FS_PERIPH_BASE 0x50000000UL

View File

@@ -0,0 +1,146 @@
/**
**************************************************************************
* @file stm32f407xx_matlab_memory.h
* @brief Заголовочный файл для определения памяти МК STM32F4xx.
**************************************************************************
@details
В данном файле переопределяются дефайны памяти STM32 таким образом, чтобы
к ним можно было обратиться в MATLAB.
Конкретно, создается структуруа имитирующая память, и далее дефайны определяются
так, чтобы обращаться к этой структуре, а не по абсолютному адресу.
**************************************************************************/
/**
\defgroup CMSIS_core_base Core Definitions
\brief Definitions for base addresses, unions, and structures.
@{
*/
/* Memory mapping of Core Hardware */
#define SCS_BASE_SHIFT (0x0000E000UL) /*!< System Control Space Base Address */
#define ITM_BASE_SHIFT (0x00000000UL) /*!< ITM Base Address */
#define DWT_BASE_SHIFT (0x00001000UL) /*!< DWT Base Address */
#define TPI_BASE_SHIFT (0x00040000UL) /*!< TPI Base Address */
#define CoreDebug_BASE_SHIFT (0x0000EDF0UL) /*!< Core Debug Base Address */
typedef struct _cortex_memory
{
uint8_t CORTEX_PERIPH_BASE[0xE0100000 - 0xE0000000];
}MCU_CortexMemoryTypeDef;
extern MCU_CortexMemoryTypeDef MCU_CORTEX_MEM;
#define SCS_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< System Control Space Base Address */
#define ITM_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< ITM Base Address */
#define DWT_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< DWT Base Address */
#define TPI_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< TPI Base Address */
#define CoreDebug_BASE (MCU_CORTEX_MEM.CORTEX_PERIPH_BASE) + SCS_BASE_SHIFT /*!< Core Debug Base Address */
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */
#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */
#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */
#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)
#define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */
#define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */
#endif
#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */
#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */
/**
* @}
*/
/** @ingroup CMSIS_core_base
* @addtogroup Peripheral_memory_map Peripheral Memory Map
* @{
*/
#define FLASH_BASE_SHIFT 0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region */
#define FLASH_END_SHIFT 0x080FFFFFUL /*!< FLASH end address */
#define CCMDATARAM_BASE_SHIFT 0x10000000UL /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */
#define CCMDATARAM_END_SHIFT 0x1000FFFFUL /*!< CCM data RAM end address */
#define FLASH_OTP_BASE_SHIFT 0x1FFF7800UL /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define FLASH_OTP_END_SHIFT 0x1FFF7A0FUL /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define SRAM1_BASE_SHIFT 0x20000000UL /*!< SRAM1(112 KB) base address in the alias region */
#define SRAM2_BASE_SHIFT 0x2001C000UL /*!< SRAM2(16 KB) base address in the alias region */
#define SRAM1_BB_BASE_SHIFT 0x22000000UL /*!< SRAM1(112 KB) base address in the bit-band region */
#define SRAM2_BB_BASE_SHIFT 0x22380000UL /*!< SRAM2(16 KB) base address in the bit-band region */
#define PERIPH_BASE_SHIFT 0x40000000UL /*!< Peripheral base address in the alias region */
#define BKPSRAM_BASE_SHIFT 0x40024000UL /*!< Backup SRAM(4 KB) base address in the alias region */
#define PERIPH_BB_BASE_SHIFT 0x42000000UL /*!< Peripheral base address in the bit-band region */
#define BKPSRAM_BB_BASE_SHIFT 0x42480000UL /*!< Backup SRAM(4 KB) base address in the bit-band region */
#define FSMC_R_BASE_SHIFT 0xA0000000UL /*!< FSMC registers base address */
#define MCU_MEM_END 0xA0000FFFUL /*!< CCM data RAM end address */
#define CCMDATARAM_SIZE 0x10000UL /* (64 KB) */
#define SRAM1_SIZE 0x1C000UL /* (112 KB) */
#define SRAM2_SIZE 0x4000UL /* (16 KB) */
#define BKPSRAM_SIZE 0x1000UL /* (4 KB) */
#define FLASH_SIZE (CCMDATARAM_BASE_SHIFT - FLASH_BASE_SHIFT)
//#define CCMDATARAM_SIZE (FLASH_OTP_BASE_SHIFT - CCMDATARAM_BASE_SHIFT)
#define FLASH_OTP_SIZE (SRAM1_BASE_SHIFT - FLASH_OTP_BASE_SHIFT)
//#define SRAM1_SIZE (SRAM2_BASE_SHIFT - SRAM1_BASE_SHIFT)
//#define SRAM2_SIZE (SRAM1_BB_BASE_SHIFT - SRAM2_BASE_SHIFT)
#define SRAM1_BB_SIZE (SRAM2_BB_BASE_SHIFT - SRAM1_BB_BASE_SHIFT)
#define SRAM2_BB_SIZE (PERIPH_BASE_SHIFT - SRAM2_BB_BASE_SHIFT)
#define PERIPH_SIZE (BKPSRAM_BASE_SHIFT - PERIPH_BASE_SHIFT)
//#define BKPSRAM_SIZE (PERIPH_BB_BASE_SHIFT - BKPSRAM_BASE_SHIFT)
#define PERIPH_BB_SIZE (BKPSRAM_BB_BASE_SHIFT - PERIPH_BB_BASE_SHIFT)
//#define BKPSRAM_BB_SIZE (FSMC_R_BASE_SHIFT - BKPSRAM_BB_BASE_SHIFT)
#define FSMC_R_SIZE (MCU_MEM_END - FSMC_R_BASE_SHIFT)
#define DEBUG_MCU_SIZE (2)
typedef struct _memory
{
//uint8_t RESERVED[FLASH_BASE_SHIFT];
uint8_t FLASH_BASE[FLASH_SIZE];
uint8_t CCMDATARAM_BASE[CCMDATARAM_SIZE];
uint8_t FLASH_OTP_BASE[FLASH_OTP_SIZE];
uint8_t SRAM1_BASE[SRAM1_SIZE];
uint8_t SRAM2_BASE[SRAM2_SIZE];
uint8_t SRAM1_BB_BASE[SRAM1_SIZE];
uint8_t SRAM2_BB_BASE[SRAM2_SIZE];
uint8_t PERIPH_BASE[PERIPH_SIZE];
uint8_t BKPSRAM_BASE[BKPSRAM_SIZE];
uint8_t PERIPH_BB_BASE[PERIPH_BB_SIZE];
uint8_t BKPSRAM_BB_BASE[BKPSRAM_SIZE];
uint8_t FSMC_R_BASE[FSMC_R_SIZE];
uint8_t DEBUG_MCU_BASE[DEBUG_MCU_SIZE];
}MCU_MemoryTypeDef;
extern MCU_MemoryTypeDef MCU_MEM;
#define FLASH_BASE (MCU_MEM.CCMDATARAM_BASE) /*!< FLASH(up to 1 MB) base address in the alias region */
#define CCMDATARAM_BASE (MCU_MEM.CCMDATARAM_BASE) /*!< CCM(core coupled memory) data RAM(64 KB) base address in the alias region */
#define SRAM1_BASE (MCU_MEM.SRAM1_BASE) /*!< SRAM1(112 KB) base address in the alias region */
#define SRAM2_BASE (MCU_MEM.SRAM2_BASE) /*!< SRAM2(16 KB) base address in the alias region */
#define PERIPH_BASE (MCU_MEM.PERIPH_BASE) /*!< Peripheral base address in the alias region */
#define BKPSRAM_BASE (MCU_MEM.BKPSRAM_BASE) /*!< Backup SRAM(4 KB) base address in the alias region */
#define FSMC_R_BASE (MCU_MEM.FSMC_R_BASE) /*!< FSMC registers base address */
#define SRAM1_BB_BASE (MCU_MEM.SRAM1_BB_BASE) /*!< SRAM1(112 KB) base address in the bit-band region */
#define SRAM2_BB_BASE (MCU_MEM.SRAM2_BB_BASE) /*!< SRAM2(16 KB) base address in the bit-band region */
#define PERIPH_BB_BASE (MCU_MEM.PERIPH_BB_BASE) /*!< Peripheral base address in the bit-band region */
#define BKPSRAM_BB_BASE (MCU_MEM.BKPSRAM_BB_BASE) /*!< Backup SRAM(4 KB) base address in the bit-band region */
#define FLASH_END (MCU_MEM.FLASH_END) /*!< FLASH end address */
#define FLASH_OTP_BASE (MCU_MEM.FLASH_OTP_BASE) /*!< Base address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define FLASH_OTP_END (MCU_MEM.FLASH_OTP_END) /*!< End address of : (up to 528 Bytes) embedded FLASH OTP Area */
#define CCMDATARAM_END (MCU_MEM.CCMDATARAM_END) /*!< CCM data RAM end address */
/*!< Debug MCU registers base address */
#define DBGMCU_BASE (MCU_MEM.DEBUG_MCU_BASE)
/**
* @}
*/

View File

@@ -1,69 +0,0 @@
#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++)
{
if (GPIOB->ODR & (1 << i))
{
disc[i] = 1;
}
if (GPIOD->ODR & (1 << i))
{
disc[PORT_WIDTH + i] = 1;
}
if (GPIOE->ODR & (1 << i))
{
disc[2*PORT_WIDTH + i] = 1;
}
}
}
/**
* @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
for (int i = 0; i < 5; i++)
{
pwm_ctrl[i] = in[i];
}
// write pwm ctrl coils
if (in[5] > 0.5)
{
MB_Set_Coil_Local(coils_regs, COIL_PWM_DC_MODE);
}
else
{
MB_Reset_Coil_Local(coils_regs, COIL_PWM_DC_MODE);
}
if (in[6] > 0.5)
{
MB_Set_Coil_Local(coils_regs, COIL_PWM_CH_MODE);
}
else
{
MB_Reset_Coil_Local(coils_regs, COIL_PWM_CH_MODE);
}
if (in[7] > 0.5)
{
MB_Set_Coil_Local(coils_regs, COIL_PWM_PHASE_MODE);
}
else
{
MB_Reset_Coil_Local(coils_regs, COIL_PWM_PHASE_MODE);
}
}

View File

@@ -1,24 +0,0 @@
#ifndef _MATLAB_GPIO_H_
#define _MATLAB_GPIO_H_
#include "stm32f4xx_hal.h"
#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

@@ -0,0 +1,81 @@
/**
**************************************************************************
* @file stm32f4xx_matlab_gpio.c
* @brief Исходный код симулятора портов.
**************************************************************************
@details
Данный файл содержит функции для симуляции портов STM32F407xx.
**************************************************************************/
#include "stm32f4xx_matlab_gpio.h"
#include "modbus.h"
/**
* @brief Запись буфера выходов S-Function из GPIO.
* @param out_buff - указатель на буфер выходов S-Function.
* @details Функция для записи буфера выходов S-Function из GPIO.
После в @ref SIM_writeOutputs() из out_buff формируются выходы S-Function.
* @attention Тело функции пишется пользователем!
*/
void GPIO_to_SFUNC(real_T* out_buff)
{
for (int i = 0; i < PORT_WIDTH; i++)
{
if (GPIOB->ODR & (1 << i))
{
out_buff[i] = 1;
}
if (GPIOD->ODR & (1 << i))
{
out_buff[PORT_WIDTH + i] = 1;
}
if (GPIOE->ODR & (1 << i))
{
out_buff[2*PORT_WIDTH + i] = 1;
}
}
}
/**
* @brief Считывание входов S-Function в МК.
* @param out_buff - указатель на буфер выходов S-Function.
* @details Функция для считывания входов S-Function в МК.
Можно абстрагироваться от считывания в GPIO и записывать напрямую в переменные МК.
* @attention Тело функции пишется пользователем!
*/
void SFUNC_to_GPIO(real_T* in)
{
// write pwm ctrl registers
for (int i = 0; i < 5; i++)
{
pwm_ctrl[i] = in[i];
}
// write pwm ctrl coils
if (in[5] > 0.5)
{
MB_Set_Coil_Local(coils_regs, COIL_PWM_DC_MODE);
}
else
{
MB_Reset_Coil_Local(coils_regs, COIL_PWM_DC_MODE);
}
if (in[6] > 0.5)
{
MB_Set_Coil_Local(coils_regs, COIL_PWM_CH_MODE);
}
else
{
MB_Reset_Coil_Local(coils_regs, COIL_PWM_CH_MODE);
}
if (in[7] > 0.5)
{
MB_Set_Coil_Local(coils_regs, COIL_PWM_PHASE_MODE);
}
else
{
MB_Reset_Coil_Local(coils_regs, COIL_PWM_PHASE_MODE);
}
}

View File

@@ -0,0 +1,32 @@
/**
**************************************************************************
* @file stm32f4xx_matlab_gpio.h
* @brief Заголовочный файл для симулятора портов.
**************************************************************************
@details
Данный файл содержит объявления всякого для симуляции портов STM32F407xx.
**************************************************************************/
#ifndef _MATLAB_GPIO_H_
#define _MATLAB_GPIO_H_
#include "stm32f4xx_hal.h"
#include "simstruc.h"
#include "mcu_wrapper_conf.h"
/**
* @addtogroup GPIO_SIMULATOR GPIO Simulator
* @ingroup MAIN_SIMULATOR
* @brief Симулятор для портов ввода-вывода
* @details Определяет взаимодействие портов МК и оболочки (S-Function)
* @{
*/
/* Функция для записи буфера выходов S-Function из GPIO */
void SFUNC_to_GPIO(real_T* out_buff);
/* Функция для считывания входов S-Function в МК */
void GPIO_to_SFUNC(real_T* in);
/** GPIO_SIMULATOR
* @}
*/
#endif // _MATLAB_GPIO_H_

View File

@@ -0,0 +1,8 @@
/*
**************************************************************************
* @file stm32f4xx_matlab_rcc.c
* @brief Èñõîäíûé êîä ñèìóëÿòîðà êëîêà.
**************************************************************************
@details
Äàííûé ôàéë ñîäåðæèò ôóíêöèè äëÿ ñèìóëÿöèè êëîêà STM32F407xx.
**************************************************************************/

View File

@@ -1,12 +1,20 @@
/**
**************************************************************************
* @file stm32f4xx_matlab_rcc.h
* @brief Заголовочный файл для симулятора клока.
**************************************************************************
@details
Данный файл содержит объявления всякого для симуляции клока STM32F407xx.
**************************************************************************/
#ifndef _MATLAB_RCC_H_
#define _MATLAB_RCC_H_
#include "mcu_wrapper_conf.h"
/**
* @addtogroup RCC_SIMULATOR
* @addtogroup RCC_SIMULATOR RCC Simulator
* @ingroup MAIN_SIMULATOR
* @brief Simulator for RCC and Clocks
* @brief Симулятор для RCC и часов таймера
* @details Определ¤ет параметры тактирования МК.
Содержит дефайны дл¤ скипа бесконечных циклов ожидающих выставление флагов
* @{
@@ -24,7 +32,7 @@
#define ABP2_TIMS_Value (double)72000000;
/* Эти дефайны добавлены в код stm32f4xx_hal_rcc.c, чтобы не попасть в бесконечный цикл */
/* Мб перенести в MCU_Periph_Simulation(), но чет не хочется нагружать симуляцию этой херней*/
/* Мб перенести в 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)); \

View File

@@ -1,6 +1,10 @@
/**************************************************************************
/**
**************************************************************************
* @file stm32f4xx_matlab_tim.c
* @brief Исходный код симулятора таймеров.
**************************************************************************
@details
Данный файл содержит функции для симуляции таймеров STM32F407xx.
**************************************************************************/
#include "stm32f4xx_matlab_tim.h"
@@ -10,7 +14,17 @@ struct SlaveChannels Slave_Channels; ///< структура для связи
//----------------------TIMER BASE FUNCTIONS-----------------------//
/** Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */
/**
* @brief Симуляция таймера на один такт симуляции.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Это базовая функция для симуляции таймера: она вызывается каждый шаг симуляции
* и вызывает все другие функции, необходимые для симуляции:
* - Overflow_Check()
* - Slave_Mode_Check_Source()
* - TIMx_Count()
* - Channels_Simulation()
*/
void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{
Overflow_Check(TIMx, TIMS);
@@ -18,25 +32,34 @@ void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
// Выбор режима работы таймера
switch (TIMx->SMCR & TIM_SMCR_SMS) // TIMER MODE
{
// обычный счет
case(TIM_SLAVEMODE_DISABLE):// NORMAL MODE counting
TIMx_Count(TIMx, TIMS);
Channels_Simulation(TIMx, TIMS); // CaptureCompare and PWM channels simulation
break;
switch (TIMx->SMCR & TIM_SMCR_SMS) // TIMER MODE
{
// обычный счет
case(TIM_SLAVEMODE_DISABLE):// NORMAL MODE counting
TIMx_Count(TIMx, 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);
TIMx_Count(TIMx, 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);
TIMx_Count(TIMx, TIMS);
Channels_Simulation(TIMx, TIMS); // CaptureCompare and PWM channels simulation
break;
}
}
/** Счет таймера за один такт */
/**
* @brief Симуляция счетчика таймера на один такт симуляции.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Данная функция проверяет направление таймера и увеличивает или уменьшает
* значение счетчика на то число, на которое оно бы увеличилось за шаг симуляции.
* @note Для счетчика используется double формат, т.к. кол-во счетов за шаг симуляции
может быть дробным. После в конце функции double счетчик записывает с округлением
в регистр таймера CNT.
*/
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 +68,15 @@ 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;
}
/** Проверка на переполнение и дальнейшая его обработка */
/**
* @brief Проверка на переполнение и дальнейшая его обработка.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Данная функция проверяет когда таймер переполниться и если надо,
вызывает соответствующее прерывание:
- call_IRQHandller()
*/
void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
// Переполнение таймера: сброс таймера и вызов прерывания
@@ -61,7 +92,8 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
else if (TIMS->tx_cnt < 0)
TIMS->tx_cnt = TIMx->ARR;
call_IRQHandller(TIMx); // call HANDLER
if(TIMx->DIER & TIM_DIER_UIE) // if update interrupt enable
call_IRQHandller(TIMx); // call HANDLER
}
}
}
@@ -70,7 +102,19 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
//----------------------------CHANNELS-----------------------------//
/** Симуляция каналов таймера */
/**
* @brief Симуляция каналов таймера.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Данная функция симулирует работу всех каналов таймера.
* Она вызывает функции:
* - CC_PWM_Ch1_Simulation()
* - CC_PWM_Ch2_Simulation()
* - CC_PWM_Ch3_Simulation()
* - CC_PWM_Ch4_Simulation()
* - Write_OC_to_GPIO()
* - Write_OC_to_TRGO()
*/
void Channels_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
CC_PWM_Ch1_Simulation(TIMx, TIMS);
@@ -83,7 +127,13 @@ void Channels_Simulation(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
Write_OC_to_TRGO(TIMx, TIMS);
}
//-----------------CAPTURE COPMARE & PWM FUNCTIONS------------------//
/** Выбор режима CaptureCompare или PWM и симуляция для первого канала */
/**
* @brief Выбор режима первого канала и его симуляция.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Данная функция по регистрам таймера проверяет как настроен
первый канал и соответствующе симулирует его работу.
*/
void CC_PWM_Ch1_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR1 & TIM_CCMR1_OC1M)
@@ -125,7 +175,13 @@ switch (TIMx->CCMR1 & TIM_CCMR1_OC1M)
}
}
/** Выбор режима CaptureCompare или PWM и симуляция для второго канала */
/**
* @brief Выбор режима второго канала и его симуляция.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Данная функция по регистрам таймера проверяет как настроен
второй канал и соответствующе симулирует его работу.
*/
void CC_PWM_Ch2_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
@@ -167,7 +223,13 @@ switch (TIMx->CCMR1 & TIM_CCMR1_OC2M)
}
}
/** Выбор режима CaptureCompare или PWM и симуляция для третьего канала */
/**
* @brief Выбор режима третьего канала и его симуляция.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Данная функция по регистрам таймера проверяет как настроен
третий канал и соответствующе симулирует его работу.
*/
void CC_PWM_Ch3_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
@@ -209,7 +271,13 @@ switch (TIMx->CCMR2 & TIM_CCMR1_OC1M)
}
}
/** Выбор режима CaptureCompare или PWM и симуляция для четвертого канала */
/**
* @brief Выбор режима четвертого канала и его симуляция.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура таймера для симуляции.
* @details Данная функция по регистрам таймера проверяет как настроен
четвертый канал и соответствующе симулирует его работу.
*/
void CC_PWM_Ch4_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{ // определяет режим канала
switch (TIMx->CCMR2 & TIM_CCMR1_OC2M)
@@ -251,7 +319,14 @@ switch (TIMx->CCMR2 & TIM_CCMR1_OC2M)
}
}
/** Запись каналов таймера в порты GPIO */
/**
* @brief Запись каналов таймера в порты GPIO.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура того же таймера для симуляции.
* @details Данная функция записывает каналы OC в порты GPIO, определенные в TIMS.
* Запись происходит только если пин настроен на альтернативную функцию.
*/
void Write_OC_to_GPIO(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
{
// write gpio pin if need
@@ -326,6 +401,12 @@ void Write_OC_to_GPIO(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
}
}
/** Запись результата compare в глабальную структуру с TRIGGER OUTPUT */
/**
* @brief Запись каналов таймера в глабальную структуру с TRIGGER OUTPUT.
* @param TIMx таймер, каналы которого надо записать.
* @param TIMS структура того же таймера для симуляции.
* @details Данная функция считывает каналы OC и записывает их в внешний канал триггера TRGO.
*/
void Write_OC_to_TRGO(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
{
// write trigger output from OCxREF pin if need
@@ -372,7 +453,15 @@ void Write_OC_to_TRGO(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
//--------------------MISC (temporary) FUNCTIONS--------------------//
/** Определение источника для запуска таймера в SLAVE MODE */
void Slave_Mode_Check_Source(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
/**
* @brief Определение источника для запуска таймера в SLAVE MODE.
* @param TIMx таймер, который надо включить.
* @param TIMx таймер, прерываний которого надо вызвать.
* @details Данная функция проверяет какой триггер выбран для запуска таймера,
* после записывает значение канала триггера в бит включения таймера.
* Таким образом, при лог.1 в канале триггера - таймер включиться.
*/
void Slave_Mode_Check_Source(TIM_TypeDef* TIMx)
{
if (TIMx == TIM2)
{
@@ -424,6 +513,11 @@ void Slave_Mode_Check_Source(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
//------------------------SIMULINK FUNCTIONS------------------------//
/** Симулирование выбранных через дефайн таймеров */
/**
* @brief Симуляция выбранных таймеров.
* @details Таймеры для симуляции выбираются через дефайны в stm32f4xx_matlab_conf.h.
Функция вызывается на каждом шаге симуляции.
*/
void Simulate_TIMs(void)
{
#ifdef USE_TIM1
@@ -469,7 +563,11 @@ void Simulate_TIMs(void)
TIM_Simulation(TIM14, &tim14s);
#endif
}
/* Деинициализирование выбранных через дефайн таймеров (вызывается в конце симуляции) */
/**
* @brief Деинициализирование выбранных таймеров.
* @details Таймеры для деинициализизации выбираются через дефайны в stm32f4xx_matlab_conf.h.
Функция вызывается в конце симуляции.
*/
void TIM_SIM_DEINIT(void)
{
#ifdef USE_TIM1
@@ -558,7 +656,12 @@ void TIM8_BRK_TIM12_IRQHandler(void) {}
void TIM8_TRG_COM_TIM14_IRQHandler(void) {}
#endif
/** Вызов прерывания */
/**
* @brief Вызов прерывания таймера TIMx.
* @param TIMx таймер, прерываний которого надо вызвать.
* @details Данная функция симулирует аппаратный вызов прерывания
таймера по какому-либо событию.
*/
void call_IRQHandller(TIM_TypeDef* TIMx)
{ // calling HANDLER
if ((TIMx == TIM1) || (TIMx == TIM10))

View File

@@ -1,6 +1,10 @@
/**************************************************************************
/**
**************************************************************************
* @file stm32f4xx_matlab_tim.h
* @brief Заголовочный файл для симулятора таймеров.
**************************************************************************
@details
Данный файл содержит объявления всякого для симуляции таймеров STM32F407xx.
**************************************************************************/
#ifndef _MATLAB_TIM_H_
#define _MATLAB_TIM_H_
@@ -10,26 +14,39 @@
#include "mcu_wrapper_conf.h"
/**
* @addtogroup TIM_SIMULATOR
* @addtogroup TIM_SIMULATOR TIM Simulator
* @ingroup MAIN_SIMULATOR
* @brief Simulator for TIM
* @brief Симулятор для таймеров
* @details Дефайны и функции для симуляции таймеров.
* @{
*/
/////////////////////////////---DEFINES---/////////////////////////////
/** Дефайн для сдвига между первой и второй половиной CCMRx регистров */
/**
* @brief Дефайн для сдвига между первой и второй половиной CCMRx регистров
*/
#define TIM_OCMODE_SECOND_SHIFT (TIM_CCMR1_OC2M_Pos - TIM_CCMR1_OC1M_Pos)
/** Дефайн для проверки выводить ли канал на GPIO (настроен ли GPIO на альтернативную функцию) */
/**
* @brief Дефайн для проверки выводить ли канал таймера на GPIO
* @details Данный дефайн проверяет, настроен ли пин 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 на альтернативную функцию) */
/**
* @brief Дефайн для проверки выводить ли канал 1 на GPIO (настроен ли GPIO на альтернативную функцию)
*/
#define Check_OC1_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC1_GPIOx, OC1_PIN_SHIFT)
/** Дефайн для проверки выводить ли канал 2 на GPIO (настроен ли GPIO на альтернативную функцию) */
/**
* @brief Дефайн для проверки выводить ли канал 2 на GPIO (настроен ли GPIO на альтернативную функцию)
*/
#define Check_OC2_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC2_GPIOx, OC2_PIN_SHIFT)
/** Дефайн для проверки выводить ли канал 3 на GPIO (настроен ли GPIO на альтернативную функцию) */
/**
* @brief Дефайн для проверки выводить ли канал 3 на GPIO (настроен ли GPIO на альтернативную функцию)
*/
#define Check_OC3_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC3_GPIOx, OC3_PIN_SHIFT)
/** Дефайн для проверки выводить ли канал 4 на GPIO (настроен ли GPIO на альтернативную функцию) */
/**
* @brief Дефайн для проверки выводить ли канал 4 на GPIO (настроен ли GPIO на альтернативную функцию)
*/
#define Check_OC4_GPIO_Output(_tims_) Check_OCx_GPIO_Output(_tims_, OC4_GPIOx, OC4_PIN_SHIFT)
/////////////////////////////////////////////////////////////////////
@@ -37,7 +54,9 @@
///////////////////////////---STRUCTURES---//////////////////////////
/** Структура для управления Слейв Таймерами */
/**
* @brief Структура для управления Слейв Таймерами
*/
struct SlaveChannels
{
unsigned TIM1_TRGO : 1; ///< Синган синхронизации таймера 1
@@ -51,7 +70,9 @@ struct SlaveChannels
};
/** Структура для моделирования каналов таймера */
/**
* @brief Структура для моделирования каналов таймера
*/
struct Channels_Sim
{
// Каналы таймера
@@ -75,12 +96,14 @@ struct Channels_Sim
};
/** Структура для моделирования таймера */
/**
* @brief Структура для моделирования таймера
*/
struct TIM_Sim
{
double tx_cnt; ///< Счетчик таймера
double tx_step; ///< Шаг счета за один шаг симуляции
int RELOAD; ///< Буфер, если PRELOAD = 1
double tx_cnt; ///< Счетчик таймера (double, т.к. кол-во тактов за шаг симуляции может быть дробным)
double tx_step; ///< Шаг счета за один шаг симуляции (double, т.к. кол-во тактов за шаг симуляции может быть дробным)
int RELOAD; ///< Буфер для периода таймера (для реализации функции PRELOAD)
struct Channels_Sim Channels; ///< Структура для симуляции каналов
};
/////////////////////////////////////////////////////////////////////
@@ -119,7 +142,7 @@ void Write_OC_to_TRGO(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
//--------------------MISC (temporary) FUNCTIONS--------------------//
/* Определение источника для запуска таймера в SLAVE MODE */
void Slave_Mode_Check_Source(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS);
void Slave_Mode_Check_Source(TIM_TypeDef* TIMx);
//------------------------------------------------------------------//

View File

@@ -1,16 +1,36 @@
/**************************************************************************
/**
**************************************************************************
* @dir ../MCU_STM32F4xx_Matlab/STM32F4xx_SIMULINK
* @brief <b>
* Папка с исходным кодом симулятора МК. </b>
* @details
В этой папке содержаться файлы для эмуляции периферии STM32 в MATLAB.
Структура файлов такая же, как в библиотеке HAL:
- название серии МК, который эмулируется (stm32f4xx),
- идентификатор, что это для MATLAB (matlab),
- периферия, функции для эмуляции которой содержит конкретный файл (gpio, tim).
Пример: "stm32f4xx_matlab_tim.c/.h"
**************************************************************************/
/**
**************************************************************************
* @file stm32f4xx_periph_registers.c
* @brief Исходный код с переменными регистров периферии.
**************************************************************************
@details
Данный файл необходим для объявления структур для отображения их в watch
В оригинальном stm32f407xx они объявлены дефайнами, которые не видны в watch.
Поэтому дополнительно объявлены данные структуры.
Называются также, как CMSISные, только в нижнем регистре
Называются также, как CMSISные, только в нижнем регистре.
**************************************************************************/
#include "stm32f407xx_matlab.h"
/**
* @addtogroup PERIPH_VARS_FOR_DEBUG
* @addtogroup PERIPH_VARS_FOR_DEBUG Periphs Variables for Debugging
* @ingroup STM_SIMULATION
* @brief Varables of peripheral registers for debug watches
* @brief Переменные для доступа к периферии в дебаге
* @{
*/

View File

@@ -1,8 +1,13 @@
/**************************************************************************
Данный файл настраивает структуры для симуляции периферий, которые выбраны
/**
**************************************************************************
* @file stm32f4xx_matlab_conf.c
* @brief Исходный код для конфигурации симулятора МК.
**************************************************************************
@details
Данный файл настраивает структуры для симуляции периферий, которые выбраны
дефайнами в stm32f4xx_matlab_conf.h.
**************************************************************************/
#include "mcu_wrapper_conf.h"
MCU_MemoryTypeDef MCU_MEM;
@@ -11,17 +16,27 @@ DBGMCU_TypeDef DEBUG_MCU;
//-----------------------------------------------------------------------//
/*------------------------------FUNCTIONS--------------------------------*/
// MCU PERIPH INIT
/**
* @brief Инициализация периферии симулятора МК.
* @details Эта функция вызывает функции инициализации периферии для симуляции
*/
void Initialize_Periph_Sim(void)
{
Init_TIM_SIM();
}
// MCU PERIPH DEINIT
/**
* @brief Деинициализация периферии симулятора МК.
* @details Эта функция вызывает функции деинициализации периферии для последующей симуляции
*/
void deInitialize_Periph_Sim(void)
{
TIM_SIM_DEINIT();
}
// MCU DEINIT
/**
* @brief Деинициализация симулятора МК.
* @details Эта функция очищает память симулятора МК, чтобы в
следующей симуляции он запускался как в первый раз.
*/
void deInitialize_MCU(void)
{
// обнуление структуры, управляющей программой МК
@@ -82,7 +97,11 @@ struct TIM_Sim tim13s;
struct TIM_Sim tim14s;
#endif
// defines function for filling structure for simulate
/**
* @brief Инициализация таймеров симулятора МК.
* @details Эта функция инициализирует структуры для симуляции таймеров.
* Таймеры для симуляции выбираются дефайнами в stm32f4xx_matlab_conf.h.
*/
void Init_TIM_SIM(void)
{
#ifdef USE_TIM1

View File

@@ -1,27 +1,44 @@
/**************************************************************************
Данный файл необходим для определения, какую периферию наобходимо будет
симулировать.
/**
**************************************************************************
* @dir ../MCU_STM32F4xx_Matlab
* @brief <b>
* Папка с исходным кодом для симуляции МК. </b>
**************************************************************************
@details
В данной папке содержаться модули для симуляции МК в MATLAB:
- Драйверы МК - они переделаны так, чтобы запускаться и работать в MATLAB.
- Симулятор МК - он моделирует работу нужной периферии в MATLAB
**************************************************************************/
/**
**************************************************************************
* @file stm32f4xx_matlab_conf.h
* @brief Заголовочный файл для конфигурации симулятора МК.
**************************************************************************
@details
Здесь задаётся используемая периферия и подключаются библиотеки для периферии.
**************************************************************************/
#ifndef _MATLAB_CONF_H_
#define _MATLAB_CONF_H_
/**
* @addtogroup STM_SIMULATION
* @brief Stuff for simulating STM32 in MATLAB
* @addtogroup STM_SIMULATION STM32 Simulation
* @brief Всякое для симуляции STM32
*/
/**
* @addtogroup MAIN_SIMULATOR
* @addtogroup MAIN_SIMULATOR STM32 Simulator
* @ingroup STM_SIMULATION
* @brief Stuff for configuring, initializing and deinitializing simulator
* @brief Всякое для симулятора STM32
* @details Здесь дефайнами задается используемая периферия и
подключаются файлы, необходимые для её симуляции
*/
/**
* @addtogroup SIMULATOR_CONF
* @addtogroup SIMULATOR_CONF Simulator Configuration
* @ingroup MAIN_SIMULATOR
* @brief Configurations for simulator to simulating MCU
* @brief Параметры конфигурации для симулятора МК
* @details Здесь дефайнами задается периферия для симуляции
* @{
*/
@@ -64,12 +81,10 @@
/**
* @addtogroup MAIN_SIMULATOR
* @ingroup MAIN_SIMULATOR
* @{
*/
//-----------------------------------------------------------------------//
/*------------------------------FUNCTIONS--------------------------------*/
// MCU PERIPH INIT