Сделана документация на то, что есть сейчас
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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 */
|
||||
|
||||
/*@} */
|
||||
|
||||
/*@} */
|
||||
|
||||
|
||||
@@ -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 peripheral’s 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
|
||||
|
||||
146
MCU_STM32F4xx_Matlab/Drivers/CMSIS/stm32f407xx_matlab_memory.h
Normal file
146
MCU_STM32F4xx_Matlab/Drivers/CMSIS/stm32f407xx_matlab_memory.h
Normal 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)
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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_
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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_
|
||||
@@ -0,0 +1,8 @@
|
||||
/*
|
||||
**************************************************************************
|
||||
* @file stm32f4xx_matlab_rcc.c
|
||||
* @brief Èñõîäíûé êîä ñèìóëÿòîðà êëîêà.
|
||||
**************************************************************************
|
||||
@details
|
||||
Äàííûé ôàéë ñîäåðæèò ôóíêöèè äëÿ ñèìóëÿöèè êëîêà STM32F407xx.
|
||||
**************************************************************************/
|
||||
@@ -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)); \
|
||||
@@ -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))
|
||||
@@ -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);
|
||||
//------------------------------------------------------------------//
|
||||
|
||||
|
||||
@@ -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 Переменные для доступа к периферии в дебаге
|
||||
* @{
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user