Удален старые сурсы. Проект компилится но не проверен в симулинке
This commit is contained in:
parent
4556b453db
commit
7b6cc2fa50
@ -1,49 +0,0 @@
|
|||||||
/* USER CODE BEGIN Header */
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file gpio.h
|
|
||||||
* @brief This file contains all the function prototypes for
|
|
||||||
* the gpio.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2024 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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
/* USER CODE END Header */
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __GPIO_H__
|
|
||||||
#define __GPIO_H__
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "main.h"
|
|
||||||
|
|
||||||
/* USER CODE BEGIN Includes */
|
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
|
||||||
|
|
||||||
/* USER CODE BEGIN Private defines */
|
|
||||||
|
|
||||||
/* USER CODE END Private defines */
|
|
||||||
|
|
||||||
void MX_GPIO_Init(void);
|
|
||||||
|
|
||||||
/* USER CODE BEGIN Prototypes */
|
|
||||||
|
|
||||||
/* USER CODE END Prototypes */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif /*__ GPIO_H__ */
|
|
||||||
|
|
||||||
@ -1,69 +0,0 @@
|
|||||||
/* USER CODE BEGIN Header */
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file : main.h
|
|
||||||
* @brief : Header for main.c file.
|
|
||||||
* This file contains the common defines of the application.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2024 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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
/* USER CODE END Header */
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __MAIN_H
|
|
||||||
#define __MAIN_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "stm32f4xx_hal.h"
|
|
||||||
|
|
||||||
/* Private includes ----------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN Includes */
|
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN ET */
|
|
||||||
|
|
||||||
/* USER CODE END ET */
|
|
||||||
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN EC */
|
|
||||||
|
|
||||||
/* USER CODE END EC */
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN EM */
|
|
||||||
|
|
||||||
/* USER CODE END EM */
|
|
||||||
|
|
||||||
/* Exported functions prototypes ---------------------------------------------*/
|
|
||||||
void Error_Handler(void);
|
|
||||||
|
|
||||||
/* USER CODE BEGIN EFP */
|
|
||||||
|
|
||||||
/* USER CODE END EFP */
|
|
||||||
|
|
||||||
/* Private defines -----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USER CODE BEGIN Private defines */
|
|
||||||
|
|
||||||
/* USER CODE END Private defines */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __MAIN_H */
|
|
||||||
@ -1,495 +0,0 @@
|
|||||||
/* USER CODE BEGIN Header */
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file stm32f4xx_hal_conf_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief HAL configuration template file.
|
|
||||||
* This file should be copied to the application folder and renamed
|
|
||||||
* to stm32f4xx_hal_conf.h.
|
|
||||||
******************************************************************************
|
|
||||||
* @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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
/* USER CODE END Header */
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __STM32F4xx_HAL_CONF_H
|
|
||||||
#define __STM32F4xx_HAL_CONF_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ########################## Module Selection ############################## */
|
|
||||||
/**
|
|
||||||
* @brief This is the list of modules to be used in the HAL driver
|
|
||||||
*/
|
|
||||||
#define HAL_MODULE_ENABLED
|
|
||||||
|
|
||||||
/* #define HAL_CRYP_MODULE_ENABLED */
|
|
||||||
/* #define HAL_ADC_MODULE_ENABLED */
|
|
||||||
/* #define HAL_CAN_MODULE_ENABLED */
|
|
||||||
/* #define HAL_CRC_MODULE_ENABLED */
|
|
||||||
/* #define HAL_CAN_LEGACY_MODULE_ENABLED */
|
|
||||||
#define HAL_DAC_MODULE_ENABLED
|
|
||||||
/* #define HAL_DCMI_MODULE_ENABLED */
|
|
||||||
/* #define HAL_DMA2D_MODULE_ENABLED */
|
|
||||||
/* #define HAL_ETH_MODULE_ENABLED */
|
|
||||||
/* #define HAL_ETH_LEGACY_MODULE_ENABLED */
|
|
||||||
/* #define HAL_NAND_MODULE_ENABLED */
|
|
||||||
/* #define HAL_NOR_MODULE_ENABLED */
|
|
||||||
/* #define HAL_PCCARD_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SRAM_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SDRAM_MODULE_ENABLED */
|
|
||||||
/* #define HAL_HASH_MODULE_ENABLED */
|
|
||||||
/* #define HAL_I2C_MODULE_ENABLED */
|
|
||||||
/* #define HAL_I2S_MODULE_ENABLED */
|
|
||||||
/* #define HAL_IWDG_MODULE_ENABLED */
|
|
||||||
/* #define HAL_LTDC_MODULE_ENABLED */
|
|
||||||
/* #define HAL_RNG_MODULE_ENABLED */
|
|
||||||
/* #define HAL_RTC_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SAI_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SD_MODULE_ENABLED */
|
|
||||||
/* #define HAL_MMC_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SPI_MODULE_ENABLED */
|
|
||||||
#define HAL_TIM_MODULE_ENABLED
|
|
||||||
#define HAL_UART_MODULE_ENABLED
|
|
||||||
#define HAL_USART_MODULE_ENABLED
|
|
||||||
/* #define HAL_IRDA_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SMARTCARD_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SMBUS_MODULE_ENABLED */
|
|
||||||
/* #define HAL_WWDG_MODULE_ENABLED */
|
|
||||||
/* #define HAL_PCD_MODULE_ENABLED */
|
|
||||||
/* #define HAL_HCD_MODULE_ENABLED */
|
|
||||||
/* #define HAL_DSI_MODULE_ENABLED */
|
|
||||||
/* #define HAL_QSPI_MODULE_ENABLED */
|
|
||||||
/* #define HAL_QSPI_MODULE_ENABLED */
|
|
||||||
/* #define HAL_CEC_MODULE_ENABLED */
|
|
||||||
/* #define HAL_FMPI2C_MODULE_ENABLED */
|
|
||||||
/* #define HAL_FMPSMBUS_MODULE_ENABLED */
|
|
||||||
/* #define HAL_SPDIFRX_MODULE_ENABLED */
|
|
||||||
/* #define HAL_DFSDM_MODULE_ENABLED */
|
|
||||||
/* #define HAL_LPTIM_MODULE_ENABLED */
|
|
||||||
#define HAL_GPIO_MODULE_ENABLED
|
|
||||||
#define HAL_EXTI_MODULE_ENABLED
|
|
||||||
#define HAL_DMA_MODULE_ENABLED
|
|
||||||
#define HAL_RCC_MODULE_ENABLED
|
|
||||||
#define HAL_FLASH_MODULE_ENABLED
|
|
||||||
#define HAL_PWR_MODULE_ENABLED
|
|
||||||
#define HAL_CORTEX_MODULE_ENABLED
|
|
||||||
|
|
||||||
/* ########################## HSE/HSI Values adaptation ##################### */
|
|
||||||
/**
|
|
||||||
* @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
|
|
||||||
* This value is used by the RCC HAL module to compute the system frequency
|
|
||||||
* (when HSE is used as system clock source, directly or through the PLL).
|
|
||||||
*/
|
|
||||||
#if !defined (HSE_VALUE)
|
|
||||||
#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */
|
|
||||||
#endif /* HSE_VALUE */
|
|
||||||
|
|
||||||
#if !defined (HSE_STARTUP_TIMEOUT)
|
|
||||||
#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */
|
|
||||||
#endif /* HSE_STARTUP_TIMEOUT */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Internal High Speed oscillator (HSI) value.
|
|
||||||
* This value is used by the RCC HAL module to compute the system frequency
|
|
||||||
* (when HSI is used as system clock source, directly or through the PLL).
|
|
||||||
*/
|
|
||||||
#if !defined (HSI_VALUE)
|
|
||||||
#define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
|
|
||||||
#endif /* HSI_VALUE */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Internal Low Speed oscillator (LSI) value.
|
|
||||||
*/
|
|
||||||
#if !defined (LSI_VALUE)
|
|
||||||
#define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/
|
|
||||||
#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
|
|
||||||
The real value may vary depending on the variations
|
|
||||||
in voltage and temperature.*/
|
|
||||||
/**
|
|
||||||
* @brief External Low Speed oscillator (LSE) value.
|
|
||||||
*/
|
|
||||||
#if !defined (LSE_VALUE)
|
|
||||||
#define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */
|
|
||||||
#endif /* LSE_VALUE */
|
|
||||||
|
|
||||||
#if !defined (LSE_STARTUP_TIMEOUT)
|
|
||||||
#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
|
|
||||||
#endif /* LSE_STARTUP_TIMEOUT */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief External clock source for I2S peripheral
|
|
||||||
* This value is used by the I2S HAL module to compute the I2S clock source
|
|
||||||
* frequency, this source is inserted directly through I2S_CKIN pad.
|
|
||||||
*/
|
|
||||||
#if !defined (EXTERNAL_CLOCK_VALUE)
|
|
||||||
#define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External audio frequency in Hz*/
|
|
||||||
#endif /* EXTERNAL_CLOCK_VALUE */
|
|
||||||
|
|
||||||
/* Tip: To avoid modifying this file each time you need to use different HSE,
|
|
||||||
=== you can define the HSE value in your toolchain compiler preprocessor. */
|
|
||||||
|
|
||||||
/* ########################### System Configuration ######################### */
|
|
||||||
/**
|
|
||||||
* @brief This is the HAL system configuration section
|
|
||||||
*/
|
|
||||||
#define VDD_VALUE 3300U /*!< Value of VDD in mv */
|
|
||||||
#define TICK_INT_PRIORITY 15U /*!< tick interrupt priority */
|
|
||||||
#define USE_RTOS 0U
|
|
||||||
#define PREFETCH_ENABLE 1U
|
|
||||||
#define INSTRUCTION_CACHE_ENABLE 1U
|
|
||||||
#define DATA_CACHE_ENABLE 1U
|
|
||||||
|
|
||||||
#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */
|
|
||||||
#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */
|
|
||||||
#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */
|
|
||||||
#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */
|
|
||||||
#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */
|
|
||||||
#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */
|
|
||||||
#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */
|
|
||||||
#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */
|
|
||||||
#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */
|
|
||||||
#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */
|
|
||||||
#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */
|
|
||||||
#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */
|
|
||||||
#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */
|
|
||||||
#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */
|
|
||||||
#define USE_HAL_FMPSMBUS_REGISTER_CALLBACKS 0U /* FMPSMBUS register callback disabled */
|
|
||||||
#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */
|
|
||||||
#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */
|
|
||||||
#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */
|
|
||||||
#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */
|
|
||||||
#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */
|
|
||||||
#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */
|
|
||||||
#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */
|
|
||||||
#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */
|
|
||||||
#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */
|
|
||||||
#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */
|
|
||||||
#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */
|
|
||||||
#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */
|
|
||||||
#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */
|
|
||||||
#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */
|
|
||||||
#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */
|
|
||||||
#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */
|
|
||||||
#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */
|
|
||||||
#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */
|
|
||||||
#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */
|
|
||||||
#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */
|
|
||||||
#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */
|
|
||||||
#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */
|
|
||||||
#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */
|
|
||||||
#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */
|
|
||||||
|
|
||||||
/* ########################## Assert Selection ############################## */
|
|
||||||
/**
|
|
||||||
* @brief Uncomment the line below to expanse the "assert_param" macro in the
|
|
||||||
* HAL drivers code
|
|
||||||
*/
|
|
||||||
/* #define USE_FULL_ASSERT 1U */
|
|
||||||
|
|
||||||
/* ################## Ethernet peripheral configuration ##################### */
|
|
||||||
|
|
||||||
/* Section 1 : Ethernet peripheral configuration */
|
|
||||||
|
|
||||||
/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
|
|
||||||
#define MAC_ADDR0 2U
|
|
||||||
#define MAC_ADDR1 0U
|
|
||||||
#define MAC_ADDR2 0U
|
|
||||||
#define MAC_ADDR3 0U
|
|
||||||
#define MAC_ADDR4 0U
|
|
||||||
#define MAC_ADDR5 0U
|
|
||||||
|
|
||||||
/* Definition of the Ethernet driver buffers size and count */
|
|
||||||
#define ETH_RX_BUF_SIZE /* buffer size for receive */
|
|
||||||
#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
|
|
||||||
#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
|
|
||||||
#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
|
|
||||||
|
|
||||||
/* Section 2: PHY configuration section */
|
|
||||||
|
|
||||||
/* DP83848_PHY_ADDRESS Address*/
|
|
||||||
#define DP83848_PHY_ADDRESS 0x01U
|
|
||||||
/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
|
|
||||||
#define PHY_RESET_DELAY 0x000000FFU
|
|
||||||
/* PHY Configuration delay */
|
|
||||||
#define PHY_CONFIG_DELAY 0x00000FFFU
|
|
||||||
|
|
||||||
#define PHY_READ_TO 0x0000FFFFU
|
|
||||||
#define PHY_WRITE_TO 0x0000FFFFU
|
|
||||||
|
|
||||||
/* Section 3: Common PHY Registers */
|
|
||||||
|
|
||||||
#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
|
|
||||||
#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
|
|
||||||
|
|
||||||
#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
|
|
||||||
#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
|
|
||||||
#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
|
|
||||||
#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
|
|
||||||
#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
|
|
||||||
#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
|
|
||||||
#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
|
|
||||||
#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
|
|
||||||
#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
|
|
||||||
#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
|
|
||||||
|
|
||||||
#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
|
|
||||||
#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
|
|
||||||
#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
|
|
||||||
|
|
||||||
/* Section 4: Extended PHY Registers */
|
|
||||||
#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
|
|
||||||
|
|
||||||
#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
|
|
||||||
#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
|
|
||||||
|
|
||||||
/* ################## SPI peripheral configuration ########################## */
|
|
||||||
|
|
||||||
/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
|
|
||||||
* Activated: CRC code is present inside driver
|
|
||||||
* Deactivated: CRC code cleaned from driver
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define USE_SPI_CRC 0U
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* @brief Include module's header file
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAL_RCC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_rcc.h"
|
|
||||||
#endif /* HAL_RCC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_GPIO_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_gpio.h"
|
|
||||||
#endif /* HAL_GPIO_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_EXTI_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_exti.h"
|
|
||||||
#endif /* HAL_EXTI_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_DMA_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_dma.h"
|
|
||||||
#endif /* HAL_DMA_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_CORTEX_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_cortex.h"
|
|
||||||
#endif /* HAL_CORTEX_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_ADC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_adc.h"
|
|
||||||
#endif /* HAL_ADC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_CAN_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_can.h"
|
|
||||||
#endif /* HAL_CAN_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_CAN_LEGACY_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_can_legacy.h"
|
|
||||||
#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_CRC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_crc.h"
|
|
||||||
#endif /* HAL_CRC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_CRYP_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_cryp.h"
|
|
||||||
#endif /* HAL_CRYP_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_DMA2D_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_dma2d.h"
|
|
||||||
#endif /* HAL_DMA2D_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_DAC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_dac.h"
|
|
||||||
#endif /* HAL_DAC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_DCMI_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_dcmi.h"
|
|
||||||
#endif /* HAL_DCMI_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_ETH_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_eth.h"
|
|
||||||
#endif /* HAL_ETH_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_ETH_LEGACY_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_eth_legacy.h"
|
|
||||||
#endif /* HAL_ETH_LEGACY_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_FLASH_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_flash.h"
|
|
||||||
#endif /* HAL_FLASH_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SRAM_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_sram.h"
|
|
||||||
#endif /* HAL_SRAM_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_NOR_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_nor.h"
|
|
||||||
#endif /* HAL_NOR_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_NAND_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_nand.h"
|
|
||||||
#endif /* HAL_NAND_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_PCCARD_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_pccard.h"
|
|
||||||
#endif /* HAL_PCCARD_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SDRAM_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_sdram.h"
|
|
||||||
#endif /* HAL_SDRAM_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_HASH_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_hash.h"
|
|
||||||
#endif /* HAL_HASH_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_I2C_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_i2c.h"
|
|
||||||
#endif /* HAL_I2C_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SMBUS_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_smbus.h"
|
|
||||||
#endif /* HAL_SMBUS_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_I2S_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_i2s.h"
|
|
||||||
#endif /* HAL_I2S_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_IWDG_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_iwdg.h"
|
|
||||||
#endif /* HAL_IWDG_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_LTDC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_ltdc.h"
|
|
||||||
#endif /* HAL_LTDC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_PWR_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_pwr.h"
|
|
||||||
#endif /* HAL_PWR_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_RNG_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_rng.h"
|
|
||||||
#endif /* HAL_RNG_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_RTC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_rtc.h"
|
|
||||||
#endif /* HAL_RTC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SAI_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_sai.h"
|
|
||||||
#endif /* HAL_SAI_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SD_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_sd.h"
|
|
||||||
#endif /* HAL_SD_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SPI_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_spi.h"
|
|
||||||
#endif /* HAL_SPI_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_TIM_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_tim.h"
|
|
||||||
#endif /* HAL_TIM_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_UART_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_uart.h"
|
|
||||||
#endif /* HAL_UART_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_USART_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_usart.h"
|
|
||||||
#endif /* HAL_USART_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_IRDA_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_irda.h"
|
|
||||||
#endif /* HAL_IRDA_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SMARTCARD_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_smartcard.h"
|
|
||||||
#endif /* HAL_SMARTCARD_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_WWDG_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_wwdg.h"
|
|
||||||
#endif /* HAL_WWDG_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_PCD_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_pcd.h"
|
|
||||||
#endif /* HAL_PCD_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_HCD_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_hcd.h"
|
|
||||||
#endif /* HAL_HCD_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_DSI_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_dsi.h"
|
|
||||||
#endif /* HAL_DSI_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_QSPI_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_qspi.h"
|
|
||||||
#endif /* HAL_QSPI_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_CEC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_cec.h"
|
|
||||||
#endif /* HAL_CEC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_FMPI2C_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_fmpi2c.h"
|
|
||||||
#endif /* HAL_FMPI2C_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_FMPSMBUS_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_fmpsmbus.h"
|
|
||||||
#endif /* HAL_FMPSMBUS_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_SPDIFRX_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_spdifrx.h"
|
|
||||||
#endif /* HAL_SPDIFRX_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_DFSDM_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_dfsdm.h"
|
|
||||||
#endif /* HAL_DFSDM_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_LPTIM_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_lptim.h"
|
|
||||||
#endif /* HAL_LPTIM_MODULE_ENABLED */
|
|
||||||
|
|
||||||
#ifdef HAL_MMC_MODULE_ENABLED
|
|
||||||
#include "stm32f4xx_hal_mmc.h"
|
|
||||||
#endif /* HAL_MMC_MODULE_ENABLED */
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
#ifdef USE_FULL_ASSERT
|
|
||||||
/**
|
|
||||||
* @brief The assert_param macro is used for function's parameters check.
|
|
||||||
* @param expr If expr is false, it calls assert_failed function
|
|
||||||
* which reports the name of the source file and the source
|
|
||||||
* line number of the call that failed.
|
|
||||||
* If expr is true, it returns no value.
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
|
|
||||||
/* Exported functions ------------------------------------------------------- */
|
|
||||||
void assert_failed(uint8_t* file, uint32_t line);
|
|
||||||
#else
|
|
||||||
#define assert_param(expr) ((void)0U)
|
|
||||||
#endif /* USE_FULL_ASSERT */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __STM32F4xx_HAL_CONF_H */
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
/* USER CODE BEGIN Header */
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file stm32f4xx_it.h
|
|
||||||
* @brief This file contains the headers of the interrupt handlers.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2024 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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
/* USER CODE END Header */
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __STM32F4xx_IT_H
|
|
||||||
#define __STM32F4xx_IT_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Private includes ----------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN Includes */
|
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
|
||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN ET */
|
|
||||||
|
|
||||||
/* USER CODE END ET */
|
|
||||||
|
|
||||||
/* Exported constants --------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN EC */
|
|
||||||
|
|
||||||
/* USER CODE END EC */
|
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN EM */
|
|
||||||
|
|
||||||
/* USER CODE END EM */
|
|
||||||
|
|
||||||
/* Exported functions prototypes ---------------------------------------------*/
|
|
||||||
void NMI_Handler(void);
|
|
||||||
void HardFault_Handler(void);
|
|
||||||
void MemManage_Handler(void);
|
|
||||||
void BusFault_Handler(void);
|
|
||||||
void UsageFault_Handler(void);
|
|
||||||
void SVC_Handler(void);
|
|
||||||
void DebugMon_Handler(void);
|
|
||||||
void PendSV_Handler(void);
|
|
||||||
void SysTick_Handler(void);
|
|
||||||
/* USER CODE BEGIN EFP */
|
|
||||||
|
|
||||||
/* USER CODE END EFP */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __STM32F4xx_IT_H */
|
|
||||||
@ -1,90 +0,0 @@
|
|||||||
// TRACE SETTINGS
|
|
||||||
|
|
||||||
#define TRACE_MB_UART_ENABLE 14
|
|
||||||
//#define TRACE_MB_TIM_ENABLE 15
|
|
||||||
#define TRACE_TIM_PWM_ENABLE 15
|
|
||||||
//#define TRACE_PWM_REINIT_ENABLE 15
|
|
||||||
//#define TRACE_TIM_DEAD_TIME_ENABLE 14
|
|
||||||
//#define TRACE_TIM_CTRL_ENABLE 15
|
|
||||||
|
|
||||||
|
|
||||||
#define TRACE_GPIO_ENTER(_gpio_,_pin_) (_gpio_)->BSRR = (1<<(_pin_))
|
|
||||||
#define TRACE_GPIO_EXIT(_gpio_,_pin_) (_gpio_)->BSRR = (1<<((_pin_)+16))
|
|
||||||
|
|
||||||
#ifdef TRACE_MB_UART_ENABLE
|
|
||||||
#define Trace_MB_UART_Enter() TRACE_GPIO_ENTER(GPIOD, TRACE_MB_UART_ENABLE)
|
|
||||||
#define Trace_MB_UART_Exit() TRACE_GPIO_EXIT(GPIOD, TRACE_MB_UART_ENABLE)
|
|
||||||
#endif
|
|
||||||
#ifdef TRACE_MB_TIM_ENABLE
|
|
||||||
#define Trace_MB_TIM_Enter() TRACE_GPIO_ENTER(GPIOD, TRACE_MB_TIM_ENABLE)
|
|
||||||
#define Trace_MB_TIM_Exit() TRACE_GPIO_EXIT(GPIOD, TRACE_MB_TIM_ENABLE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef TRACE_TIM_PWM_ENABLE
|
|
||||||
#define Trace_PWM_TIM_Enter() TRACE_GPIO_ENTER(GPIOD, TRACE_TIM_PWM_ENABLE)
|
|
||||||
#define Trace_PWM_TIM_Exit() TRACE_GPIO_EXIT(GPIOD, TRACE_TIM_PWM_ENABLE)
|
|
||||||
#endif
|
|
||||||
#ifdef TRACE_PWM_REINIT_ENABLE
|
|
||||||
#define Trace_PWM_reInit_Enter() TRACE_GPIO_ENTER(GPIOD, TRACE_PWM_REINIT_ENABLE)
|
|
||||||
#define Trace_PWM_reInit_Exit() TRACE_GPIO_EXIT(GPIOD, TRACE_PWM_REINIT_ENABLE)
|
|
||||||
#endif
|
|
||||||
#ifdef TRACE_TIM_DEAD_TIME_ENABLE
|
|
||||||
#define Trace_PWM_DeadTime_Enter() TRACE_GPIO_ENTER(GPIOD, TRACE_TIM_DEAD_TIME_ENABLE)
|
|
||||||
#define Trace_PWM_DeadTime_Exit() TRACE_GPIO_EXIT(GPIOD, TRACE_TIM_DEAD_TIME_ENABLE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TRACE_TIM_CTRL_ENABLE
|
|
||||||
#define Trace_CTRL_TIM_Enter() TRACE_GPIO_ENTER(GPIOD, TRACE_TIM_CTRL_ENABLE)
|
|
||||||
#define Trace_CTRL_TIM_Exit() TRACE_GPIO_EXIT(GPIOD, TRACE_TIM_CTRL_ENABLE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef Trace_MB_UART_Enter
|
|
||||||
#define Trace_MB_UART_Enter()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_MB_UART_Exit
|
|
||||||
#define Trace_MB_UART_Exit()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_MB_TIM_Enter
|
|
||||||
#define Trace_MB_TIM_Enter()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_MB_TIM_Exit
|
|
||||||
#define Trace_MB_TIM_Exit()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_PWM_TIM_Enter
|
|
||||||
#define Trace_PWM_TIM_Enter()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_PWM_TIM_Exit
|
|
||||||
#define Trace_PWM_TIM_Exit()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_CTRL_TIM_Enter
|
|
||||||
#define Trace_CTRL_TIM_Enter()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_CTRL_TIM_Exit
|
|
||||||
#define Trace_CTRL_TIM_Exit()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef Trace_PWM_reInit_Enter
|
|
||||||
#define Trace_PWM_reInit_Enter()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_PWM_reInit_Exit
|
|
||||||
#define Trace_PWM_reInit_Exit()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_PWM_DeadTime_Enter
|
|
||||||
#define Trace_PWM_DeadTime_Enter()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef Trace_PWM_DeadTime_Exit
|
|
||||||
#define Trace_PWM_DeadTime_Exit()
|
|
||||||
#endif
|
|
||||||
@ -1,61 +0,0 @@
|
|||||||
/* USER CODE BEGIN Header */
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file gpio.c
|
|
||||||
* @brief This file provides code for the configuration
|
|
||||||
* of all used GPIO pins.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2024 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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
/* USER CODE END Header */
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "gpio.h"
|
|
||||||
|
|
||||||
/* USER CODE BEGIN 0 */
|
|
||||||
|
|
||||||
/* USER CODE END 0 */
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
/* Configure GPIO */
|
|
||||||
/*----------------------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN 1 */
|
|
||||||
|
|
||||||
/* USER CODE END 1 */
|
|
||||||
|
|
||||||
/** Configure pins as
|
|
||||||
* Analog
|
|
||||||
* Input
|
|
||||||
* Output
|
|
||||||
* EVENT_OUT
|
|
||||||
* EXTI
|
|
||||||
*/
|
|
||||||
void MX_GPIO_Init(void)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
||||||
|
|
||||||
/* GPIO Ports Clock Enable */
|
|
||||||
__HAL_RCC_GPIOH_CLK_ENABLE();
|
|
||||||
|
|
||||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
|
||||||
|
|
||||||
/*Configure GPIO pin : PC13 */
|
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN_15 | GPIO_PIN_14 | GPIO_PIN_13 | GPIO_PIN_12;
|
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
||||||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|
||||||
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* USER CODE BEGIN 2 */
|
|
||||||
|
|
||||||
/* USER CODE END 2 */
|
|
||||||
@ -1,81 +0,0 @@
|
|||||||
/* USER CODE BEGIN Header */
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file stm32f4xx_hal_msp.c
|
|
||||||
* @brief This file provides code for the MSP Initialization
|
|
||||||
* and de-Initialization codes.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2024 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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
/* USER CODE END Header */
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "main.h"
|
|
||||||
/* USER CODE BEGIN Includes */
|
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN TD */
|
|
||||||
|
|
||||||
/* USER CODE END TD */
|
|
||||||
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN Define */
|
|
||||||
|
|
||||||
/* USER CODE END Define */
|
|
||||||
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN Macro */
|
|
||||||
|
|
||||||
/* USER CODE END Macro */
|
|
||||||
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN PV */
|
|
||||||
|
|
||||||
/* USER CODE END PV */
|
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN PFP */
|
|
||||||
|
|
||||||
/* USER CODE END PFP */
|
|
||||||
|
|
||||||
/* External functions --------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN ExternalFunctions */
|
|
||||||
|
|
||||||
/* USER CODE END ExternalFunctions */
|
|
||||||
|
|
||||||
/* USER CODE BEGIN 0 */
|
|
||||||
|
|
||||||
/* USER CODE END 0 */
|
|
||||||
/**
|
|
||||||
* Initializes the Global MSP.
|
|
||||||
*/
|
|
||||||
void HAL_MspInit(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN MspInit 0 */
|
|
||||||
|
|
||||||
/* USER CODE END MspInit 0 */
|
|
||||||
|
|
||||||
__HAL_RCC_SYSCFG_CLK_ENABLE();
|
|
||||||
__HAL_RCC_PWR_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* System interrupt init*/
|
|
||||||
|
|
||||||
/* USER CODE BEGIN MspInit 1 */
|
|
||||||
|
|
||||||
/* USER CODE END MspInit 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* USER CODE BEGIN 1 */
|
|
||||||
|
|
||||||
/* USER CODE END 1 */
|
|
||||||
@ -1,205 +0,0 @@
|
|||||||
/* USER CODE BEGIN Header */
|
|
||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file stm32f4xx_it.c
|
|
||||||
* @brief Interrupt Service Routines.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* Copyright (c) 2024 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.
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
/* USER CODE END Header */
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "main.h"
|
|
||||||
#include "stm32f4xx_it.h"
|
|
||||||
/* Private includes ----------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN Includes */
|
|
||||||
|
|
||||||
/* USER CODE END Includes */
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN TD */
|
|
||||||
|
|
||||||
/* USER CODE END TD */
|
|
||||||
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN PD */
|
|
||||||
|
|
||||||
/* USER CODE END PD */
|
|
||||||
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN PM */
|
|
||||||
|
|
||||||
/* USER CODE END PM */
|
|
||||||
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN PV */
|
|
||||||
|
|
||||||
/* USER CODE END PV */
|
|
||||||
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN PFP */
|
|
||||||
|
|
||||||
/* USER CODE END PFP */
|
|
||||||
|
|
||||||
/* Private user code ---------------------------------------------------------*/
|
|
||||||
/* USER CODE BEGIN 0 */
|
|
||||||
|
|
||||||
/* USER CODE END 0 */
|
|
||||||
|
|
||||||
/* External variables --------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* USER CODE BEGIN EV */
|
|
||||||
|
|
||||||
/* USER CODE END EV */
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/* Cortex-M4 Processor Interruption and Exception Handlers */
|
|
||||||
/******************************************************************************/
|
|
||||||
/**
|
|
||||||
* @brief This function handles Non maskable interrupt.
|
|
||||||
*/
|
|
||||||
void NMI_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END NonMaskableInt_IRQn 0 */
|
|
||||||
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
/* USER CODE END NonMaskableInt_IRQn 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Hard fault interrupt.
|
|
||||||
*/
|
|
||||||
void HardFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN HardFault_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END HardFault_IRQn 0 */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN W1_HardFault_IRQn 0 */
|
|
||||||
return;
|
|
||||||
/* USER CODE END W1_HardFault_IRQn 0 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Memory management fault.
|
|
||||||
*/
|
|
||||||
void MemManage_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END MemoryManagement_IRQn 0 */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
|
|
||||||
/* USER CODE END W1_MemoryManagement_IRQn 0 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Pre-fetch fault, memory access fault.
|
|
||||||
*/
|
|
||||||
void BusFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN BusFault_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END BusFault_IRQn 0 */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN W1_BusFault_IRQn 0 */
|
|
||||||
/* USER CODE END W1_BusFault_IRQn 0 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Undefined instruction or illegal state.
|
|
||||||
*/
|
|
||||||
void UsageFault_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN UsageFault_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END UsageFault_IRQn 0 */
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN W1_UsageFault_IRQn 0 */
|
|
||||||
/* USER CODE END W1_UsageFault_IRQn 0 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles System service call via SWI instruction.
|
|
||||||
*/
|
|
||||||
void SVC_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN SVCall_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END SVCall_IRQn 0 */
|
|
||||||
/* USER CODE BEGIN SVCall_IRQn 1 */
|
|
||||||
|
|
||||||
/* USER CODE END SVCall_IRQn 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Debug monitor.
|
|
||||||
*/
|
|
||||||
void DebugMon_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN DebugMonitor_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END DebugMonitor_IRQn 0 */
|
|
||||||
/* USER CODE BEGIN DebugMonitor_IRQn 1 */
|
|
||||||
|
|
||||||
/* USER CODE END DebugMonitor_IRQn 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles Pendable request for system service.
|
|
||||||
*/
|
|
||||||
void PendSV_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN PendSV_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END PendSV_IRQn 0 */
|
|
||||||
/* USER CODE BEGIN PendSV_IRQn 1 */
|
|
||||||
|
|
||||||
/* USER CODE END PendSV_IRQn 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief This function handles System tick timer.
|
|
||||||
*/
|
|
||||||
void SysTick_Handler(void)
|
|
||||||
{
|
|
||||||
/* USER CODE BEGIN SysTick_IRQn 0 */
|
|
||||||
|
|
||||||
/* USER CODE END SysTick_IRQn 0 */
|
|
||||||
HAL_IncTick();
|
|
||||||
/* USER CODE BEGIN SysTick_IRQn 1 */
|
|
||||||
|
|
||||||
/* USER CODE END SysTick_IRQn 1 */
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
/* STM32F4xx Peripheral Interrupt Handlers */
|
|
||||||
/* Add here the Interrupt Handlers for the used peripherals. */
|
|
||||||
/* For the available peripheral interrupt handler names, */
|
|
||||||
/* please refer to the startup file (startup_stm32f4xx.s). */
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/* USER CODE BEGIN 1 */
|
|
||||||
|
|
||||||
/* USER CODE END 1 */
|
|
||||||
@ -1,747 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file system_stm32f4xx.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
|
|
||||||
*
|
|
||||||
* This file provides two functions and one global variable to be called from
|
|
||||||
* user application:
|
|
||||||
* - SystemInit(): This function is called at startup just after reset and
|
|
||||||
* before branch to main program. This call is made inside
|
|
||||||
* the "startup_stm32f4xx.s" file.
|
|
||||||
*
|
|
||||||
* - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
|
|
||||||
* by the user application to setup the SysTick
|
|
||||||
* timer or configure other parameters.
|
|
||||||
*
|
|
||||||
* - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
|
|
||||||
* be called whenever the core clock is changed
|
|
||||||
* during program execution.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @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
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup stm32f4xx_system
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32F4xx_System_Private_Includes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "stm32f4xx.h"
|
|
||||||
|
|
||||||
#if !defined (HSE_VALUE)
|
|
||||||
#define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */
|
|
||||||
#endif /* HSE_VALUE */
|
|
||||||
|
|
||||||
#if !defined (HSI_VALUE)
|
|
||||||
#define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
|
|
||||||
#endif /* HSI_VALUE */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32F4xx_System_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32F4xx_System_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************* Miscellaneous Configuration ************************/
|
|
||||||
/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */
|
|
||||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
|
|
||||||
|| defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
|
|
||||||
|| defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
|
|
||||||
/* #define DATA_IN_ExtSRAM */
|
|
||||||
#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\
|
|
||||||
STM32F412Zx || STM32F412Vx */
|
|
||||||
|
|
||||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
|
|
||||||
|| defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
|
|
||||||
/* #define DATA_IN_ExtSDRAM */
|
|
||||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\
|
|
||||||
STM32F479xx */
|
|
||||||
|
|
||||||
/* Note: Following vector table addresses must be defined in line with linker
|
|
||||||
configuration. */
|
|
||||||
/*!< Uncomment the following line if you need to relocate the vector table
|
|
||||||
anywhere in Flash or Sram, else the vector table is kept at the automatic
|
|
||||||
remap of boot address selected */
|
|
||||||
/* #define USER_VECT_TAB_ADDRESS */
|
|
||||||
|
|
||||||
#if defined(USER_VECT_TAB_ADDRESS)
|
|
||||||
/*!< Uncomment the following line if you need to relocate your vector Table
|
|
||||||
in Sram else user remap will be done in Flash. */
|
|
||||||
/* #define VECT_TAB_SRAM */
|
|
||||||
#if defined(VECT_TAB_SRAM)
|
|
||||||
#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field.
|
|
||||||
This value must be a multiple of 0x200. */
|
|
||||||
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
|
|
||||||
This value must be a multiple of 0x200. */
|
|
||||||
#else
|
|
||||||
#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field.
|
|
||||||
This value must be a multiple of 0x200. */
|
|
||||||
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
|
|
||||||
This value must be a multiple of 0x200. */
|
|
||||||
#endif /* VECT_TAB_SRAM */
|
|
||||||
#endif /* USER_VECT_TAB_ADDRESS */
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32F4xx_System_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32F4xx_System_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/* This variable is updated in three ways:
|
|
||||||
1) by calling CMSIS function SystemCoreClockUpdate()
|
|
||||||
2) by calling HAL API function HAL_RCC_GetHCLKFreq()
|
|
||||||
3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
|
|
||||||
Note: If you use this function to configure the system clock; then there
|
|
||||||
is no need to call the 2 first functions listed above, since SystemCoreClock
|
|
||||||
variable is updated automatically.
|
|
||||||
*/
|
|
||||||
uint32_t SystemCoreClock = 16000000;
|
|
||||||
const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
|
|
||||||
const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4};
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
|
|
||||||
static void SystemInit_ExtMemCtl(void);
|
|
||||||
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @addtogroup STM32F4xx_System_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Setup the microcontroller system
|
|
||||||
* Initialize the FPU setting, vector table location and External memory
|
|
||||||
* configuration.
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SystemInit(void)
|
|
||||||
{
|
|
||||||
/* FPU settings ------------------------------------------------------------*/
|
|
||||||
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
|
|
||||||
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
|
|
||||||
SystemInit_ExtMemCtl();
|
|
||||||
#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
|
|
||||||
|
|
||||||
/* Configure the Vector Table location -------------------------------------*/
|
|
||||||
#if defined(USER_VECT_TAB_ADDRESS)
|
|
||||||
SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
|
|
||||||
#endif /* USER_VECT_TAB_ADDRESS */
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Update SystemCoreClock variable according to Clock Register Values.
|
|
||||||
* The SystemCoreClock variable contains the core clock (HCLK), it can
|
|
||||||
* be used by the user application to setup the SysTick timer or configure
|
|
||||||
* other parameters.
|
|
||||||
*
|
|
||||||
* @note Each time the core clock (HCLK) changes, this function must be called
|
|
||||||
* to update SystemCoreClock variable value. Otherwise, any configuration
|
|
||||||
* based on this variable will be incorrect.
|
|
||||||
*
|
|
||||||
* @note - The system frequency computed by this function is not the real
|
|
||||||
* frequency in the chip. It is calculated based on the predefined
|
|
||||||
* constant and the selected clock source:
|
|
||||||
*
|
|
||||||
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
|
|
||||||
*
|
|
||||||
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
|
|
||||||
*
|
|
||||||
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
|
|
||||||
* or HSI_VALUE(*) multiplied/divided by the PLL factors.
|
|
||||||
*
|
|
||||||
* (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value
|
|
||||||
* 16 MHz) but the real value may vary depending on the variations
|
|
||||||
* in voltage and temperature.
|
|
||||||
*
|
|
||||||
* (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value
|
|
||||||
* depends on the application requirements), user has to ensure that HSE_VALUE
|
|
||||||
* is same as the real frequency of the crystal used. Otherwise, this function
|
|
||||||
* may have wrong result.
|
|
||||||
*
|
|
||||||
* - The result of this function could be not correct when using fractional
|
|
||||||
* value for HSE crystal.
|
|
||||||
*
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SystemCoreClockUpdate(void)
|
|
||||||
{
|
|
||||||
uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
|
|
||||||
|
|
||||||
/* Get SYSCLK source -------------------------------------------------------*/
|
|
||||||
tmp = RCC->CFGR & RCC_CFGR_SWS;
|
|
||||||
|
|
||||||
switch (tmp)
|
|
||||||
{
|
|
||||||
case 0x00: /* HSI used as system clock source */
|
|
||||||
SystemCoreClock = HSI_VALUE;
|
|
||||||
break;
|
|
||||||
case 0x04: /* HSE used as system clock source */
|
|
||||||
SystemCoreClock = HSE_VALUE;
|
|
||||||
break;
|
|
||||||
case 0x08: /* PLL used as system clock source */
|
|
||||||
|
|
||||||
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
|
|
||||||
SYSCLK = PLL_VCO / PLL_P
|
|
||||||
*/
|
|
||||||
pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
|
|
||||||
pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
|
|
||||||
|
|
||||||
if (pllsource != 0)
|
|
||||||
{
|
|
||||||
/* HSE used as PLL clock source */
|
|
||||||
pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* HSI used as PLL clock source */
|
|
||||||
pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
|
|
||||||
SystemCoreClock = pllvco/pllp;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
SystemCoreClock = HSI_VALUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Compute HCLK frequency --------------------------------------------------*/
|
|
||||||
/* Get HCLK prescaler */
|
|
||||||
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
|
|
||||||
/* HCLK frequency */
|
|
||||||
SystemCoreClock >>= tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM)
|
|
||||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
|
|
||||||
|| defined(STM32F469xx) || defined(STM32F479xx)
|
|
||||||
/**
|
|
||||||
* @brief Setup the external memory controller.
|
|
||||||
* Called in startup_stm32f4xx.s before jump to main.
|
|
||||||
* This function configures the external memories (SRAM/SDRAM)
|
|
||||||
* This SRAM/SDRAM will be used as program data memory (including heap and stack).
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SystemInit_ExtMemCtl(void)
|
|
||||||
{
|
|
||||||
__IO uint32_t tmp = 0x00;
|
|
||||||
|
|
||||||
register uint32_t tmpreg = 0, timeout = 0xFFFF;
|
|
||||||
register __IO uint32_t index;
|
|
||||||
|
|
||||||
/* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */
|
|
||||||
RCC->AHB1ENR |= 0x000001F8;
|
|
||||||
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
|
|
||||||
|
|
||||||
/* Connect PDx pins to FMC Alternate function */
|
|
||||||
GPIOD->AFR[0] = 0x00CCC0CC;
|
|
||||||
GPIOD->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PDx pins in Alternate function mode */
|
|
||||||
GPIOD->MODER = 0xAAAA0A8A;
|
|
||||||
/* Configure PDx pins speed to 100 MHz */
|
|
||||||
GPIOD->OSPEEDR = 0xFFFF0FCF;
|
|
||||||
/* Configure PDx pins Output type to push-pull */
|
|
||||||
GPIOD->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PDx pins */
|
|
||||||
GPIOD->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PEx pins to FMC Alternate function */
|
|
||||||
GPIOE->AFR[0] = 0xC00CC0CC;
|
|
||||||
GPIOE->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PEx pins in Alternate function mode */
|
|
||||||
GPIOE->MODER = 0xAAAA828A;
|
|
||||||
/* Configure PEx pins speed to 100 MHz */
|
|
||||||
GPIOE->OSPEEDR = 0xFFFFC3CF;
|
|
||||||
/* Configure PEx pins Output type to push-pull */
|
|
||||||
GPIOE->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PEx pins */
|
|
||||||
GPIOE->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PFx pins to FMC Alternate function */
|
|
||||||
GPIOF->AFR[0] = 0xCCCCCCCC;
|
|
||||||
GPIOF->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PFx pins in Alternate function mode */
|
|
||||||
GPIOF->MODER = 0xAA800AAA;
|
|
||||||
/* Configure PFx pins speed to 50 MHz */
|
|
||||||
GPIOF->OSPEEDR = 0xAA800AAA;
|
|
||||||
/* Configure PFx pins Output type to push-pull */
|
|
||||||
GPIOF->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PFx pins */
|
|
||||||
GPIOF->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PGx pins to FMC Alternate function */
|
|
||||||
GPIOG->AFR[0] = 0xCCCCCCCC;
|
|
||||||
GPIOG->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PGx pins in Alternate function mode */
|
|
||||||
GPIOG->MODER = 0xAAAAAAAA;
|
|
||||||
/* Configure PGx pins speed to 50 MHz */
|
|
||||||
GPIOG->OSPEEDR = 0xAAAAAAAA;
|
|
||||||
/* Configure PGx pins Output type to push-pull */
|
|
||||||
GPIOG->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PGx pins */
|
|
||||||
GPIOG->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PHx pins to FMC Alternate function */
|
|
||||||
GPIOH->AFR[0] = 0x00C0CC00;
|
|
||||||
GPIOH->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PHx pins in Alternate function mode */
|
|
||||||
GPIOH->MODER = 0xAAAA08A0;
|
|
||||||
/* Configure PHx pins speed to 50 MHz */
|
|
||||||
GPIOH->OSPEEDR = 0xAAAA08A0;
|
|
||||||
/* Configure PHx pins Output type to push-pull */
|
|
||||||
GPIOH->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PHx pins */
|
|
||||||
GPIOH->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PIx pins to FMC Alternate function */
|
|
||||||
GPIOI->AFR[0] = 0xCCCCCCCC;
|
|
||||||
GPIOI->AFR[1] = 0x00000CC0;
|
|
||||||
/* Configure PIx pins in Alternate function mode */
|
|
||||||
GPIOI->MODER = 0x0028AAAA;
|
|
||||||
/* Configure PIx pins speed to 50 MHz */
|
|
||||||
GPIOI->OSPEEDR = 0x0028AAAA;
|
|
||||||
/* Configure PIx pins Output type to push-pull */
|
|
||||||
GPIOI->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PIx pins */
|
|
||||||
GPIOI->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/*-- FMC Configuration -------------------------------------------------------*/
|
|
||||||
/* Enable the FMC interface clock */
|
|
||||||
RCC->AHB3ENR |= 0x00000001;
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
|
|
||||||
|
|
||||||
FMC_Bank5_6->SDCR[0] = 0x000019E4;
|
|
||||||
FMC_Bank5_6->SDTR[0] = 0x01115351;
|
|
||||||
|
|
||||||
/* SDRAM initialization sequence */
|
|
||||||
/* Clock enable command */
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00000011;
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delay */
|
|
||||||
for (index = 0; index<1000; index++);
|
|
||||||
|
|
||||||
/* PALL command */
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00000012;
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
timeout = 0xFFFF;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Auto refresh command */
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00000073;
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
timeout = 0xFFFF;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MRD register program */
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00046014;
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
timeout = 0xFFFF;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set refresh count */
|
|
||||||
tmpreg = FMC_Bank5_6->SDRTR;
|
|
||||||
FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
|
|
||||||
|
|
||||||
/* Disable write protection */
|
|
||||||
tmpreg = FMC_Bank5_6->SDCR[0];
|
|
||||||
FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
|
|
||||||
|
|
||||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
|
|
||||||
/* Configure and enable Bank1_SRAM2 */
|
|
||||||
FMC_Bank1->BTCR[2] = 0x00001011;
|
|
||||||
FMC_Bank1->BTCR[3] = 0x00000201;
|
|
||||||
FMC_Bank1E->BWTR[2] = 0x0fffffff;
|
|
||||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
|
|
||||||
#if defined(STM32F469xx) || defined(STM32F479xx)
|
|
||||||
/* Configure and enable Bank1_SRAM2 */
|
|
||||||
FMC_Bank1->BTCR[2] = 0x00001091;
|
|
||||||
FMC_Bank1->BTCR[3] = 0x00110212;
|
|
||||||
FMC_Bank1E->BWTR[2] = 0x0fffffff;
|
|
||||||
#endif /* STM32F469xx || STM32F479xx */
|
|
||||||
|
|
||||||
(void)(tmp);
|
|
||||||
}
|
|
||||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
|
|
||||||
#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
|
|
||||||
/**
|
|
||||||
* @brief Setup the external memory controller.
|
|
||||||
* Called in startup_stm32f4xx.s before jump to main.
|
|
||||||
* This function configures the external memories (SRAM/SDRAM)
|
|
||||||
* This SRAM/SDRAM will be used as program data memory (including heap and stack).
|
|
||||||
* @param None
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void SystemInit_ExtMemCtl(void)
|
|
||||||
{
|
|
||||||
__IO uint32_t tmp = 0x00;
|
|
||||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
|
|
||||||
|| defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
|
|
||||||
#if defined (DATA_IN_ExtSDRAM)
|
|
||||||
register uint32_t tmpreg = 0, timeout = 0xFFFF;
|
|
||||||
register __IO uint32_t index;
|
|
||||||
|
|
||||||
#if defined(STM32F446xx)
|
|
||||||
/* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface
|
|
||||||
clock */
|
|
||||||
RCC->AHB1ENR |= 0x0000007D;
|
|
||||||
#else
|
|
||||||
/* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface
|
|
||||||
clock */
|
|
||||||
RCC->AHB1ENR |= 0x000001F8;
|
|
||||||
#endif /* STM32F446xx */
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
|
|
||||||
|
|
||||||
#if defined(STM32F446xx)
|
|
||||||
/* Connect PAx pins to FMC Alternate function */
|
|
||||||
GPIOA->AFR[0] |= 0xC0000000;
|
|
||||||
GPIOA->AFR[1] |= 0x00000000;
|
|
||||||
/* Configure PDx pins in Alternate function mode */
|
|
||||||
GPIOA->MODER |= 0x00008000;
|
|
||||||
/* Configure PDx pins speed to 50 MHz */
|
|
||||||
GPIOA->OSPEEDR |= 0x00008000;
|
|
||||||
/* Configure PDx pins Output type to push-pull */
|
|
||||||
GPIOA->OTYPER |= 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PDx pins */
|
|
||||||
GPIOA->PUPDR |= 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PCx pins to FMC Alternate function */
|
|
||||||
GPIOC->AFR[0] |= 0x00CC0000;
|
|
||||||
GPIOC->AFR[1] |= 0x00000000;
|
|
||||||
/* Configure PDx pins in Alternate function mode */
|
|
||||||
GPIOC->MODER |= 0x00000A00;
|
|
||||||
/* Configure PDx pins speed to 50 MHz */
|
|
||||||
GPIOC->OSPEEDR |= 0x00000A00;
|
|
||||||
/* Configure PDx pins Output type to push-pull */
|
|
||||||
GPIOC->OTYPER |= 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PDx pins */
|
|
||||||
GPIOC->PUPDR |= 0x00000000;
|
|
||||||
#endif /* STM32F446xx */
|
|
||||||
|
|
||||||
/* Connect PDx pins to FMC Alternate function */
|
|
||||||
GPIOD->AFR[0] = 0x000000CC;
|
|
||||||
GPIOD->AFR[1] = 0xCC000CCC;
|
|
||||||
/* Configure PDx pins in Alternate function mode */
|
|
||||||
GPIOD->MODER = 0xA02A000A;
|
|
||||||
/* Configure PDx pins speed to 50 MHz */
|
|
||||||
GPIOD->OSPEEDR = 0xA02A000A;
|
|
||||||
/* Configure PDx pins Output type to push-pull */
|
|
||||||
GPIOD->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PDx pins */
|
|
||||||
GPIOD->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PEx pins to FMC Alternate function */
|
|
||||||
GPIOE->AFR[0] = 0xC00000CC;
|
|
||||||
GPIOE->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PEx pins in Alternate function mode */
|
|
||||||
GPIOE->MODER = 0xAAAA800A;
|
|
||||||
/* Configure PEx pins speed to 50 MHz */
|
|
||||||
GPIOE->OSPEEDR = 0xAAAA800A;
|
|
||||||
/* Configure PEx pins Output type to push-pull */
|
|
||||||
GPIOE->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PEx pins */
|
|
||||||
GPIOE->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PFx pins to FMC Alternate function */
|
|
||||||
GPIOF->AFR[0] = 0xCCCCCCCC;
|
|
||||||
GPIOF->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PFx pins in Alternate function mode */
|
|
||||||
GPIOF->MODER = 0xAA800AAA;
|
|
||||||
/* Configure PFx pins speed to 50 MHz */
|
|
||||||
GPIOF->OSPEEDR = 0xAA800AAA;
|
|
||||||
/* Configure PFx pins Output type to push-pull */
|
|
||||||
GPIOF->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PFx pins */
|
|
||||||
GPIOF->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PGx pins to FMC Alternate function */
|
|
||||||
GPIOG->AFR[0] = 0xCCCCCCCC;
|
|
||||||
GPIOG->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PGx pins in Alternate function mode */
|
|
||||||
GPIOG->MODER = 0xAAAAAAAA;
|
|
||||||
/* Configure PGx pins speed to 50 MHz */
|
|
||||||
GPIOG->OSPEEDR = 0xAAAAAAAA;
|
|
||||||
/* Configure PGx pins Output type to push-pull */
|
|
||||||
GPIOG->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PGx pins */
|
|
||||||
GPIOG->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
|
|
||||||
|| defined(STM32F469xx) || defined(STM32F479xx)
|
|
||||||
/* Connect PHx pins to FMC Alternate function */
|
|
||||||
GPIOH->AFR[0] = 0x00C0CC00;
|
|
||||||
GPIOH->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PHx pins in Alternate function mode */
|
|
||||||
GPIOH->MODER = 0xAAAA08A0;
|
|
||||||
/* Configure PHx pins speed to 50 MHz */
|
|
||||||
GPIOH->OSPEEDR = 0xAAAA08A0;
|
|
||||||
/* Configure PHx pins Output type to push-pull */
|
|
||||||
GPIOH->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PHx pins */
|
|
||||||
GPIOH->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PIx pins to FMC Alternate function */
|
|
||||||
GPIOI->AFR[0] = 0xCCCCCCCC;
|
|
||||||
GPIOI->AFR[1] = 0x00000CC0;
|
|
||||||
/* Configure PIx pins in Alternate function mode */
|
|
||||||
GPIOI->MODER = 0x0028AAAA;
|
|
||||||
/* Configure PIx pins speed to 50 MHz */
|
|
||||||
GPIOI->OSPEEDR = 0x0028AAAA;
|
|
||||||
/* Configure PIx pins Output type to push-pull */
|
|
||||||
GPIOI->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PIx pins */
|
|
||||||
GPIOI->PUPDR = 0x00000000;
|
|
||||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
|
|
||||||
|
|
||||||
/*-- FMC Configuration -------------------------------------------------------*/
|
|
||||||
/* Enable the FMC interface clock */
|
|
||||||
RCC->AHB3ENR |= 0x00000001;
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
|
|
||||||
|
|
||||||
/* Configure and enable SDRAM bank1 */
|
|
||||||
#if defined(STM32F446xx)
|
|
||||||
FMC_Bank5_6->SDCR[0] = 0x00001954;
|
|
||||||
#else
|
|
||||||
FMC_Bank5_6->SDCR[0] = 0x000019E4;
|
|
||||||
#endif /* STM32F446xx */
|
|
||||||
FMC_Bank5_6->SDTR[0] = 0x01115351;
|
|
||||||
|
|
||||||
/* SDRAM initialization sequence */
|
|
||||||
/* Clock enable command */
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00000011;
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Delay */
|
|
||||||
for (index = 0; index<1000; index++);
|
|
||||||
|
|
||||||
/* PALL command */
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00000012;
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
timeout = 0xFFFF;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Auto refresh command */
|
|
||||||
#if defined(STM32F446xx)
|
|
||||||
FMC_Bank5_6->SDCMR = 0x000000F3;
|
|
||||||
#else
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00000073;
|
|
||||||
#endif /* STM32F446xx */
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
timeout = 0xFFFF;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* MRD register program */
|
|
||||||
#if defined(STM32F446xx)
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00044014;
|
|
||||||
#else
|
|
||||||
FMC_Bank5_6->SDCMR = 0x00046014;
|
|
||||||
#endif /* STM32F446xx */
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
timeout = 0xFFFF;
|
|
||||||
while((tmpreg != 0) && (timeout-- > 0))
|
|
||||||
{
|
|
||||||
tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set refresh count */
|
|
||||||
tmpreg = FMC_Bank5_6->SDRTR;
|
|
||||||
#if defined(STM32F446xx)
|
|
||||||
FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1));
|
|
||||||
#else
|
|
||||||
FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
|
|
||||||
#endif /* STM32F446xx */
|
|
||||||
|
|
||||||
/* Disable write protection */
|
|
||||||
tmpreg = FMC_Bank5_6->SDCR[0];
|
|
||||||
FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
|
|
||||||
#endif /* DATA_IN_ExtSDRAM */
|
|
||||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */
|
|
||||||
|
|
||||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
|
|
||||||
|| defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
|
|
||||||
|| defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
|
|
||||||
|
|
||||||
#if defined(DATA_IN_ExtSRAM)
|
|
||||||
/*-- GPIOs Configuration -----------------------------------------------------*/
|
|
||||||
/* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
|
|
||||||
RCC->AHB1ENR |= 0x00000078;
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);
|
|
||||||
|
|
||||||
/* Connect PDx pins to FMC Alternate function */
|
|
||||||
GPIOD->AFR[0] = 0x00CCC0CC;
|
|
||||||
GPIOD->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PDx pins in Alternate function mode */
|
|
||||||
GPIOD->MODER = 0xAAAA0A8A;
|
|
||||||
/* Configure PDx pins speed to 100 MHz */
|
|
||||||
GPIOD->OSPEEDR = 0xFFFF0FCF;
|
|
||||||
/* Configure PDx pins Output type to push-pull */
|
|
||||||
GPIOD->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PDx pins */
|
|
||||||
GPIOD->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PEx pins to FMC Alternate function */
|
|
||||||
GPIOE->AFR[0] = 0xC00CC0CC;
|
|
||||||
GPIOE->AFR[1] = 0xCCCCCCCC;
|
|
||||||
/* Configure PEx pins in Alternate function mode */
|
|
||||||
GPIOE->MODER = 0xAAAA828A;
|
|
||||||
/* Configure PEx pins speed to 100 MHz */
|
|
||||||
GPIOE->OSPEEDR = 0xFFFFC3CF;
|
|
||||||
/* Configure PEx pins Output type to push-pull */
|
|
||||||
GPIOE->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PEx pins */
|
|
||||||
GPIOE->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PFx pins to FMC Alternate function */
|
|
||||||
GPIOF->AFR[0] = 0x00CCCCCC;
|
|
||||||
GPIOF->AFR[1] = 0xCCCC0000;
|
|
||||||
/* Configure PFx pins in Alternate function mode */
|
|
||||||
GPIOF->MODER = 0xAA000AAA;
|
|
||||||
/* Configure PFx pins speed to 100 MHz */
|
|
||||||
GPIOF->OSPEEDR = 0xFF000FFF;
|
|
||||||
/* Configure PFx pins Output type to push-pull */
|
|
||||||
GPIOF->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PFx pins */
|
|
||||||
GPIOF->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/* Connect PGx pins to FMC Alternate function */
|
|
||||||
GPIOG->AFR[0] = 0x00CCCCCC;
|
|
||||||
GPIOG->AFR[1] = 0x000000C0;
|
|
||||||
/* Configure PGx pins in Alternate function mode */
|
|
||||||
GPIOG->MODER = 0x00085AAA;
|
|
||||||
/* Configure PGx pins speed to 100 MHz */
|
|
||||||
GPIOG->OSPEEDR = 0x000CAFFF;
|
|
||||||
/* Configure PGx pins Output type to push-pull */
|
|
||||||
GPIOG->OTYPER = 0x00000000;
|
|
||||||
/* No pull-up, pull-down for PGx pins */
|
|
||||||
GPIOG->PUPDR = 0x00000000;
|
|
||||||
|
|
||||||
/*-- FMC/FSMC Configuration --------------------------------------------------*/
|
|
||||||
/* Enable the FMC/FSMC interface clock */
|
|
||||||
RCC->AHB3ENR |= 0x00000001;
|
|
||||||
|
|
||||||
#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
|
|
||||||
/* Configure and enable Bank1_SRAM2 */
|
|
||||||
FMC_Bank1->BTCR[2] = 0x00001011;
|
|
||||||
FMC_Bank1->BTCR[3] = 0x00000201;
|
|
||||||
FMC_Bank1E->BWTR[2] = 0x0fffffff;
|
|
||||||
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
|
|
||||||
#if defined(STM32F469xx) || defined(STM32F479xx)
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
|
|
||||||
/* Configure and enable Bank1_SRAM2 */
|
|
||||||
FMC_Bank1->BTCR[2] = 0x00001091;
|
|
||||||
FMC_Bank1->BTCR[3] = 0x00110212;
|
|
||||||
FMC_Bank1E->BWTR[2] = 0x0fffffff;
|
|
||||||
#endif /* STM32F469xx || STM32F479xx */
|
|
||||||
#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\
|
|
||||||
|| defined(STM32F412Zx) || defined(STM32F412Vx)
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
|
||||||
tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);
|
|
||||||
/* Configure and enable Bank1_SRAM2 */
|
|
||||||
FSMC_Bank1->BTCR[2] = 0x00001011;
|
|
||||||
FSMC_Bank1->BTCR[3] = 0x00000201;
|
|
||||||
FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF;
|
|
||||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */
|
|
||||||
|
|
||||||
#endif /* DATA_IN_ExtSRAM */
|
|
||||||
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
|
|
||||||
STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */
|
|
||||||
(void)(tmp);
|
|
||||||
}
|
|
||||||
#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
/**********************************TIM**************************************
|
|
||||||
Данный файл содержит базовые функции для инициализации портов.
|
|
||||||
***************************************************************************/
|
|
||||||
#include "gpio_general.h"
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//------------------------GPIO INIT FUNCTIONS------------------------
|
|
||||||
|
|
||||||
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx)
|
|
||||||
{
|
|
||||||
HAL_StatusTypeDef status = HAL_OK;
|
|
||||||
// choose port for enable clock
|
|
||||||
if (GPIOx==GPIOA)
|
|
||||||
__HAL_RCC_GPIOA_CLK_ENABLE();
|
|
||||||
else if (GPIOx==GPIOB)
|
|
||||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
|
||||||
else if (GPIOx==GPIOC)
|
|
||||||
__HAL_RCC_GPIOC_CLK_ENABLE();
|
|
||||||
else if (GPIOx==GPIOD)
|
|
||||||
__HAL_RCC_GPIOD_CLK_ENABLE();
|
|
||||||
else if (GPIOx==GPIOE)
|
|
||||||
__HAL_RCC_GPIOE_CLK_ENABLE();
|
|
||||||
else
|
|
||||||
status = HAL_ERROR;
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------GPIO INIT FUNCTIONS------------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
/**********************************TIM**************************************
|
|
||||||
Данный файл содержит объявления базовых функции и дефайны для инициализации
|
|
||||||
портов.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __GPIO_GENERAL_H_
|
|
||||||
#define __GPIO_GENERAL_H_
|
|
||||||
|
|
||||||
#include "periph_general.h"
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
|
|
||||||
HAL_StatusTypeDef GPIO_Clock_Enable(GPIO_TypeDef *GPIOx);
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
#endif // __GPIO_GENERAL_H_
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
/**********************************TIM**************************************
|
|
||||||
Данный файл содержит инклюды и дефайны для всех библиотек базовой перефирии.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __PERIPH_GENERAL_H_
|
|
||||||
#define __PERIPH_GENERAL_H_
|
|
||||||
|
|
||||||
|
|
||||||
// user includes
|
|
||||||
#include "modbus.h"
|
|
||||||
|
|
||||||
#include "trace.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern void Error_Handler(void);
|
|
||||||
#define ERROR_HANDLER_NAME(_params_) Error_Handler(_params_)
|
|
||||||
/* If error handler not defined - set void */
|
|
||||||
#ifndef ERROR_HANDLER_NAME
|
|
||||||
#define ((void)0U)
|
|
||||||
#endif // ERROR_HANDLER_NAME
|
|
||||||
|
|
||||||
#include "stm32f4xx_hal.h"
|
|
||||||
|
|
||||||
#include "gpio_general.h"
|
|
||||||
#include "uart_general.h"
|
|
||||||
#include "tim_general.h"
|
|
||||||
|
|
||||||
|
|
||||||
#endif // __PERIPH_GENERAL_H_
|
|
||||||
@ -1,481 +0,0 @@
|
|||||||
/**********************************TIM**************************************
|
|
||||||
Данный файл содержит базовые функции для инициализации таймеров.
|
|
||||||
//-------------------Функции-------------------//
|
|
||||||
|
|
||||||
@func tim initialize
|
|
||||||
- TIM_Base_Init Инициализация TIM
|
|
||||||
- TIM_Output_PWM_Init Инициализация PWM с выводом на GPIO
|
|
||||||
- TIM_Base_MspInit Аналог HAL_MspInit для таймера
|
|
||||||
***************************************************************************/
|
|
||||||
#include "tim_general.h"
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//-------------------------TIM INIT FUNCTIONS------------------------
|
|
||||||
/**
|
|
||||||
* @brief Initialize TIM with TIM_SettingsTypeDef structure.
|
|
||||||
* @param stim - указатель на структуру с настройками таймера.
|
|
||||||
* @return HAL status.
|
|
||||||
* @note Данная структура содержит хендл таймера и структуры для его настройки.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef *stim)
|
|
||||||
{ // function takes structure for init
|
|
||||||
// check that htim is defined
|
|
||||||
if (stim->htim.Instance == NULL)
|
|
||||||
return HAL_ERROR;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(stim->sTickBaseMHz) // if tickbase isnt disable
|
|
||||||
{
|
|
||||||
if((stim->sTimAHBFreqMHz == 0))
|
|
||||||
return HAL_ERROR;
|
|
||||||
stim->htim.Init.Prescaler = (stim->sTimAHBFreqMHz*stim->sTickBaseMHz) - 1;
|
|
||||||
|
|
||||||
if ((stim->sTimFreqHz != NULL))
|
|
||||||
stim->htim.Init.Period = ((1000000/stim->sTickBaseMHz) / stim->sTimFreqHz) - 1;
|
|
||||||
}
|
|
||||||
// if freq is too high (period too small for choosen base) OR base is too high (period too small for choosen base)
|
|
||||||
if((stim->htim.Init.Period == NULL) || (stim->htim.Init.Prescaler == NULL))
|
|
||||||
{
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// fix overflow of presc and period if need
|
|
||||||
for(int i = 0; (stim->htim.Init.Prescaler > 0xFFFF) || (stim->htim.Init.Period > 0xFFFF); i++)
|
|
||||||
{
|
|
||||||
if (i>10) // if it isnt fixed after 10 itteration - return HAL_ERRPOR
|
|
||||||
{
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if timbase is too big (prescaller too big for choosen base from MHZ)
|
|
||||||
if(stim->htim.Init.Prescaler > 0xFFFF)
|
|
||||||
{
|
|
||||||
// переносим часть пресскалера в период
|
|
||||||
stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)/2) - 1;
|
|
||||||
stim->htim.Init.Period = ((stim->htim.Init.Period + 1)*2) - 1;
|
|
||||||
// обновляем TickBase
|
|
||||||
stim->sTickBaseMHz /= 2;
|
|
||||||
}
|
|
||||||
// if freq is too low (period too big for choosen base)
|
|
||||||
if(stim->htim.Init.Period > 0xFFFF)
|
|
||||||
{
|
|
||||||
// переносим часть периода в прескалер
|
|
||||||
stim->htim.Init.Period = ((stim->htim.Init.Period + 1)/2) - 1;
|
|
||||||
stim->htim.Init.Prescaler = ((stim->htim.Init.Prescaler + 1)*2) - 1;
|
|
||||||
// обновляем TickBase
|
|
||||||
stim->sTickBaseMHz *= 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------TIM BASE INIT----------------
|
|
||||||
// tim base init
|
|
||||||
TIM_Base_MspInit(&stim->htim, stim->sTimMode);
|
|
||||||
if (HAL_TIM_Base_Init(&stim->htim) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------CLOCK SRC INIT---------------
|
|
||||||
// fill sClockSourceConfig if its NULL
|
|
||||||
if (stim->sClockSourceConfig.ClockSource == NULL)
|
|
||||||
stim->sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
|
||||||
// clock source init
|
|
||||||
if (HAL_TIM_ConfigClockSource(&stim->htim, &stim->sClockSourceConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------SLAVE INIT------------------
|
|
||||||
// if slave mode enables - config it
|
|
||||||
if (stim->sSlaveConfig.SlaveMode)
|
|
||||||
{
|
|
||||||
// slave mode init
|
|
||||||
if (HAL_TIM_SlaveConfigSynchro(&stim->htim, &stim->sSlaveConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//--------------MASTER INIT-----------------
|
|
||||||
// master mode init
|
|
||||||
if (HAL_TIMEx_MasterConfigSynchronization(&stim->htim, &stim->sMasterConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------BDTR INIT-----------------
|
|
||||||
if (HAL_TIMEx_ConfigBreakDeadTime(&stim->htim, &stim->sBreakDeadTimeConfig) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------IT CLEAR-------------------
|
|
||||||
__HAL_TIM_CLEAR_IT(&stim->htim, TIM_IT_UPDATE);
|
|
||||||
|
|
||||||
|
|
||||||
stim->htim.Instance->CNT = 0;
|
|
||||||
return HAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize PWM Channel and GPIO for output.
|
|
||||||
* @param htim - указатель на хендл таймера.
|
|
||||||
* @param sConfigOC - указатель на настрйоки канала таймера.
|
|
||||||
* @param TIM_CHANNEL - канал таймера для настройки.
|
|
||||||
* @param GPIOx - порт для вывода ШИМ.
|
|
||||||
* @param GPIO_PIN - пин для вывода ШИМ.
|
|
||||||
* @return HAL status.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t GPIO_PIN)
|
|
||||||
{
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
||||||
HAL_StatusTypeDef RES = HAL_ERROR;
|
|
||||||
|
|
||||||
// setup channel for pwm
|
|
||||||
if (HAL_TIM_PWM_ConfigChannel(htim, sConfigOC, TIM_CHANNEL) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
// choose port for enable clock
|
|
||||||
if(GPIO_Clock_Enable(GPIOx) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN;
|
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
||||||
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
|
||||||
GPIO_InitStruct.Alternate = TIM_Alternate_Mapping(htim->Instance);
|
|
||||||
if(GPIO_InitStruct.Alternate)
|
|
||||||
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
|
|
||||||
|
|
||||||
return HAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize TIMs clock and interrupt.
|
|
||||||
* @param htim - указатель на хендл таймера.
|
|
||||||
* @note Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров,
|
|
||||||
дефайнами в tim_general.h определяются используемые таймеры.
|
|
||||||
*/
|
|
||||||
void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode)
|
|
||||||
{
|
|
||||||
it_mode = it_mode&TIM_IT_CONF;
|
|
||||||
#ifdef USE_TIM1
|
|
||||||
if(htim->Instance==TIM1)
|
|
||||||
{
|
|
||||||
/* TIM2 clock enable */
|
|
||||||
__HAL_RCC_TIM1_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM2 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM2
|
|
||||||
if(htim->Instance==TIM2)
|
|
||||||
{
|
|
||||||
/* TIM2 clock enable */
|
|
||||||
__HAL_RCC_TIM2_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM2 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM2_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM3
|
|
||||||
if(htim->Instance==TIM3)
|
|
||||||
{
|
|
||||||
/* TIM3 clock enable */
|
|
||||||
__HAL_RCC_TIM3_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM3 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM3_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM4
|
|
||||||
if(htim->Instance==TIM4)
|
|
||||||
{
|
|
||||||
/* TIM4 clock enable */
|
|
||||||
__HAL_RCC_TIM4_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM4 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM4_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM4_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM5
|
|
||||||
if(htim->Instance==TIM5)
|
|
||||||
{
|
|
||||||
/* TIM5 clock enable */
|
|
||||||
__HAL_RCC_TIM5_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM5 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM5_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM5_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM6
|
|
||||||
if(htim->Instance==TIM6)
|
|
||||||
{
|
|
||||||
/* TIM6 clock enable */
|
|
||||||
__HAL_RCC_TIM6_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM6 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM7
|
|
||||||
if(htim->Instance==TIM7)
|
|
||||||
{
|
|
||||||
/* TIM7 clock enable */
|
|
||||||
__HAL_RCC_TIM7_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM7 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM7_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM7_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM8
|
|
||||||
if(htim->Instance==TIM8)
|
|
||||||
{
|
|
||||||
/* TIM8 clock enable */
|
|
||||||
__HAL_RCC_TIM8_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM8 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM9
|
|
||||||
if(htim->Instance==TIM9)
|
|
||||||
{
|
|
||||||
/* TIM9 clock enable */
|
|
||||||
__HAL_RCC_TIM9_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM9 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM1_BRK_TIM9_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM10
|
|
||||||
if(htim->Instance==TIM10)
|
|
||||||
{
|
|
||||||
/* TIM10 clock enable */
|
|
||||||
__HAL_RCC_TIM10_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM10 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM11
|
|
||||||
if(htim->Instance==TIM11)
|
|
||||||
{
|
|
||||||
/* TIM11 clock enable */
|
|
||||||
__HAL_RCC_TIM11_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM11 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM12
|
|
||||||
if(htim->Instance==TIM12)
|
|
||||||
{
|
|
||||||
/* TIM12 clock enable */
|
|
||||||
__HAL_RCC_TIM12_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM12 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM13
|
|
||||||
if(htim->Instance==TIM13)
|
|
||||||
{
|
|
||||||
/* TIM13 clock enable */
|
|
||||||
__HAL_RCC_TIM13_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM13 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM8_UP_TIM13_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM8_UP_TIM13_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM14
|
|
||||||
if(htim->Instance==TIM14)
|
|
||||||
{
|
|
||||||
/* TIM14 clock enable */
|
|
||||||
__HAL_RCC_TIM14_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* TIM14 interrupt Init */
|
|
||||||
if(it_mode)
|
|
||||||
{
|
|
||||||
HAL_NVIC_SetPriority(TIM8_TRG_COM_TIM14_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(TIM8_TRG_COM_TIM14_IRQn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief DeInitialize TIMs clock and interrupt.
|
|
||||||
* @param htim - указатель на хендл таймера.
|
|
||||||
* @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров,
|
|
||||||
дефайнами в tim_general.h определяются используемые таймеры.
|
|
||||||
*/
|
|
||||||
void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim)
|
|
||||||
{
|
|
||||||
#ifdef USE_TIM1
|
|
||||||
if(htim->Instance==TIM1)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM1_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM1_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM2
|
|
||||||
if(htim->Instance==TIM2)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM2_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM2_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM3
|
|
||||||
if(htim->Instance==TIM3)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM3_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM3_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM4
|
|
||||||
if(htim->Instance==TIM4)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM4_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM4_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM5
|
|
||||||
if(htim->Instance==TIM5)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM5_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM5_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM6
|
|
||||||
if(htim->Instance==TIM6)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM6_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM6_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM7
|
|
||||||
if(htim->Instance==TIM7)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM7_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM7_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM8
|
|
||||||
if(htim->Instance==TIM8)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM8_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM8_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM9
|
|
||||||
if(htim->Instance==TIM9)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM9_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM9_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM10
|
|
||||||
if(htim->Instance==TIM10)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM10_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM10_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM11
|
|
||||||
if(htim->Instance==TIM11)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM11_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM11_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM12
|
|
||||||
if(htim->Instance==TIM12)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM12_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM12_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM13
|
|
||||||
if(htim->Instance==TIM13)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM13_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM13_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef USE_TIM14
|
|
||||||
if(htim->Instance==TIM14)
|
|
||||||
{
|
|
||||||
__HAL_RCC_TIM14_FORCE_RESET();
|
|
||||||
__HAL_RCC_TIM14_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
//-------------------------TIM INIT FUNCTIONS------------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
@ -1,127 +0,0 @@
|
|||||||
/**********************************TIM**************************************
|
|
||||||
Данный файл содержит объявления базовых функции и дефайны для инициализации
|
|
||||||
таймеров.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __TIM_GENERAL_H_
|
|
||||||
#define __TIM_GENERAL_H_
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
|
||||||
#define HAL_TIM_MODULE_ENABLED // need to uncomment this define in stm32f4xx_hal_conf.h
|
|
||||||
|
|
||||||
#define USE_TIM1
|
|
||||||
#define USE_TIM2
|
|
||||||
#define USE_TIM3
|
|
||||||
#define USE_TIM4
|
|
||||||
#define USE_TIM5
|
|
||||||
#define USE_TIM6
|
|
||||||
#define USE_TIM7
|
|
||||||
#define USE_TIM8
|
|
||||||
#define USE_TIM9
|
|
||||||
#define USE_TIM10
|
|
||||||
#define USE_TIM11
|
|
||||||
#define USE_TIM12
|
|
||||||
#define USE_TIM13
|
|
||||||
#define USE_TIM14
|
|
||||||
/* note: used uart defines in modbus.h */
|
|
||||||
|
|
||||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
|
||||||
#include "periph_general.h"
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////---DEFINES---////////////////////////////
|
|
||||||
#define TIM_IT_CONF_Pos 0
|
|
||||||
//#define TIM_PWM_CONF_Pos 1
|
|
||||||
//#define TIM_CLCK_SRC_CONF_Pos 2
|
|
||||||
//#define TIM_SLAVE_CONF_Pos 3
|
|
||||||
//#define TIM_MASTER_CONF_Pos 4
|
|
||||||
//#define TIM_BDTR_CONF_Pos 5
|
|
||||||
|
|
||||||
#define TIM_IT_CONF (1<<(TIM_IT_CONF_Pos))
|
|
||||||
//#define TIM_PWM_CONF (1<<(TIM_PWM_Pos))
|
|
||||||
|
|
||||||
|
|
||||||
#define TIM_Alternate_Mapping(INSTANCE) ((((INSTANCE) == TIM1) || ((INSTANCE) == TIM2))? GPIO_AF1_TIM1: \
|
|
||||||
(((INSTANCE) == TIM3) || ((INSTANCE) == TIM4) || ((INSTANCE) == TIM5))? GPIO_AF2_TIM3: \
|
|
||||||
(((INSTANCE) == TIM8) || ((INSTANCE) == TIM9) || ((INSTANCE) == TIM10) || ((INSTANCE) == TIM11))? GPIO_AF3_TIM8: \
|
|
||||||
(((INSTANCE) == TIM12) || ((INSTANCE) == TIM13) || ((INSTANCE) == TIM14))? GPIO_AF9_TIM12: \
|
|
||||||
(0))
|
|
||||||
////////////////////////////---DEFINES---////////////////////////////]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
TIM_DEFAULT = 0,
|
|
||||||
TIM_IT_MODE = TIM_IT_CONF,
|
|
||||||
// TIM_PWM_MODE = TIM_PWM_ENABLE,
|
|
||||||
// TIM_PWM_IT_MODE = TIM_PWM_ENABLE | TIM_IT_CONF,
|
|
||||||
}TIM_ITModeTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
TIM_Base_Disable = 0,
|
|
||||||
TIM_TickBase_1US = 1,
|
|
||||||
TIM_TickBase_10US = 10,
|
|
||||||
TIM_TickBase_100US = 100,
|
|
||||||
TIM_TickBase_1MS = 1000,
|
|
||||||
TIM_TickBase_10MS = 10000,
|
|
||||||
TIM_TickBase_100MS = 100000,
|
|
||||||
}TIM_MHzTickBaseTypeDef;
|
|
||||||
|
|
||||||
typedef struct // struct with settings for custom function
|
|
||||||
{
|
|
||||||
TIM_HandleTypeDef htim;
|
|
||||||
TIM_ClockConfigTypeDef sClockSourceConfig;
|
|
||||||
TIM_SlaveConfigTypeDef sSlaveConfig;
|
|
||||||
TIM_MasterConfigTypeDef sMasterConfig;
|
|
||||||
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
|
|
||||||
TIM_ITModeTypeDef sTimMode;
|
|
||||||
|
|
||||||
TIM_MHzTickBaseTypeDef sTickBaseMHz;
|
|
||||||
float sTimAHBFreqMHz;
|
|
||||||
uint32_t sTimFreqHz;
|
|
||||||
|
|
||||||
}TIM_SettingsTypeDef;
|
|
||||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
/**
|
|
||||||
* @brief Initialize TIM with TIM_SettingsTypeDef structure.
|
|
||||||
* @param stim - указатель на структуру с настройками таймера.
|
|
||||||
* @return HAL status.
|
|
||||||
* @note Данная структура содержит хендл таймера и структуры для его настройки.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim);
|
|
||||||
/**
|
|
||||||
* @brief Initialize PWM Channel and GPIO for output.
|
|
||||||
* @param htim - указатель на хендл таймера.
|
|
||||||
* @param sConfigOC - указатель на настрйоки канала таймера.
|
|
||||||
* @param TIM_CHANNEL - канал таймера для настройки.
|
|
||||||
* @param GPIOx - порт для вывода ШИМ.
|
|
||||||
* @param GPIO_PIN - пин для вывода ШИМ.
|
|
||||||
* @return HAL status.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef TIM_Output_PWM_Init(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfigOC, uint32_t TIM_CHANNEL, GPIO_TypeDef *GPIOx, uint32_t PWM_PIN);
|
|
||||||
/**
|
|
||||||
* @brief Initialize TIMs clock and interrupt.
|
|
||||||
* @param htim - указатель на хендл таймера.
|
|
||||||
* @note Чтобы не генерировать функцию с иницилизацией неиспользуемых таймеров,
|
|
||||||
дефайнами в tim_general.h определяются используемые таймеры.
|
|
||||||
*/
|
|
||||||
void TIM_Base_MspInit(TIM_HandleTypeDef* htim, TIM_ITModeTypeDef it_mode);
|
|
||||||
/**
|
|
||||||
* @brief DeInitialize TIMs clock and interrupt.
|
|
||||||
* @param htim - указатель на хендл таймера.
|
|
||||||
* @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых таймеров,
|
|
||||||
дефайнами в tim_general.h определяются используемые таймеры.
|
|
||||||
*/
|
|
||||||
void TIM_Base_MspDeInit(TIM_HandleTypeDef* htim);
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
#endif // __TIM_GENERAL_H_
|
|
||||||
@ -1,373 +0,0 @@
|
|||||||
/*********************************UART**************************************
|
|
||||||
Данный файл содержит базовые функции для инициализации UART.
|
|
||||||
//-------------------Функции-------------------//
|
|
||||||
@func users
|
|
||||||
- UART_Base_Init Инициализация UART
|
|
||||||
|
|
||||||
@func uart initialize
|
|
||||||
- UART_GPIO_Init Инициализация GPIO для UART
|
|
||||||
- UART_DMA_Init Инициализация DMA для UART
|
|
||||||
- UART_MspInit Аналог HAL_MspInit для UART
|
|
||||||
- UART_MspDeInit Аналог HAL_MspDeInit для UART
|
|
||||||
***************************************************************************/
|
|
||||||
#include "uart_general.h"
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//------------------------UART INIT FUNCTIONS------------------------
|
|
||||||
/**
|
|
||||||
* @brief Initialize UART with UART_SettingsTypeDef structure.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @return HAL status.
|
|
||||||
* @note Данная структура содержит хендл ЮАРТ и настройки перефирии (GPIO)
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart)
|
|
||||||
{ // function takes setting structure for init
|
|
||||||
|
|
||||||
// check is settings are valid
|
|
||||||
if(Check_UART_Init_Struct(suart) != HAL_OK)
|
|
||||||
return HAL_ERROR;
|
|
||||||
|
|
||||||
suart->huart.Init.Mode = UART_MODE_TX_RX;
|
|
||||||
|
|
||||||
UART_MspInit(&suart->huart);
|
|
||||||
|
|
||||||
|
|
||||||
if (HAL_UART_Init(&suart->huart) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
return HAL_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
// init gpio from UARTSettings structure
|
|
||||||
UART_GPIO_Init(suart->GPIOx, suart->GPIO_PIN_RX, suart->GPIO_PIN_TX);
|
|
||||||
|
|
||||||
// init dma from UARTSettings structure if need
|
|
||||||
if (suart->DMAChannel != 0)
|
|
||||||
UART_DMA_Init(&suart->huart, suart->huart.hdmarx, suart->DMAChannel, suart->DMA_CHANNEL_X);
|
|
||||||
|
|
||||||
|
|
||||||
return HAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize GPIO for UART.
|
|
||||||
* @param GPIOx - порт для настройки.
|
|
||||||
* @param GPIO_PIN_RX - пин для настройки на прием.
|
|
||||||
* @param GPIO_PIN_TX - пин для настройки на передачу.
|
|
||||||
*/
|
|
||||||
void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX)
|
|
||||||
{ // function takes port and pins (for rx and tx)
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
||||||
|
|
||||||
// choose port for enable clock
|
|
||||||
GPIO_Clock_Enable(GPIOx);
|
|
||||||
|
|
||||||
//USART3 GPIO Configuration
|
|
||||||
//GPIO_PIN_TX ------> USART_TX
|
|
||||||
//GPIO_PIN_RX ------> USART_RX
|
|
||||||
|
|
||||||
#if defined(STM32F407xx) // gpio init for 407
|
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN_TX|GPIO_PIN_RX;
|
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
||||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
|
||||||
GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
|
|
||||||
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
|
|
||||||
#elif defined(STM32F103xG) // gpio init for atm403/stm103
|
|
||||||
//GPIO_PIN_TX ------> USART_TX
|
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN_TX;
|
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
|
||||||
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
|
|
||||||
|
|
||||||
// GPIO_PIN_RX ------> USART_RX
|
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN_RX;
|
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
|
||||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
||||||
HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize DMA for UART.
|
|
||||||
* @param huart - указатель на хендл UART для настройки DMA.
|
|
||||||
* @param hdma_rx - указатель на хендл DMA для линии приема UART.
|
|
||||||
* @param DMAChannel - указатель на канал DMA/поток DMA в STM32F407.
|
|
||||||
* @param DMA_CHANNEL_X - канал DMA.
|
|
||||||
*/
|
|
||||||
void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X)
|
|
||||||
{ // function takes uart and dma handlers and dmachannel for uart
|
|
||||||
// for now only dma rx is supported, tx maybe later if needed
|
|
||||||
// calc defines on boot_project_setup.h
|
|
||||||
|
|
||||||
/* USART3 DMA Init */
|
|
||||||
/* USART3_RX Init */
|
|
||||||
|
|
||||||
hdma_rx->Instance = DMAChannel;
|
|
||||||
#if defined(STM32F407xx) // dma channel choose for 407
|
|
||||||
hdma_rx->Init.Channel = DMA_CHANNEL_X;
|
|
||||||
#endif
|
|
||||||
hdma_rx->Init.Direction = DMA_PERIPH_TO_MEMORY;
|
|
||||||
hdma_rx->Init.PeriphInc = DMA_PINC_DISABLE;
|
|
||||||
hdma_rx->Init.MemInc = DMA_MINC_ENABLE;
|
|
||||||
hdma_rx->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
|
||||||
hdma_rx->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
|
||||||
hdma_rx->Init.Mode = DMA_CIRCULAR;
|
|
||||||
hdma_rx->Init.Priority = DMA_PRIORITY_LOW;
|
|
||||||
if (HAL_DMA_Init(hdma_rx) != HAL_OK)
|
|
||||||
{
|
|
||||||
ERROR_HANDLER_NAME();
|
|
||||||
}
|
|
||||||
|
|
||||||
__USER_LINKDMA(huart,hdmarx,hdma_rx);
|
|
||||||
|
|
||||||
|
|
||||||
// __USER_LINKDMA is need because __HAL_LINKDMA is written for global defined hdma_rx
|
|
||||||
// so you get error because hal uses . insted of ->
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize UART & DMA clock and interrupt.
|
|
||||||
* @param huart - указатель на хендл UART для инициализации.
|
|
||||||
* @note Чтобы не генерировать функцию с иницилизацией неиспользуемых UART,
|
|
||||||
дефайнами в rs_message.h определяются используемые UART.
|
|
||||||
*/
|
|
||||||
void UART_MspInit(UART_HandleTypeDef *huart) // analog for hal function
|
|
||||||
{
|
|
||||||
// __RCC_DMA_UART_CLK_ENABLE();
|
|
||||||
// /* DMA interrupt init */
|
|
||||||
// /* DMA1_Stream1_IRQn interrupt configuration */
|
|
||||||
// HAL_NVIC_SetPriority(DMA_UART_IRQn, 0, 0);
|
|
||||||
// HAL_NVIC_EnableIRQ(DMA_UART_IRQn);
|
|
||||||
|
|
||||||
// rcc, dma and interrupt init for USARTs
|
|
||||||
// GPIO init was moved to own functions UART_GPIO_Init
|
|
||||||
if(0);
|
|
||||||
#ifdef USE_USART1
|
|
||||||
else if(huart->Instance==USART1)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* DMA2 clock enable */
|
|
||||||
__HAL_RCC_DMA2_CLK_ENABLE();
|
|
||||||
/* DMA interrupt init */
|
|
||||||
HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
|
||||||
|
|
||||||
/* USART1 clock enable */
|
|
||||||
__HAL_RCC_USART1_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* USART1 interrupt Init */
|
|
||||||
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(USART1_IRQn);
|
|
||||||
}
|
|
||||||
#endif // USE_USART1
|
|
||||||
#ifdef USE_USART2
|
|
||||||
else if(huart->Instance==USART2)
|
|
||||||
{
|
|
||||||
/* DMA1 clock enable */
|
|
||||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
/* DMA interrupt init */
|
|
||||||
HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
|
|
||||||
|
|
||||||
/* USART2 clock enable */
|
|
||||||
__HAL_RCC_USART2_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* USART2 interrupt Init */
|
|
||||||
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(USART2_IRQn);
|
|
||||||
}
|
|
||||||
#endif // USE_USART2
|
|
||||||
#ifdef USE_USART3
|
|
||||||
else if(huart->Instance==USART3)
|
|
||||||
{
|
|
||||||
/* DMA1 clock enable */
|
|
||||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
/* DMA interrupt init */
|
|
||||||
HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
|
|
||||||
|
|
||||||
/* USART3 clock enable */
|
|
||||||
__HAL_RCC_USART3_CLK_ENABLE();
|
|
||||||
/* USART3 interrupt Init */
|
|
||||||
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(USART3_IRQn);
|
|
||||||
}
|
|
||||||
#endif // USE_USART3
|
|
||||||
#ifdef USE_UART4
|
|
||||||
else if(huart->Instance==UART4)
|
|
||||||
{
|
|
||||||
/* DMA1 clock enable */
|
|
||||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
/* DMA interrupt init */
|
|
||||||
HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
|
|
||||||
|
|
||||||
/* UART4 clock enable */
|
|
||||||
__HAL_RCC_UART4_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* UART4 interrupt Init */
|
|
||||||
HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(UART4_IRQn);
|
|
||||||
}
|
|
||||||
#endif // USE_UART4
|
|
||||||
#ifdef USE_UART5
|
|
||||||
else if(huart->Instance==UART5)
|
|
||||||
{
|
|
||||||
/* DMA1 clock enable */
|
|
||||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
/* DMA interrupt init */
|
|
||||||
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
|
|
||||||
|
|
||||||
/* UART5 clock enable */
|
|
||||||
__HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* UART5 interrupt Init */
|
|
||||||
HAL_NVIC_SetPriority(UART5_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(UART5_IRQn);
|
|
||||||
}
|
|
||||||
#endif // USE_UART5
|
|
||||||
#ifdef USE_USART6
|
|
||||||
else if(huart->Instance==USART6)
|
|
||||||
{
|
|
||||||
/* DMA2 clock enable */
|
|
||||||
__HAL_RCC_DMA2_CLK_ENABLE();
|
|
||||||
/* DMA interrupt init */
|
|
||||||
HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
|
|
||||||
|
|
||||||
/* USART6 clock enable */
|
|
||||||
__HAL_RCC_USART6_CLK_ENABLE();
|
|
||||||
|
|
||||||
/* USART6 interrupt Init */
|
|
||||||
HAL_NVIC_SetPriority(USART6_IRQn, 0, 0);
|
|
||||||
HAL_NVIC_EnableIRQ(USART6_IRQn);
|
|
||||||
}
|
|
||||||
#endif // USE_USART6
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Deinitialize UART & DMA clock and interrupt.
|
|
||||||
* @param huart - указатель на хендл UART для деинициализации.
|
|
||||||
* @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых UART,
|
|
||||||
дефайнами определяются используемые UART.
|
|
||||||
*/
|
|
||||||
void UART_MspDeInit(UART_HandleTypeDef *huart) // analog for hal function
|
|
||||||
{
|
|
||||||
// rcc, dma and interrupt init for USARTs
|
|
||||||
// GPIO init was moved to own functions UART_GPIO_Init
|
|
||||||
if(0);
|
|
||||||
#ifdef USE_USART1
|
|
||||||
else if(huart->Instance==USART1)
|
|
||||||
{
|
|
||||||
|
|
||||||
// /* DMA2 clock enable */
|
|
||||||
// __HAL_RCC_DMA2_CLK_ENABLE();
|
|
||||||
// /* DMA interrupt init */
|
|
||||||
// HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);
|
|
||||||
// HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
|
|
||||||
|
|
||||||
/* USART1 clock reset */
|
|
||||||
__HAL_RCC_USART1_FORCE_RESET();
|
|
||||||
__HAL_RCC_USART1_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif // USE_USART1
|
|
||||||
#ifdef USE_USART2
|
|
||||||
else if(huart->Instance==USART2)
|
|
||||||
{
|
|
||||||
// /* DMA1 clock enable */
|
|
||||||
// __HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
// /* DMA interrupt init */
|
|
||||||
// HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 0, 0);
|
|
||||||
// HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
|
|
||||||
|
|
||||||
/* USART2 clock reset */
|
|
||||||
__HAL_RCC_USART2_FORCE_RESET();
|
|
||||||
__HAL_RCC_USART2_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif // USE_USART2
|
|
||||||
#ifdef USE_USART3
|
|
||||||
else if(huart->Instance==USART3)
|
|
||||||
{
|
|
||||||
// /* DMA1 clock enable */
|
|
||||||
// __HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
// /* DMA interrupt init */
|
|
||||||
// HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 0, 0);
|
|
||||||
// HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn);
|
|
||||||
|
|
||||||
/* USART3 clock reset */
|
|
||||||
__HAL_RCC_USART3_FORCE_RESET();
|
|
||||||
__HAL_RCC_USART3_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif // USE_USART3
|
|
||||||
#ifdef USE_UART4
|
|
||||||
else if(huart->Instance==UART4)
|
|
||||||
{
|
|
||||||
// /* DMA1 clock enable */
|
|
||||||
// __HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
// /* DMA interrupt init */
|
|
||||||
// HAL_NVIC_SetPriority(DMA1_Stream2_IRQn, 0, 0);
|
|
||||||
// HAL_NVIC_EnableIRQ(DMA1_Stream2_IRQn);
|
|
||||||
|
|
||||||
/* UART4 clock reset */
|
|
||||||
__HAL_RCC_UART4_FORCE_RESET();
|
|
||||||
__HAL_RCC_UART4_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif // USE_UART4
|
|
||||||
#ifdef USE_UART5
|
|
||||||
else if(huart->Instance==UART5)
|
|
||||||
{
|
|
||||||
// /* DMA1 clock enable */
|
|
||||||
// __HAL_RCC_DMA1_CLK_ENABLE();
|
|
||||||
// /* DMA interrupt init */
|
|
||||||
// HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
|
|
||||||
// HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
|
|
||||||
|
|
||||||
/* UART5 clock reset */
|
|
||||||
__HAL_RCC_UART5_FORCE_RESET();
|
|
||||||
__HAL_RCC_UART5_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif // USE_UART5
|
|
||||||
#ifdef USE_USART6
|
|
||||||
else if(huart->Instance==USART6)
|
|
||||||
{
|
|
||||||
// /* DMA2 clock enable */
|
|
||||||
// __HAL_RCC_DMA2_CLK_ENABLE();
|
|
||||||
// /* DMA interrupt init */
|
|
||||||
// HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
|
|
||||||
// HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
|
|
||||||
|
|
||||||
/* USART6 clock reset */
|
|
||||||
__HAL_RCC_USART6_FORCE_RESET();
|
|
||||||
__HAL_RCC_USART6_RELEASE_RESET();
|
|
||||||
}
|
|
||||||
#endif // USE_USART6
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check that uart init structure have correct values.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @return HAL status.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef Check_UART_Init_Struct(UART_SettingsTypeDef *suart)
|
|
||||||
{
|
|
||||||
// check is settings are valid
|
|
||||||
if (!IS_UART_INSTANCE(suart->huart.Instance))
|
|
||||||
return HAL_ERROR;
|
|
||||||
|
|
||||||
if (!IS_UART_BAUDRATE(suart->huart.Init.BaudRate) || (suart->huart.Init.BaudRate == NULL))
|
|
||||||
return HAL_ERROR;
|
|
||||||
|
|
||||||
if (!IS_GPIO_ALL_INSTANCE(suart->GPIOx))
|
|
||||||
return HAL_ERROR;
|
|
||||||
|
|
||||||
if (!IS_GPIO_PIN(suart->GPIO_PIN_RX) && !IS_GPIO_PIN(suart->GPIO_PIN_TX)) // if both pins arent set up
|
|
||||||
return HAL_ERROR;
|
|
||||||
|
|
||||||
return HAL_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------UART INIT FUNCTIONS------------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
@ -1,106 +0,0 @@
|
|||||||
/*********************************UART**************************************
|
|
||||||
Данный файл содержит объявления базовых функции и дефайны для инициализации
|
|
||||||
UART.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __UART_GENERAL_H_
|
|
||||||
#define __UART_GENERAL_H_
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
|
||||||
#define HAL_UART_MODULE_ENABLED // need to uncomment these defines in stm32f4xx_hal_conf.h
|
|
||||||
#define HAL_USART_MODULE_ENABLED // also need to add hal_uart.c (source code)
|
|
||||||
|
|
||||||
//#define USE_USART1
|
|
||||||
//#define USE_USART2
|
|
||||||
//#define USE_USART3
|
|
||||||
//#define USE_UART4
|
|
||||||
//#define USE_UART5
|
|
||||||
//#define USE_USART6
|
|
||||||
/* note: used uart defines in modbus.h */
|
|
||||||
|
|
||||||
/////////////////////////---USER SETTINGS---/////////////////////////
|
|
||||||
#include "periph_general.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////---DEFINES---////////////////////////////
|
|
||||||
/**
|
|
||||||
* @brief Analog for HAL define. Remade with pointer to structure.
|
|
||||||
* @note @ref __HAL_LINKDMA.
|
|
||||||
*/
|
|
||||||
#define __USER_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__) \
|
|
||||||
do{ \
|
|
||||||
(__HANDLE__)->__PPP_DMA_FIELD__ = (__DMA_HANDLE__); \
|
|
||||||
(__DMA_HANDLE__)->Parent = (__HANDLE__);} while(0U)
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////---DEFINES---////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
|
||||||
typedef struct // struct with settings for custom function
|
|
||||||
{
|
|
||||||
UART_HandleTypeDef huart;
|
|
||||||
|
|
||||||
GPIO_TypeDef *GPIOx;
|
|
||||||
uint16_t GPIO_PIN_RX;
|
|
||||||
uint16_t GPIO_PIN_TX;
|
|
||||||
|
|
||||||
DMA_Stream_TypeDef *DMAChannel; // DMAChannel = 0 if doesnt need
|
|
||||||
uint32_t DMA_CHANNEL_X; // DMAChannel = 0 if doesnt need
|
|
||||||
|
|
||||||
|
|
||||||
}UART_SettingsTypeDef;
|
|
||||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
/**
|
|
||||||
* @brief Initialize UART with UART_SettingsTypeDef structure.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @return HAL status.
|
|
||||||
* @note Данная структура содержит хендл ЮАРТ и настройки перефирии (GPIO)
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef UART_Base_Init(UART_SettingsTypeDef *suart);
|
|
||||||
/**
|
|
||||||
* @brief Initialize GPIO for UART.
|
|
||||||
* @param GPIOx - порт для настройки.
|
|
||||||
* @param GPIO_PIN_RX - пин для настройки на прием.
|
|
||||||
* @param GPIO_PIN_TX - пин для настройки на передачу.
|
|
||||||
*/
|
|
||||||
void UART_GPIO_Init(GPIO_TypeDef *GPIOx, uint16_t GPIO_PIN_RX, uint16_t GPIO_PIN_TX);
|
|
||||||
/**
|
|
||||||
* @brief Initialize DMA for UART.
|
|
||||||
* @param huart - указатель на хендл UART для настройки DMA.
|
|
||||||
* @param hdma_rx - указатель на хендл DMA для линии приема UART.
|
|
||||||
* @param DMAChannel - указатель на канал DMA/поток DMA в STM32F407.
|
|
||||||
* @param DMA_CHANNEL_X - канал DMA.
|
|
||||||
*/
|
|
||||||
void UART_DMA_Init(UART_HandleTypeDef *huart, DMA_HandleTypeDef *hdma_rx, DMA_Stream_TypeDef *DMAChannel, uint32_t DMA_CHANNEL_X);
|
|
||||||
/**
|
|
||||||
* @brief Initialize UART & DMA clock and interrupt.
|
|
||||||
* @param huart - указатель на хендл UART для инициализации.
|
|
||||||
* @note Чтобы не генерировать функцию с иницилизацией неиспользуемых UART,
|
|
||||||
дефайнами определяются используемые UART.
|
|
||||||
*/
|
|
||||||
void UART_MspInit(UART_HandleTypeDef *huart);
|
|
||||||
/**
|
|
||||||
* @brief Deinitialize UART & DMA clock and interrupt.
|
|
||||||
* @param huart - указатель на хендл UART для деинициализации.
|
|
||||||
* @note Чтобы не генерировать функцию с деиницилизацией неиспользуемых UART,
|
|
||||||
дефайнами в rs_message.h определяются используемые UART.
|
|
||||||
*/
|
|
||||||
void UART_MspDeInit(UART_HandleTypeDef *huart);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check that uart init structure have correct values.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @return HAL status.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef Check_UART_Init_Struct(UART_SettingsTypeDef *suart);
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
|
|
||||||
#endif // __UART_GENERAL_H_
|
|
||||||
@ -1,116 +0,0 @@
|
|||||||
#include "crc_algs.h"
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t CRC_calc;
|
|
||||||
uint32_t CRC_ref;
|
|
||||||
|
|
||||||
//uint16_t CRC_calc;
|
|
||||||
//uint16_t CRC_ref;
|
|
||||||
|
|
||||||
|
|
||||||
// left this global for debug
|
|
||||||
uint8_t uchCRCHi = 0xFF;
|
|
||||||
uint8_t uchCRCLo = 0xFF;
|
|
||||||
unsigned uIndex;
|
|
||||||
|
|
||||||
|
|
||||||
uint32_t crc32(uint8_t *data, uint32_t data_size)
|
|
||||||
{
|
|
||||||
static const unsigned int crc32_table[] =
|
|
||||||
{
|
|
||||||
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
|
|
||||||
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
|
|
||||||
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
|
|
||||||
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
|
|
||||||
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
|
|
||||||
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
|
|
||||||
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
|
|
||||||
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
|
|
||||||
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
|
|
||||||
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
|
|
||||||
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
|
|
||||||
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
|
|
||||||
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
|
|
||||||
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
|
|
||||||
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
|
|
||||||
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
|
|
||||||
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
|
|
||||||
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
|
|
||||||
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
|
|
||||||
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
|
|
||||||
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
|
|
||||||
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
|
|
||||||
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
|
|
||||||
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
|
|
||||||
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
|
|
||||||
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
|
|
||||||
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
|
|
||||||
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
|
|
||||||
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
|
|
||||||
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
|
|
||||||
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
|
|
||||||
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
|
|
||||||
};
|
|
||||||
unsigned int crc = 0xFFFFFFFF;
|
|
||||||
while (data_size--)
|
|
||||||
{
|
|
||||||
crc = (crc >> 8) ^ crc32_table[(crc ^ *data) & 255];
|
|
||||||
data++;
|
|
||||||
}
|
|
||||||
return crc^0xFFFFFFFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t crc16(uint8_t *data, uint32_t data_size)
|
|
||||||
{
|
|
||||||
/*Table of CRC values for high order byte*/
|
|
||||||
static unsigned char auchCRCHi[]=
|
|
||||||
{
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
|
|
||||||
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
|
|
||||||
};
|
|
||||||
/*Table of CRC values for low order byte*/
|
|
||||||
static char auchCRCLo[] =
|
|
||||||
{
|
|
||||||
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,
|
|
||||||
0xCC,0x0C,0x0D,0xCD,0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,0x08,0xC8,
|
|
||||||
0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,
|
|
||||||
0x14,0xD4,0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,0x11,0xD1,0xD0,0x10,
|
|
||||||
0xF0,0x30,0x31,0xF1,0x33,0xF3,0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
|
|
||||||
0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,0x3B,0xFB,0x39,0xF9,0xF8,0x38,
|
|
||||||
0x28,0xE8,0xE9,0x29,0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,0xEC,0x2C,
|
|
||||||
0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,
|
|
||||||
0xA0,0x60,0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,0xA5,0x65,0x64,0xA4,
|
|
||||||
0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
|
|
||||||
0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,
|
|
||||||
0xB4,0x74,0x75,0xB5,0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,0x70,0xB0,
|
|
||||||
0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,
|
|
||||||
0x9C,0x5C,0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,0x99,0x59,0x58,0x98,
|
|
||||||
0x88,0x48,0x49,0x89,0x4B,0x8B,0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
|
|
||||||
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,0x43,0x83,0x41,0x81,0x80,0x40,
|
|
||||||
};
|
|
||||||
uchCRCHi = 0xFF;
|
|
||||||
uchCRCLo = 0xFF;
|
|
||||||
/* CRC Generation Function */
|
|
||||||
while( data_size--) /* pass through message buffer */
|
|
||||||
{
|
|
||||||
uIndex = uchCRCHi ^ *data++; /* calculate the CRC */
|
|
||||||
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex];
|
|
||||||
uchCRCLo = auchCRCLo[uIndex];
|
|
||||||
}
|
|
||||||
return uchCRCHi | uchCRCLo<<8;
|
|
||||||
}
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
#include "main.h"
|
|
||||||
|
|
||||||
// extern here to use in bootloader.c
|
|
||||||
extern uint32_t CRC_calc;
|
|
||||||
extern uint32_t CRC_ref;
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t crc16(uint8_t *data, uint32_t data_size);
|
|
||||||
uint32_t crc32(uint8_t *data, uint32_t data_size);
|
|
||||||
@ -1,864 +0,0 @@
|
|||||||
/********************************MODBUS*************************************
|
|
||||||
Данный файл содержит базовые функции для реализации MODBUS.
|
|
||||||
//-------------------Функции-------------------//
|
|
||||||
@func user
|
|
||||||
- MB_SetCoil
|
|
||||||
- MB_ResetCoil
|
|
||||||
|
|
||||||
@func process message
|
|
||||||
- MB_DefineRegistersAddress Определение "начального" адреса регистров
|
|
||||||
- MB_DefineCoilsAddress Определение "начального" адреса коилов
|
|
||||||
- MB_Check_Address_For_Arr принадлежит ли адресс Addr конкретному массиву
|
|
||||||
- Modbus_Command_x Обработка команды x
|
|
||||||
|
|
||||||
@func RS functions
|
|
||||||
- Parse_Message/Collect_Message Заполнение структуры сообщения и буфера
|
|
||||||
- RS_Response Ответ на комманду
|
|
||||||
- RS_Define_Size_of_RX_Message Определение размера принимаемых данных
|
|
||||||
- RS_Init Инициализация периферии и modbus handler
|
|
||||||
|
|
||||||
@func initialization
|
|
||||||
- MB_Init Инициализация modbus
|
|
||||||
|
|
||||||
//--------------Данные для модбас--------------//
|
|
||||||
@registers Holding/Input Registers
|
|
||||||
Регистры представляют собой 16-битные числа (слова). В обработке комманд
|
|
||||||
находится адресс "начального" регистра и записывается в указатель. Доступ к
|
|
||||||
остальным регистрам осуществляется через указатель. Таким образом, сами
|
|
||||||
регистры могут представлять собой как массив так и структуру.
|
|
||||||
- sine_log - массив регистров на 500 элементов
|
|
||||||
- sine_log - массив регистров на 500 элементов
|
|
||||||
|
|
||||||
@coils Coils
|
|
||||||
Коилы представляют собой биты, упакованные в 16-битные регистры. В обработке
|
|
||||||
комманд находится адресс "начального" регистра запрашиваемого коила. Доступ к
|
|
||||||
остальным коилам осуществляется через маску и указатель. Таким образом, сами
|
|
||||||
коилы могут представлять собой как массив так и структуру.
|
|
||||||
|
|
||||||
|
|
||||||
@example SLAVE RECEIVE
|
|
||||||
//--------------Настройка модбас--------------//
|
|
||||||
// create handles and settings
|
|
||||||
Create_MODBUS_Handles(modbus1);
|
|
||||||
|
|
||||||
// set up UART for modbus
|
|
||||||
modbus1_suart.huart = &modbus1_huart;
|
|
||||||
modbus1_suart.huart->Instance = USED_MODBUS_UART;
|
|
||||||
modbus1_suart.huart->Init.BaudRate = 38400;
|
|
||||||
modbus1_suart.GPIOx = MODBUS_GPIOX;
|
|
||||||
modbus1_suart.GPIO_PIN_RX = MODBUS_GPIO_PIN_RX;
|
|
||||||
modbus1_suart.GPIO_PIN_TX = MODBUS_GPIO_PIN_TX;
|
|
||||||
|
|
||||||
// set up timeout TIM for modbus
|
|
||||||
modbus1_stim.htim = &modbus1_htim;
|
|
||||||
modbus1_stim.htim.Instance = USED_MODBUS_TIM;
|
|
||||||
modbus1_stim.htim.Init.Prescaler = 36000; // set this to 0.5 ms
|
|
||||||
modbus1_stim.TIM_MODE = TIM_IT_CONF;
|
|
||||||
|
|
||||||
// set up modbus: MB_RX_Size_NotConst and Timeout enable
|
|
||||||
hmodbus1.ID = 1;
|
|
||||||
hmodbus1.sRS_RX_Size_Mode = RS_RX_Size_NotConst;
|
|
||||||
hmodbus1.sRS_Timeout = 100;
|
|
||||||
hmodbus1.sRS_Mode = SLAVE_ALWAYS_WAIT;
|
|
||||||
hmodbus1.RS_STATUS = RS_Init(&hmodbus1, &modbus1_suart, &modbus1_stim, 0);
|
|
||||||
|
|
||||||
//----------------Прием модбас----------------//
|
|
||||||
RS_MsgTypeDef MODBUS_MSG;
|
|
||||||
RS_Receive_IT(&hmodbus1, &MODBUS_MSG);
|
|
||||||
***************************************************************************/
|
|
||||||
#include "rs_message.h"
|
|
||||||
uint32_t dbg_temp, dbg_temp2, dbg_temp3; // for debug
|
|
||||||
uint32_t err_cnt = 0;
|
|
||||||
/* EXTERN MODBUS HANDLES */
|
|
||||||
extern UART_SettingsTypeDef modbus1_suart;
|
|
||||||
extern TIM_SettingsTypeDef modbus1_stim;
|
|
||||||
extern RS_HandleTypeDef hmodbus1;
|
|
||||||
|
|
||||||
/* DEFINE REGISTERS/COILS */
|
|
||||||
uint16_t sine_log[R_SINE_LOG_QNT]; // start from 0x0000
|
|
||||||
uint16_t pwm_log[R_PWM_LOG_QNT]; // start from 500 (0x1F4)
|
|
||||||
uint16_t cnt_log[R_CNT_LOG_QNT]; // start from 100 (0x3E8)
|
|
||||||
uint16_t time_log[R_TIME_LOG_QNT]; // start from 1500 (0x5DC)
|
|
||||||
uint16_t pwm_ctrl[R_PWM_CTRL_QNT]; // start from 2000 (0x7D0)
|
|
||||||
uint16_t log_ctrl[R_PWM_CTRL_QNT]; // start from 2008 (0x7D0)
|
|
||||||
uint16_t uart_ctrl[R_UART_CTRL_QNT];
|
|
||||||
|
|
||||||
uint16_t coils_regs[C_CTRL_COILS_QNT];
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//-----------------------------FOR USER------------------------------
|
|
||||||
/**
|
|
||||||
* @brief First set up of MODBUS.
|
|
||||||
* @note Первый инит модбас. Заполняет структуры и инициализирует таймер и юарт для общения по модбас.
|
|
||||||
* Скважность ШИМ меняется по закону синусоиды, каждый канал генерирует свой полупериод синуса (от -1 до 0 И от 0 до 1)
|
|
||||||
* ШИМ генерируется на одном канале.
|
|
||||||
* @note This called from main
|
|
||||||
*/
|
|
||||||
void MODBUS_FirstInit(void)
|
|
||||||
{
|
|
||||||
//-----------SETUP MODBUS-------------
|
|
||||||
// set up UART for modbus
|
|
||||||
modbus1_suart.huart.Instance = USED_MODBUS_UART;
|
|
||||||
modbus1_suart.huart.Init.BaudRate = PROJSET.MB_SPEED;
|
|
||||||
modbus1_suart.GPIOx = (GPIO_TypeDef *)PROJSET.MB_GPIOX;
|
|
||||||
modbus1_suart.GPIO_PIN_RX = PROJSET.MB_GPIO_PIN_RX;
|
|
||||||
modbus1_suart.GPIO_PIN_TX = PROJSET.MB_GPIO_PIN_TX;
|
|
||||||
|
|
||||||
// set up timeout TIM for modbus
|
|
||||||
modbus1_stim.htim.Instance = USED_MODBUS_TIM;
|
|
||||||
modbus1_stim.sTimAHBFreqMHz = PROJSET.MB_TIM_AHB_FREQ;
|
|
||||||
modbus1_stim.sTimMode = TIM_IT_CONF;
|
|
||||||
|
|
||||||
// set up modbus: MB_RX_Size_NotConst and Timeout enable
|
|
||||||
hmodbus1.ID = PROJSET.MB_DEVICE_ID;
|
|
||||||
hmodbus1.sRS_Timeout = PROJSET.MB_MAX_TIMEOUT;
|
|
||||||
hmodbus1.sRS_Mode = SLAVE_ALWAYS_WAIT;
|
|
||||||
hmodbus1.sRS_RX_Size_Mode = RS_RX_Size_NotConst;
|
|
||||||
|
|
||||||
// INIT
|
|
||||||
hmodbus1.RS_STATUS = RS_Init(&hmodbus1, &modbus1_suart, &modbus1_stim, 0);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Set or Reset Coil at its global address.
|
|
||||||
* @param Addr - адрес коила.
|
|
||||||
* @param WriteVal - Что записать в коил: 0 или 1.
|
|
||||||
* @return ExceptionCode - Код исключения если коила по адресу не существует, и NO_ERRORS если все ок.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к любому коилу по его глобальному адрессу.
|
|
||||||
Вне зависимости от того как коилы размещены в памяти.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal)
|
|
||||||
{
|
|
||||||
//---------CHECK FOR ERRORS----------
|
|
||||||
MB_ExceptionTypeDef Exception = NO_ERRORS;
|
|
||||||
uint16_t *coils;
|
|
||||||
uint16_t start_shift = 0; // shift in coils register
|
|
||||||
|
|
||||||
//------------WRITE COIL-------------
|
|
||||||
Exception = MB_DefineCoilsAddress(&coils, Addr, 1, &start_shift, 1);
|
|
||||||
if(Exception == NO_ERRORS)
|
|
||||||
{
|
|
||||||
switch(WriteVal)
|
|
||||||
{
|
|
||||||
case SET_COIL:
|
|
||||||
*coils |= (1<<start_shift);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RESET_COIL:
|
|
||||||
*coils &= ~(1<<start_shift);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TOOGLE_COIL:
|
|
||||||
*coils ^= (1<<start_shift);
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Exception;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read Coil at its global address.
|
|
||||||
* @param Addr - адрес коила.
|
|
||||||
* @param Exception - Указатель на переменную для кода исключения, в случа неудачи при чтении.
|
|
||||||
* @return uint16_t - Возвращает весь регистр с маской на запрошенном коиле.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к любому коилу по его глобальному адрессу.
|
|
||||||
Вне зависимости от того как коилы размещены в памяти.
|
|
||||||
*/
|
|
||||||
uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
|
|
||||||
{
|
|
||||||
//---------CHECK FOR ERRORS----------
|
|
||||||
MB_ExceptionTypeDef Exception_tmp;
|
|
||||||
if(Exception == NULL) // if exception is not given to func fill it
|
|
||||||
Exception = &Exception_tmp;
|
|
||||||
|
|
||||||
uint16_t *coils;
|
|
||||||
uint16_t start_shift = 0; // shift in coils register
|
|
||||||
|
|
||||||
//------------READ COIL--------------
|
|
||||||
*Exception = MB_DefineCoilsAddress(&coils, Addr, 1, &start_shift, 0);
|
|
||||||
if(*Exception == NO_ERRORS)
|
|
||||||
{
|
|
||||||
return ((*coils)&(1<<start_shift));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//----------------FUNCTIONS FOR PROCESSING MESSAGE-------------------
|
|
||||||
/**
|
|
||||||
* @brief Define Address Origin for Input/Holding Registers
|
|
||||||
* @param pRegs - указатель на указатель регистров.
|
|
||||||
* @param Addr - адрес начального регистра.
|
|
||||||
* @param Qnt - количество запрашиваемых регистров.
|
|
||||||
* @param WriteFlag - флаг регистр нужны для чтения или записи.
|
|
||||||
* @return ExceptionCode - Код исключения если есть, и NO_ERRORS если нет.
|
|
||||||
*
|
|
||||||
* @note Определение адреса начального регистра.
|
|
||||||
* @note WriteFlag пока не используется.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t WriteFlag)
|
|
||||||
{
|
|
||||||
/* check quantity error */
|
|
||||||
if (Qnt > 125)
|
|
||||||
{
|
|
||||||
return ILLEGAL_DATA_VALUE; // return exception code
|
|
||||||
}
|
|
||||||
|
|
||||||
// sensors array
|
|
||||||
if(MB_Check_Address_For_Arr(Addr, Qnt, R_SINE_LOG_ADDR, R_SINE_LOG_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pRegs = MB_Set_Register_Ptr(&sine_log, Addr); // начало регистров хранения/входных
|
|
||||||
}
|
|
||||||
// PWM array
|
|
||||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_PWM_LOG_ADDR, R_PWM_LOG_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pRegs = MB_Set_Register_Ptr(&pwm_log, Addr - R_PWM_LOG_ADDR); // начало регистров хранения/входных
|
|
||||||
}
|
|
||||||
// counter array
|
|
||||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_CNT_LOG_ADDR, R_CNT_LOG_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pRegs = MB_Set_Register_Ptr(&cnt_log, Addr - R_CNT_LOG_ADDR); // начало регистров хранения/входных
|
|
||||||
}
|
|
||||||
// time array
|
|
||||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_TIME_LOG_ADDR, R_TIME_LOG_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pRegs = MB_Set_Register_Ptr(&time_log, Addr - R_TIME_LOG_ADDR); // начало регистров хранения/входных
|
|
||||||
}
|
|
||||||
// PWM array
|
|
||||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_PWM_CTRL_ADDR, R_PWM_CTRL_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pRegs = MB_Set_Register_Ptr(&pwm_ctrl, Addr - R_PWM_CTRL_ADDR); // начало регистров хранения/входных
|
|
||||||
}
|
|
||||||
// log array
|
|
||||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_LOG_CTRL_ADDR, R_LOG_CTRL_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pRegs = MB_Set_Register_Ptr(&log_ctrl, Addr - R_LOG_CTRL_ADDR); // начало регистров хранения/входных
|
|
||||||
}
|
|
||||||
// uart settings array
|
|
||||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, R_UART_CTRL_ADDR, R_UART_CTRL_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pRegs = MB_Set_Register_Ptr(&uart_ctrl, Addr - R_UART_CTRL_ADDR); // начало регистров хранения/входных
|
|
||||||
}
|
|
||||||
// if address doesnt match any array - return illegal data address response
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return ILLEGAL_DATA_ADDRESS;
|
|
||||||
}
|
|
||||||
// if found requeried array return no err
|
|
||||||
return NO_ERRORS; // return no errors
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Define Address Origin for coils
|
|
||||||
* @param pCoils - указатель на указатель коилов.
|
|
||||||
* @param Addr - адресс начального коила.
|
|
||||||
* @param Qnt - количество запрашиваемых коилов.
|
|
||||||
* @param start_shift - указатель на переменную содержащую сдвиг внутри регистра для начального коила.
|
|
||||||
* @param WriteFlag - флаг коилы нужны для чтения или записи.
|
|
||||||
* @return ExceptionCode - Код исключения если есть, и NO_ERRORS если нет.
|
|
||||||
*
|
|
||||||
* @note Определение адреса начального регистра запрашиваемых коилов.
|
|
||||||
* @note WriteFlag используется для определния регистров GPIO: ODR или IDR.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag)
|
|
||||||
{
|
|
||||||
/* check quantity error */
|
|
||||||
if (Qnt > 2000)
|
|
||||||
{
|
|
||||||
return ILLEGAL_DATA_VALUE; // return exception code
|
|
||||||
}
|
|
||||||
|
|
||||||
// gpiod coils
|
|
||||||
if(MB_Check_Address_For_Arr(Addr, Qnt, C_GPIOD_ADDR, C_GPIOD_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
if(WriteFlag) // if write set odr
|
|
||||||
*pCoils = MB_Set_Coil_Reg_Ptr(&GPIOD->ODR, Addr);
|
|
||||||
else // if read set idr
|
|
||||||
*pCoils = MB_Set_Coil_Reg_Ptr(&GPIOD->IDR, Addr);
|
|
||||||
}
|
|
||||||
// peripheral control coils
|
|
||||||
else if(MB_Check_Address_For_Arr(Addr, Qnt, C_CTRL_COILS_ADDR, C_CTRL_COILS_QNT) == NO_ERRORS)
|
|
||||||
{
|
|
||||||
*pCoils = MB_Set_Coil_Reg_Ptr(&coils_regs, Addr-C_CTRL_COILS_ADDR);
|
|
||||||
}
|
|
||||||
// if address doesnt match any array - return illegal data address response
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return ILLEGAL_DATA_ADDRESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
*start_shift = Addr % 16; // set shift to requested coil
|
|
||||||
// if found requeried array return no err
|
|
||||||
return NO_ERRORS; // return no errors
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Check is address valid for certain array.
|
|
||||||
* @param Addr - начальный адресс.
|
|
||||||
* @param Qnt - количество запрашиваемых элементов.
|
|
||||||
* @param R_ARR_ADDR - начальный адресс массива R_ARR.
|
|
||||||
* @param R_ARR_NUMB - количество элементов в массиве R_ARR.
|
|
||||||
* @return ExceptionCode - ILLEGAL DATA ADRESS если адресс недействителен, и NO_ERRORS если все ок.
|
|
||||||
*
|
|
||||||
* @note Позволяет определить, принадлежит ли адресс Addr массиву R_ARR:
|
|
||||||
* Если адресс Addr находится в диапазоне адрессов массива R_ARR, то возвращаем NO_ERROR.
|
|
||||||
* Если адресс Addr находится за пределами адрессов массива R_ARR - ILLEGAL_DATA_ADDRESSю.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_Check_Address_For_Arr(uint16_t Addr, uint16_t Qnt, uint16_t R_ARR_ADDR, uint16_t R_ARR_NUMB)
|
|
||||||
{
|
|
||||||
// if address from this array
|
|
||||||
if(Addr >= R_ARR_ADDR)
|
|
||||||
{
|
|
||||||
// if quantity too big return error
|
|
||||||
if ((Addr - R_ARR_ADDR) + Qnt > R_ARR_NUMB)
|
|
||||||
{
|
|
||||||
return ILLEGAL_DATA_ADDRESS; // return exception code
|
|
||||||
}
|
|
||||||
// if all ok - return no errors
|
|
||||||
return NO_ERRORS;
|
|
||||||
}
|
|
||||||
// if address isnt from this array return error
|
|
||||||
else
|
|
||||||
return ILLEGAL_DATA_ADDRESS; // return exception code
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Read Coils (01 - 0x01).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Read Coils.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Read_Coils(RS_MsgTypeDef *modbus_msg)
|
|
||||||
{
|
|
||||||
//---------CHECK FOR ERRORS----------
|
|
||||||
uint16_t *coils;
|
|
||||||
uint16_t start_shift = 0; // shift in coils register
|
|
||||||
|
|
||||||
modbus_msg->Except_Code = MB_DefineCoilsAddress(&coils, modbus_msg->Addr, modbus_msg->Qnt, &start_shift, 0);
|
|
||||||
if(modbus_msg->Except_Code != NO_ERRORS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//-----------READING COIL------------
|
|
||||||
// setup output message data size
|
|
||||||
modbus_msg->ByteCnt = Divide_Up(modbus_msg->Qnt, 8);
|
|
||||||
// create mask for coils
|
|
||||||
uint16_t mask_for_coils = 0; // mask for coils that've been chosen
|
|
||||||
uint16_t setted_coils = 0; // value of setted coils
|
|
||||||
uint16_t temp_reg = 0; // temp register for saving coils that hasnt been chosen
|
|
||||||
uint16_t coil_cnt = 0; // counter for processed coils
|
|
||||||
|
|
||||||
// cycle until all registers with requered coils would be processed
|
|
||||||
int shift = start_shift; // set shift to first coil in first register
|
|
||||||
int ind = 0; // index for coils registers and data
|
|
||||||
for(; ind <= Divide_Up(start_shift + modbus_msg->Qnt, 16); ind++)
|
|
||||||
{
|
|
||||||
//----SET MASK FOR COILS REGISTER----
|
|
||||||
mask_for_coils = 0;
|
|
||||||
for(; shift < 0x10; shift++)
|
|
||||||
{
|
|
||||||
mask_for_coils |= 1<<(shift); // choose certain coil
|
|
||||||
if(++coil_cnt >= modbus_msg->Qnt)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
shift = 0; // set shift to zero for the next step
|
|
||||||
|
|
||||||
//-----------READ COILS--------------
|
|
||||||
modbus_msg->DATA[ind] = (*(coils+ind)&mask_for_coils) >> start_shift;
|
|
||||||
if(ind > 0)
|
|
||||||
modbus_msg->DATA[ind-1] |= ((*(coils+ind)&mask_for_coils) << 16) >> start_shift;
|
|
||||||
|
|
||||||
}
|
|
||||||
// т.к. DATA 16-битная, для 8-битной передачи, надо поменять местами верхний и нижний байты
|
|
||||||
for(; ind >= 0; --ind)
|
|
||||||
modbus_msg->DATA[ind] = ByteSwap16(modbus_msg->DATA[ind]);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Read Holding Registers (03 - 0x03).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Read Holding Registers.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg)
|
|
||||||
{
|
|
||||||
//---------CHECK FOR ERRORS----------
|
|
||||||
// get origin address for data
|
|
||||||
uint16_t *pHoldRegs;
|
|
||||||
modbus_msg->Except_Code = MB_DefineRegistersAddress(&pHoldRegs, modbus_msg->Addr, modbus_msg->Qnt, NULL); // определение адреса регистров
|
|
||||||
if(modbus_msg->Except_Code != NO_ERRORS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
//-----------READING REGS------------
|
|
||||||
// setup output message data size
|
|
||||||
modbus_msg->ByteCnt = modbus_msg->Qnt*2; // *2 because we transmit 8 bits, not 16 bits
|
|
||||||
// read data
|
|
||||||
int i;
|
|
||||||
for (i = 0; i<modbus_msg->Qnt; i++)
|
|
||||||
{
|
|
||||||
modbus_msg->DATA[i] = *(pHoldRegs++);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Write Single Coils (05 - 0x05).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Write Single Coils.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Write_Single_Coil(RS_MsgTypeDef *modbus_msg)
|
|
||||||
{
|
|
||||||
//---------CHECK FOR ERRORS----------
|
|
||||||
if ((modbus_msg->Qnt != 0x0000) && (modbus_msg->Qnt != 0xFF00))
|
|
||||||
{
|
|
||||||
modbus_msg->Except_Code = ILLEGAL_DATA_VALUE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// define position of coil
|
|
||||||
uint16_t *coils;
|
|
||||||
uint16_t start_shift = 0; // shift in coils register
|
|
||||||
modbus_msg->Except_Code = MB_DefineCoilsAddress(&coils, modbus_msg->Addr, 0, &start_shift, 1);
|
|
||||||
if(modbus_msg->Except_Code != NO_ERRORS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
//----------WRITTING COIL------------
|
|
||||||
if(modbus_msg->Qnt == 0xFF00)
|
|
||||||
*(coils) |= 1<<start_shift; // write flags corresponding to received data
|
|
||||||
else
|
|
||||||
*(coils) &= ~(1<<start_shift); // write flags corresponding to received data
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Write Single Register (06 - 0x06).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Write Single Register.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Write_Single_Reg(RS_MsgTypeDef *modbus_msg)
|
|
||||||
{
|
|
||||||
// get origin address for data
|
|
||||||
uint16_t *pInputRegs;
|
|
||||||
modbus_msg->Except_Code = MB_DefineRegistersAddress(&pInputRegs, modbus_msg->Addr, 1, NULL); // определение адреса регистров
|
|
||||||
if(modbus_msg->Except_Code != NO_ERRORS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//-----------WRITTING REG------------
|
|
||||||
*(pInputRegs) = modbus_msg->Qnt;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Write Multiple Coils (15 - 0x0F).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Write Multiple Coils.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg)
|
|
||||||
{
|
|
||||||
//---------CHECK FOR ERRORS----------
|
|
||||||
if (modbus_msg->ByteCnt != Divide_Up(modbus_msg->Qnt, 8))
|
|
||||||
{ // if quantity too large OR if quantity and bytes count arent match
|
|
||||||
modbus_msg->Except_Code = ILLEGAL_DATA_VALUE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// define position of coil
|
|
||||||
uint16_t *coils; // pointer to coils
|
|
||||||
uint16_t start_shift = 0; // shift in coils register
|
|
||||||
modbus_msg->Except_Code = MB_DefineCoilsAddress(&coils, modbus_msg->Addr, modbus_msg->Qnt, &start_shift, 1);
|
|
||||||
if(modbus_msg->Except_Code != NO_ERRORS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//----------WRITTING COILS-----------
|
|
||||||
// create mask for coils
|
|
||||||
uint16_t mask_for_coils = 0; // mask for coils that've been chosen
|
|
||||||
uint32_t setted_coils = 0; // value of setted coils
|
|
||||||
uint16_t temp_reg = 0; // temp register for saving coils that hasnt been chosen
|
|
||||||
uint16_t coil_cnt = 0; // counter for processed coils
|
|
||||||
|
|
||||||
// cycle until all registers with requered coils would be processed
|
|
||||||
int shift = start_shift; // set shift to first coil in first register
|
|
||||||
for(int ind = 0; ind <= Divide_Up(start_shift + modbus_msg->Qnt, 16); ind++)
|
|
||||||
{
|
|
||||||
//----SET MASK FOR COILS REGISTER----
|
|
||||||
mask_for_coils = 0;
|
|
||||||
for(; shift < 0x10; shift++)
|
|
||||||
{
|
|
||||||
mask_for_coils |= 1<<(shift); // choose certain coil
|
|
||||||
if(++coil_cnt >= modbus_msg->Qnt)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
shift = 0; // set shift to zero for the next step
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-----------WRITE COILS-------------
|
|
||||||
// get current coils
|
|
||||||
temp_reg = *(coils+ind);
|
|
||||||
// set coils
|
|
||||||
setted_coils = ByteSwap16(modbus_msg->DATA[ind]) << start_shift;
|
|
||||||
if(ind > 0)
|
|
||||||
{
|
|
||||||
setted_coils |= ((ByteSwap16(modbus_msg->DATA[ind-1]) << start_shift) >> 16);
|
|
||||||
}
|
|
||||||
// write coils
|
|
||||||
|
|
||||||
*(coils+ind) = setted_coils & mask_for_coils;
|
|
||||||
// restore untouched coils
|
|
||||||
*(coils+ind) |= temp_reg&(~mask_for_coils);
|
|
||||||
|
|
||||||
|
|
||||||
if(coil_cnt >= modbus_msg->Qnt) // if all coils written - break cycle
|
|
||||||
break; // *kind of unnecessary
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Write Multiple Registers (16 - 0x10).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Write Multiple Registers.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg)
|
|
||||||
{
|
|
||||||
//---------CHECK FOR ERRORS----------
|
|
||||||
if (modbus_msg->Qnt*2 != modbus_msg->ByteCnt)
|
|
||||||
{ // if quantity and bytes count arent match
|
|
||||||
modbus_msg->Except_Code = 3;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// get origin address for data
|
|
||||||
uint16_t *pInputRegs;
|
|
||||||
modbus_msg->Except_Code = MB_DefineRegistersAddress(&pInputRegs, modbus_msg->Addr, modbus_msg->Qnt, NULL); // определение адреса регистров
|
|
||||||
if(modbus_msg->Except_Code != NO_ERRORS)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
//-----------WRITTING REGS-----------
|
|
||||||
for (int i = 0; i<modbus_msg->Qnt; i++)
|
|
||||||
{
|
|
||||||
*(pInputRegs++) = modbus_msg->DATA[i];
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Respond accord to received message.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о результате ответа на комманду.
|
|
||||||
* @note Обработка принятой комманды и ответ на неё.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef MB_RES = 0;
|
|
||||||
hmodbus->fMessageHandled = 0;
|
|
||||||
hmodbus->fEchoResponse = 0;
|
|
||||||
RS_Reset_TX_Flags(hmodbus); // reset flag for correct transmit
|
|
||||||
|
|
||||||
if(modbus_msg->Func_Code < ERR_VALUES_START)// if no errors after parsing
|
|
||||||
{
|
|
||||||
switch (modbus_msg->Func_Code)
|
|
||||||
{
|
|
||||||
// Read Coils
|
|
||||||
case MB_R_COILS:
|
|
||||||
hmodbus->fMessageHandled = MB_Read_Coils(hmodbus->pMessagePtr);
|
|
||||||
break;
|
|
||||||
// case MB_R_DISC_IN: break;
|
|
||||||
|
|
||||||
// Read Hodling Registers
|
|
||||||
case MB_R_HOLD_REGS:
|
|
||||||
case MB_R_IN_REGS:
|
|
||||||
hmodbus->fMessageHandled = MB_Read_Hold_Regs(hmodbus->pMessagePtr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
|
||||||
// Write Single Coils
|
|
||||||
case MB_W_COIL:
|
|
||||||
hmodbus->fMessageHandled = MB_Write_Single_Coil(hmodbus->pMessagePtr);
|
|
||||||
if(hmodbus->fMessageHandled) hmodbus->fEchoResponse = 1; // echo response if write ok
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MB_W_IN_REG:
|
|
||||||
hmodbus->fMessageHandled = MB_Write_Single_Reg(hmodbus->pMessagePtr);
|
|
||||||
if(hmodbus->fMessageHandled) hmodbus->fEchoResponse = 1; // echo response if write ok
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Write Multiple Coils
|
|
||||||
case MB_W_COILS:
|
|
||||||
hmodbus->fMessageHandled = MB_Write_Miltuple_Coils(hmodbus->pMessagePtr);
|
|
||||||
if(hmodbus->fMessageHandled) hmodbus->fEchoResponse = 1; hmodbus->RS_Message_Size = 6; // echo response if write ok (withous data bytes)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Write Multiple Registers
|
|
||||||
case MB_W_IN_REGS:
|
|
||||||
hmodbus->fMessageHandled = MB_Write_Miltuple_Regs(hmodbus->pMessagePtr);
|
|
||||||
if(hmodbus->fMessageHandled) hmodbus->fEchoResponse = 1; hmodbus->RS_Message_Size = 6; // echo response if write ok (withous data bytes)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* unknown func code */
|
|
||||||
default: modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */
|
|
||||||
}
|
|
||||||
|
|
||||||
if(hmodbus->fMessageHandled == 0)
|
|
||||||
modbus_msg->Func_Code += ERR_VALUES_START;
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we need response - check that transmit isnt busy
|
|
||||||
if( RS_Is_TX_Busy(hmodbus) )
|
|
||||||
RS_Abort(hmodbus, ABORT_TX); // if tx busy - set it free
|
|
||||||
|
|
||||||
// Transmit right there, or sets (fDeferredResponse) to transmit response in main code
|
|
||||||
MB_RES = RS_Handle_Transmit_Start(hmodbus, modbus_msg);
|
|
||||||
|
|
||||||
hmodbus->RS_STATUS = MB_RES;
|
|
||||||
return MB_RES;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Collect message in buffer to transmit it.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @param msg_uart_buff - указатель на буффер UART.
|
|
||||||
* @return RS_RES - статус о результате заполнения буфера.
|
|
||||||
* @note Заполнение буффера UART из структуры сообщения.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
|
|
||||||
{
|
|
||||||
int ind = 0; // ind for modbus-uart buffer
|
|
||||||
|
|
||||||
if(hmodbus->fEchoResponse && hmodbus->fMessageHandled) // if echo response need
|
|
||||||
ind = hmodbus->RS_Message_Size;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//------INFO ABOUT DATA/MESSAGE------
|
|
||||||
//-----------[first bytes]-----------
|
|
||||||
// set ID of message/user
|
|
||||||
modbus_uart_buff[ind++] = modbus_msg->MbAddr;
|
|
||||||
|
|
||||||
// set dat or err response
|
|
||||||
modbus_uart_buff[ind++] = modbus_msg->Func_Code;
|
|
||||||
|
|
||||||
if (modbus_msg->Func_Code < ERR_VALUES_START) // if no error occur
|
|
||||||
{
|
|
||||||
// set size of received data
|
|
||||||
if (modbus_msg->ByteCnt <= DATA_SIZE*2) // if ByteCnt less than DATA_SIZE
|
|
||||||
modbus_uart_buff[ind++] = modbus_msg->ByteCnt;
|
|
||||||
else // otherwise return data_size err
|
|
||||||
return RS_COLLECT_MSG_ERR;
|
|
||||||
|
|
||||||
//---------------DATA----------------
|
|
||||||
//-----------[data bytes]------------
|
|
||||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DATA;
|
|
||||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // filling buffer with data
|
|
||||||
{ // set data
|
|
||||||
if (i%2 == 0) // HI byte
|
|
||||||
modbus_uart_buff[ind++] = (*tmp_data_addr)>>8;
|
|
||||||
else // LO byte
|
|
||||||
{
|
|
||||||
modbus_uart_buff[ind++] = *tmp_data_addr;
|
|
||||||
tmp_data_addr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // if some error occur
|
|
||||||
{ // send expection code
|
|
||||||
modbus_uart_buff[ind++] = modbus_msg->Except_Code;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//---------------CRC----------------
|
|
||||||
//---------[last 16 bytes]----------
|
|
||||||
// calc crc of received data
|
|
||||||
uint16_t CRC_VALUE = crc16(modbus_uart_buff, ind);
|
|
||||||
// write crc to message structure and modbus-uart buffer
|
|
||||||
modbus_msg->MB_CRC = CRC_VALUE;
|
|
||||||
modbus_uart_buff[ind++] = CRC_VALUE;
|
|
||||||
modbus_uart_buff[ind++] = CRC_VALUE >> 8;
|
|
||||||
|
|
||||||
hmodbus->RS_Message_Size = ind;
|
|
||||||
|
|
||||||
return RS_OK; // returns ok
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Parse message from buffer to process it.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @param msg_uart_buff - указатель на буффер UART.
|
|
||||||
* @return RS_RES - статус о результате заполнения структуры.
|
|
||||||
* @note Заполнение структуры сообщения из буффера UART.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
|
|
||||||
{
|
|
||||||
uint32_t check_empty_buff;
|
|
||||||
int ind = 0; // ind for modbus-uart buffer
|
|
||||||
//-----INFO ABOUT DATA/MESSAGE-------
|
|
||||||
//-----------[first bits]------------
|
|
||||||
// get ID of message/user
|
|
||||||
modbus_msg->MbAddr = modbus_uart_buff[ind++];
|
|
||||||
if(modbus_msg->MbAddr != hmodbus->ID)
|
|
||||||
return RS_SKIP;
|
|
||||||
|
|
||||||
// get dat or err response
|
|
||||||
modbus_msg->Func_Code = modbus_uart_buff[ind++];
|
|
||||||
|
|
||||||
// get address from CMD
|
|
||||||
modbus_msg->Addr = modbus_uart_buff[ind++] << 8;
|
|
||||||
modbus_msg->Addr |= modbus_uart_buff[ind++];
|
|
||||||
|
|
||||||
// get address from CMD
|
|
||||||
modbus_msg->Qnt = modbus_uart_buff[ind++] << 8;
|
|
||||||
modbus_msg->Qnt |= modbus_uart_buff[ind++];
|
|
||||||
|
|
||||||
if(hmodbus->fRX_Half == 0) // if all message received
|
|
||||||
{
|
|
||||||
//---------------DATA----------------
|
|
||||||
// (optional)
|
|
||||||
if (modbus_msg->ByteCnt != 0)
|
|
||||||
{
|
|
||||||
ind++; // increment ind for data_size byte
|
|
||||||
//check that data size is correct
|
|
||||||
if (modbus_msg->ByteCnt > DATA_SIZE)
|
|
||||||
{
|
|
||||||
// hmodbus->MB_RESPONSE = MB_DATA_SIZE_ERR; // set func code - error data size more than maximumif yes, set func code - error about empty message
|
|
||||||
modbus_msg->Func_Code += ERR_VALUES_START;
|
|
||||||
return RS_PARSE_MSG_ERR;
|
|
||||||
}
|
|
||||||
uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->DATA;
|
|
||||||
for(int i = 0; i < modbus_msg->ByteCnt; i++) // /2 because we transmit 8 bits, not 16 bits
|
|
||||||
{ // set data
|
|
||||||
if (i%2 == 0)
|
|
||||||
*tmp_data_addr = ((uint16_t)modbus_uart_buff[ind++] << 8);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*tmp_data_addr |= modbus_uart_buff[ind++];
|
|
||||||
tmp_data_addr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------CRC----------------
|
|
||||||
//----------[last 16 bits]----------
|
|
||||||
// calc crc of received data
|
|
||||||
uint16_t CRC_VALUE = crc16(modbus_uart_buff, ind);
|
|
||||||
// get crc of received data
|
|
||||||
modbus_msg->MB_CRC = modbus_uart_buff[ind++];
|
|
||||||
modbus_msg->MB_CRC |= modbus_uart_buff[ind++] << 8;
|
|
||||||
// compare crc
|
|
||||||
if (modbus_msg->MB_CRC != CRC_VALUE)
|
|
||||||
modbus_msg->Func_Code += ERR_VALUES_START;
|
|
||||||
// hmodbus->MB_RESPONSE = MB_CRC_ERR; // set func code - error about wrong crc
|
|
||||||
|
|
||||||
// check is buffer empty
|
|
||||||
check_empty_buff = 0;
|
|
||||||
for(int i=0; i<ind;i++)
|
|
||||||
check_empty_buff += modbus_uart_buff[i];
|
|
||||||
// if(check_empty_buff == 0)
|
|
||||||
// hmodbus->MB_RESPONSE = MB_EMPTY_MSG; //
|
|
||||||
}
|
|
||||||
|
|
||||||
return RS_OK;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Define size of RX Message that need to be received.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param rx_data_size - указатель на переменную для записи кол-ва байт для принятия.
|
|
||||||
* @return RS_RES - статус о корректности рассчета кол-ва байт для принятия.
|
|
||||||
* @note Определение сколько байтов надо принять по протоколу.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hmodbus, uint32_t *rx_data_size)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef MB_RES = 0;
|
|
||||||
|
|
||||||
MB_RES = Parse_Message(hmodbus, hmodbus->pMessagePtr, hmodbus->pBufferPtr);
|
|
||||||
if(MB_RES == RS_SKIP) // if message not for us
|
|
||||||
return MB_RES; // return
|
|
||||||
|
|
||||||
if ((hmodbus->pMessagePtr->Func_Code & ~ERR_VALUES_START) < 0x0F)
|
|
||||||
{
|
|
||||||
hmodbus->pMessagePtr->ByteCnt = 0;
|
|
||||||
*rx_data_size = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hmodbus->pMessagePtr->ByteCnt = hmodbus->pBufferPtr[RX_FIRST_PART_SIZE-1]; // get numb of data in command
|
|
||||||
// +1 because that defines is size, not ind.
|
|
||||||
*rx_data_size = hmodbus->pMessagePtr->ByteCnt + 2;
|
|
||||||
}
|
|
||||||
hmodbus->RS_Message_Size = RX_FIRST_PART_SIZE + *rx_data_size; // size of whole message
|
|
||||||
return RS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------FOR USER------------------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//-------------------------HANDLERS FUNCTION-------------------------
|
|
||||||
#if (MODBUS_UART_NUMB == 1) // choose handler for UART
|
|
||||||
void USART1_IRQHandler(void)
|
|
||||||
#elif (MODBUS_UART_NUMB == 2)
|
|
||||||
void USART2_IRQHandler(void)
|
|
||||||
#elif (MODBUS_UART_NUMB == 3)
|
|
||||||
void USART3_IRQHandler(void)
|
|
||||||
#elif (MODBUS_UART_NUMB == 4)
|
|
||||||
void USART4_IRQHandler(void)
|
|
||||||
#elif (MODBUS_UART_NUMB == 5)
|
|
||||||
void USART5_IRQHandler(void)
|
|
||||||
#elif (MODBUS_UART_NUMB == 6)
|
|
||||||
void USART6_IRQHandler(void)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
Trace_MB_UART_Enter();
|
|
||||||
RS_UART_Handler(&hmodbus1);
|
|
||||||
Trace_MB_UART_Exit();
|
|
||||||
}
|
|
||||||
#if (MODBUS_TIM_NUMB == 1) || (MODBUS_TIM_NUMB == 10) // choose handler for TIM
|
|
||||||
void TIM1_UP_TIM10_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 2)
|
|
||||||
void TIM2_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 3)
|
|
||||||
void TIM3_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 4)
|
|
||||||
void TIM4_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 5)
|
|
||||||
void TIM5_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 6)
|
|
||||||
void TIM6_DAC_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 7)
|
|
||||||
void TIM7_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 8) || (MODBUS_TIM_NUMB == 13)
|
|
||||||
void TIM8_UP_TIM13_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 1) || (MODBUS_TIM_NUMB == 9)
|
|
||||||
void TIM1_BRK_TIM9_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 1) || (MODBUS_TIM_NUMB == 11)
|
|
||||||
void TIM1_TRG_COM_TIM11_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 8) || (MODBUS_TIM_NUMB == 12)
|
|
||||||
void TIM8_BRK_TIM12_IRQHandler(void)
|
|
||||||
#elif (MODBUS_TIM_NUMB == 8) || (MODBUS_TIM_NUMB == 14)
|
|
||||||
void TIM8_TRG_COM_TIM14_IRQHandler(void)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
Trace_MB_TIM_Enter();
|
|
||||||
RS_TIM_Handler(&hmodbus1);
|
|
||||||
Trace_MB_TIM_Exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------HANDLERS FUNCTION-------------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
@ -1,418 +0,0 @@
|
|||||||
/********************************MODBUS*************************************
|
|
||||||
Данный файл содержит объявления базовых функции и дефайны для реализации
|
|
||||||
MODBUS.
|
|
||||||
Данный файл необходимо подключить в rs_message.h. После подключать rs_message.h
|
|
||||||
к основному проекту.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __MODBUS_H_
|
|
||||||
#define __MODBUS_H_
|
|
||||||
|
|
||||||
#include "stm32f4xx_hal.h"
|
|
||||||
#include "modbus_data.h"
|
|
||||||
#include "settings.h" // for modbus settings
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
//////////////////////////---SETTINGS---/////////////////////////////
|
|
||||||
////----------DEFINES FOR MODBUS SETTING--------------
|
|
||||||
//#define MODBUS_UART_NUMB 3 // number of used uart
|
|
||||||
//#define MODBUS_SPEED 115200
|
|
||||||
//#define MODBUS_GPIOX GPIOB
|
|
||||||
//#define MODBUS_GPIO_PIN_RX GPIO_PIN_11
|
|
||||||
//#define MODBUS_GPIO_PIN_TX GPIO_PIN_10
|
|
||||||
///* accord to this define sets define USED_MB_UART = USARTx */
|
|
||||||
//#define MODBUS_TIM_NUMB 7 // number of used uart
|
|
||||||
//#define MODBUS_TIM_AHB_FREQ 72
|
|
||||||
///* accord to this define sets define USED_MB_TIM = TIMx */
|
|
||||||
|
|
||||||
///* defines for modbus behaviour */
|
|
||||||
//#define MODBUS_DEVICE_ID 1 // number of used uart
|
|
||||||
//#define MODBUS_MAX_TIMEOUT 5000 // is ms
|
|
||||||
//// custom define for size of receive message
|
|
||||||
////--------------------------------------------------
|
|
||||||
|
|
||||||
//---------------MODBUS DEVICE DATA-----------------
|
|
||||||
/* EXTERN REGISTERS/COILS */
|
|
||||||
|
|
||||||
extern uint16_t sine_log[R_SINE_LOG_QNT]; // start from 0x0000
|
|
||||||
extern uint16_t pwm_log[R_PWM_LOG_QNT]; // start from 500 (0x1F4)
|
|
||||||
extern uint16_t cnt_log[R_CNT_LOG_QNT]; // start from 100 (0x3E8)
|
|
||||||
extern uint16_t time_log[R_TIME_LOG_QNT]; // start from 1500 (0x5DC)
|
|
||||||
|
|
||||||
extern uint16_t pwm_ctrl[R_PWM_CTRL_QNT]; // start from 2000 (0x7D0)
|
|
||||||
extern uint16_t log_ctrl[R_LOG_CTRL_QNT]; // start from 2008 (0x7D0)
|
|
||||||
|
|
||||||
|
|
||||||
extern uint16_t uart_ctrl[R_UART_CTRL_QNT];
|
|
||||||
|
|
||||||
extern uint16_t coils_regs[C_CTRL_COILS_QNT]; // start from 0x0001 (16th bit)
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
|
||||||
//////////////////////////---SETTINGS---/////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////////////---USER MESSAGE DEFINES---//////////////////////
|
|
||||||
//-------------DEFINES FOR STRUCTURE----------------
|
|
||||||
/* defines for structure of modbus message */
|
|
||||||
#define MbAddr_SIZE 1 // size of (MbAddr)
|
|
||||||
#define Func_Code_SIZE 1 // size of (Func_Code)
|
|
||||||
#define Addr_SIZE 2 // size of (Addr)
|
|
||||||
#define Qnt_SIZE 2 // size of (Qnt)
|
|
||||||
#define ByteCnt_SIZE 1 // size of (ByteCnt)
|
|
||||||
#define DATA_SIZE 125 // maximum number of data: DWORD (NOT MESSAGE SIZE)
|
|
||||||
#define CRC_SIZE 2 // size of (MB_CRC) in bytes
|
|
||||||
|
|
||||||
/* size of info */
|
|
||||||
#define INFO_SIZE_MAX (MbAddr_SIZE+Func_Code_SIZE+Addr_SIZE+Qnt_SIZE+ByteCnt_SIZE)
|
|
||||||
|
|
||||||
/* size of first part of message that will be received
|
|
||||||
first receive info part of message, than defines size of rest message*/
|
|
||||||
#define RX_FIRST_PART_SIZE INFO_SIZE_MAX
|
|
||||||
|
|
||||||
/* size of buffer: max size of whole message */
|
|
||||||
#define MSG_SIZE_MAX (INFO_SIZE_MAX + DATA_SIZE*2 + CRC_SIZE) // max possible size of message
|
|
||||||
|
|
||||||
/* Structure for modbus exception codes */
|
|
||||||
typedef enum //MB_ExceptionTypeDef
|
|
||||||
{
|
|
||||||
// reading
|
|
||||||
NO_ERRORS = 0x00, // no errors
|
|
||||||
ILLEGAL_FUNCTION = 0x01, // function cannot be processed
|
|
||||||
ILLEGAL_DATA_ADDRESS = 0x02, // data at this address is not available
|
|
||||||
ILLEGAL_DATA_VALUE = 0x03, // uncorrect data value (quantity too big and cannot be returned or value for coil is incorrect)
|
|
||||||
SLAVE_DEVICE_FAILURE = 0x04, // idk
|
|
||||||
ACKNOWLEDGE = 0x05, // idk
|
|
||||||
SLAVE_DEVICE_BUSY = 0x06, // idk
|
|
||||||
MEMORY_PARITY_ERROR = 0x08, // idk
|
|
||||||
}MB_ExceptionTypeDef;
|
|
||||||
|
|
||||||
/* Structure for modbus func codes */
|
|
||||||
typedef enum //MB_FunctonTypeDef
|
|
||||||
{
|
|
||||||
// reading
|
|
||||||
MB_R_COILS = 0x01,
|
|
||||||
MB_R_DISC_IN = 0x02,
|
|
||||||
MB_R_IN_REGS = 0x03,
|
|
||||||
MB_R_HOLD_REGS = 0x04,
|
|
||||||
|
|
||||||
// writting
|
|
||||||
MB_W_COIL = 0x05,
|
|
||||||
MB_W_IN_REG = 0x06,
|
|
||||||
MB_W_COILS = 0x0F,
|
|
||||||
MB_W_IN_REGS = 0x10,
|
|
||||||
}MB_FunctonTypeDef;
|
|
||||||
#define ERR_VALUES_START 0x80U // from this value starts error func codes
|
|
||||||
|
|
||||||
/* Structure for modbus messsage */
|
|
||||||
typedef struct // RS_MsgTypeDef
|
|
||||||
{
|
|
||||||
uint8_t MbAddr;
|
|
||||||
MB_FunctonTypeDef Func_Code;
|
|
||||||
uint16_t Addr;
|
|
||||||
uint16_t Qnt;
|
|
||||||
uint8_t ByteCnt;
|
|
||||||
|
|
||||||
uint16_t DATA[DATA_SIZE];
|
|
||||||
MB_ExceptionTypeDef Except_Code;
|
|
||||||
|
|
||||||
uint16_t MB_CRC;
|
|
||||||
}RS_MsgTypeDef;
|
|
||||||
//--------------------------------------------------
|
|
||||||
/////////////////////---USER MESSAGE DEFINES---//////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////////////---GENERAL MODBUS STUFF---//////////////////////
|
|
||||||
/* Structure for coils operation */
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
// READ_COIL,
|
|
||||||
SET_COIL,
|
|
||||||
RESET_COIL,
|
|
||||||
TOOGLE_COIL,
|
|
||||||
}MB_CoilsOpTypeDef;
|
|
||||||
|
|
||||||
//------------DEFINES FOR PROCESS DATA--------------
|
|
||||||
/**
|
|
||||||
* @brief Calc dividing including remainder
|
|
||||||
* @param _val_ - делимое.
|
|
||||||
* @param _div_ - делитель.
|
|
||||||
* @note Если результат деления без остатка: он возвращается как есть
|
|
||||||
Если с остатком - округляется вверх
|
|
||||||
*/
|
|
||||||
//#define Divide_Up(_val_, _div_) (((_val_)%(_div_))? (_val_)/(_div_)+1 : (_val_)/_div_) /* через тернарный оператор */
|
|
||||||
#define Divide_Up(_val_, _div_) ((_val_ - 1) / _div_) + 1 /* через мат выражение */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Swap between Little Endian and Big Endian
|
|
||||||
* @param v - Переменная для свапа.
|
|
||||||
* @return v (new) - Свапнутая переменная.
|
|
||||||
* @note Переключения между двумя типами хранения слова: HI-LO байты и LO-HI байты.
|
|
||||||
*/
|
|
||||||
#define ByteSwap16(v) (((v&0xFF00) >> (8)) | ((v&0x00FF) << (8)))
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//-----------DEFINES FOR ACCESS TO DATA-------------
|
|
||||||
/**
|
|
||||||
* @brief Macros to set pointer to 16-bit array
|
|
||||||
* @param _arr_ - массив слов (16-бит).
|
|
||||||
*/
|
|
||||||
#define MB_Set_Arr16_Ptr(_arr_) ((uint16_t*)(&(_arr_)))
|
|
||||||
/**
|
|
||||||
* @brief Macros to set pointer to register
|
|
||||||
* @param _parr_ - массив регистров.
|
|
||||||
* @param _addr_ - Номер регистра (его индекс) от начала массива _arr_.
|
|
||||||
*/
|
|
||||||
#define MB_Set_Register_Ptr(_parr_, _addr_) ((uint16_t *)(_parr_)+(_addr_))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Macros to set pointer to a certain register that contains certain coil
|
|
||||||
* @param _parr_ - массив коилов.
|
|
||||||
* @param _coil_ - Номер коила от начала массива _arr_.
|
|
||||||
* @note Пояснение выражений
|
|
||||||
* (_coil_/16) - get index (address shift) of register that contain certain coil
|
|
||||||
* (16*(_coil_/16) - how many coils we need to skip. e.g. (16*30/16) - skip 16 coils from first register
|
|
||||||
* _coil_-(16*(_coil_/16)) - shift to certain coil in certain register
|
|
||||||
* e.g. Coil(30) gets in register[1] (30/16 = 1) coil №14 (30 - (16*30/16) = 30 - 16 = 14)
|
|
||||||
*
|
|
||||||
* Visual explanation:
|
|
||||||
* xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx
|
|
||||||
* |register[0]----| |register[1]----|
|
|
||||||
* |skip this------| |get this-------|
|
|
||||||
* |shift to 14 bit|
|
|
||||||
*/
|
|
||||||
#define MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ((uint16_t *)(_parr_)+((_coil_)/16))
|
|
||||||
#define MB_Set_Coil_Mask(_coil_) (1 << ( _coil_ - (16*((_coil_)/16)) ))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Read Coil at its local address.
|
|
||||||
* @param _parr_ - массив коилов.
|
|
||||||
* @param _coil_ - Номер коила от начала массива _arr_.
|
|
||||||
* @return uint16_t - Возвращает весь регистр с маской на запрошенном коиле.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к коилу по адресу относительно _arr_.
|
|
||||||
*/
|
|
||||||
#define MB_Read_Coil_Local(_parr_, _coil_) (( *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) & MB_Set_Coil_Mask(_coil_) ) >> _coil_)
|
|
||||||
/**
|
|
||||||
* @brief Set Coil at its local address.
|
|
||||||
* @param _parr_ - указатель на массив коилов.
|
|
||||||
* @param _coil_ - Номер коила от начала массива _arr_.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к коилу по адресу относительно _arr_.
|
|
||||||
*/
|
|
||||||
#define MB_Set_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) |= MB_Set_Coil_Mask(_coil_)
|
|
||||||
/**
|
|
||||||
* @brief Reset Coil at its local address.
|
|
||||||
* @param _parr_ - указатель на массив коилов.
|
|
||||||
* @param _coil_ - Номер коила от начала массива _arr_.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к коилу по адресу относительно _arr_.
|
|
||||||
*/
|
|
||||||
#define MB_Reset_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) &= ~(MB_Set_Coil_Mask(_coil_))
|
|
||||||
/**
|
|
||||||
* @brief Set Coil at its local address.
|
|
||||||
* @param _parr_ - указатель на массив коилов.
|
|
||||||
* @param _coil_ - Номер коила от начала массива _arr_.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к коилу по адресу относительно _arr_.
|
|
||||||
*/
|
|
||||||
#define MB_Toogle_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ^= MB_Set_Coil_Mask(_coil_)
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//------------------OTHER DEFINES-------------------
|
|
||||||
// create hadnles and settings for uart, tim, rs with _modbus_ name
|
|
||||||
#define CONCAT(a,b) a##b
|
|
||||||
#define Create_MODBUS_Handles(_modbus_) \
|
|
||||||
UART_SettingsTypeDef CONCAT(_modbus_, _suart); \
|
|
||||||
UART_HandleTypeDef CONCAT(_modbus_, _huart); \
|
|
||||||
TIM_SettingsTypeDef CONCAT(_modbus_, _stim); \
|
|
||||||
TIM_HandleTypeDef CONCAT(_modbus_, _htim); \
|
|
||||||
RS_HandleTypeDef CONCAT(h, _modbus_)
|
|
||||||
//--------------------------------------------------
|
|
||||||
///////////////////---MODBUS & MESSAGE DEFINES---////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////---FUNCTIONS FOR USER---/////////////////////////
|
|
||||||
/**
|
|
||||||
* @brief First set up of MODBUS.
|
|
||||||
* @note Первый инит модбас. Заполняет структуры и инициализирует таймер и юарт для общения по модбас.
|
|
||||||
* Скважность ШИМ меняется по закону синусоиды, каждый канал генерирует свой полупериод синуса (от -1 до 0 И от 0 до 1)
|
|
||||||
* ШИМ генерируется на одном канале.
|
|
||||||
* @note This called from main
|
|
||||||
*/
|
|
||||||
void MODBUS_FirstInit(void);
|
|
||||||
/**
|
|
||||||
* @brief Set or Reset Coil at its global address.
|
|
||||||
* @param Addr - адрес коила.
|
|
||||||
* @param WriteVal - Что записать в коил: 0 или 1.
|
|
||||||
* @return ExceptionCode - Код исключения если коила по адресу не существует, и NO_ERRORS если все ок.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к любому коилу по его глобальному адрессу.
|
|
||||||
Вне зависимости от того как коилы размещены в памяти.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal);
|
|
||||||
/**
|
|
||||||
* @brief Read Coil at its global address.
|
|
||||||
* @param Addr - адрес коила.
|
|
||||||
* @param Exception - Указатель на переменную для кода исключения, в случа неудачи при чтении.
|
|
||||||
* @return uint16_t - Возвращает весь регистр с маской на запрошенном коиле.
|
|
||||||
*
|
|
||||||
* @note Позволяет обратиться к любому коилу по его глобальному адрессу.
|
|
||||||
Вне зависимости от того как коилы размещены в памяти.
|
|
||||||
*/
|
|
||||||
uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception);
|
|
||||||
////////////////////---FUNCTIONS FOR USER---/////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////---PROCESS MODBUS COMMAND FUNCTIONS---//////////////////
|
|
||||||
/**
|
|
||||||
* @brief Check is address valid for certain array.
|
|
||||||
* @param Addr - начальный адресс.
|
|
||||||
* @param Qnt - количество запрашиваемых элементов.
|
|
||||||
* @param R_ARR_ADDR - начальный адресс массива R_ARR.
|
|
||||||
* @param R_ARR_NUMB - количество элементов в массиве R_ARR.
|
|
||||||
* @return ExceptionCode - ILLEGAL DATA ADRESS если адресс недействителен, и NO_ERRORS если все ок.
|
|
||||||
*
|
|
||||||
* @note Позволяет определить, брать ли данные по адрессу Addr из массива R_ARR.
|
|
||||||
* Если адресс Addr находится в диапазоне адрессов массива R_ARR, то возвращаем NO_ERROR.
|
|
||||||
* Если адресс Addr находится за пределами адрессов массива R_ARR - ILLEGAL_DATA_ADDRESSю.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_Check_Address_For_Arr(uint16_t Addr, uint16_t Qnt, uint16_t R_ARR_ADDR, uint16_t R_ARR_NUMB);
|
|
||||||
/**
|
|
||||||
* @brief Define Address Origin for Input/Holding Registers
|
|
||||||
* @param pRegs - указатель на указатель регистров.
|
|
||||||
* @param Addr - адрес начального регистра.
|
|
||||||
* @param Qnt - количество запрашиваемых регистров.
|
|
||||||
* @param WriteFlag - флаг регистр нужны для чтения или записи.
|
|
||||||
* @return ExceptionCode - Код исключения если есть, и NO_ERRORS если нет.
|
|
||||||
*
|
|
||||||
* @note Определение адреса начального регистра.
|
|
||||||
* @note WriteFlag пока не используется.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t WriteFlag);
|
|
||||||
/**
|
|
||||||
* @brief Define Address Origin for coils
|
|
||||||
* @param pCoils - указатель на указатель коилов.
|
|
||||||
* @param Addr - адресс начального коила.
|
|
||||||
* @param Qnt - количество запрашиваемых коилов.
|
|
||||||
* @param start_shift - указатель на переменную содержащую сдвиг внутри регистра для начального коила.
|
|
||||||
* @param WriteFlag - флаг коилы нужны для чтения или записи.
|
|
||||||
* @return ExceptionCode - Код исключения если есть, и NO_ERRORS если нет.
|
|
||||||
*
|
|
||||||
* @note Определение адреса начального регистра запрашиваемых коилов.
|
|
||||||
* @note WriteFlag используется для определния регистров GPIO: ODR или IDR.
|
|
||||||
*/
|
|
||||||
MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag);
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Read Coils (01 - 0x01).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Read Coils.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Read_Coils(RS_MsgTypeDef *modbus_msg);
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Read Holding Registers (03 - 0x03).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Read Holding Registers.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg);
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Write Single Coils (05 - 0x05).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Write Single Coils.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Write_Single_Coil(RS_MsgTypeDef *modbus_msg);
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Write Multiple Coils (15 - 0x0F).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Write Multiple Coils.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg);
|
|
||||||
/**
|
|
||||||
* @brief Proccess command Write Multiple Register (16 - 0x10).
|
|
||||||
* @param modbus_msg - указатель на структуру собщения modbus.
|
|
||||||
* @return fMessageHandled - статус о результате обработки комманды.
|
|
||||||
* @note Обработка команды Write Multiple Register.
|
|
||||||
*/
|
|
||||||
uint8_t MB_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg);
|
|
||||||
/////////////---PROCESS MODBUS COMMAND FUNCTIONS---//////////////////
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
/////////////////////////---CALC DEFINES---//////////////////////////
|
|
||||||
|
|
||||||
/* set USART_TypeDef for choosen numb of usart */
|
|
||||||
#if (MODBUS_UART_NUMB == 1)
|
|
||||||
#define USED_MODBUS_UART USART1
|
|
||||||
#define USE_USART1
|
|
||||||
#elif (MODBUS_UART_NUMB == 2)
|
|
||||||
#define USED_MODBUS_UART USART2
|
|
||||||
#define USE_USART2
|
|
||||||
#elif (MODBUS_UART_NUMB == 3)
|
|
||||||
#define USED_MODBUS_UART USART3
|
|
||||||
#define USE_USART3
|
|
||||||
#elif (MODBUS_UART_NUMB == 4)
|
|
||||||
#define USED_MODBUS_UART UART4
|
|
||||||
#define USE_UART4
|
|
||||||
#elif (MODBUS_UART_NUMB == 5)
|
|
||||||
#define USED_MODBUS_UART UART5
|
|
||||||
#define USE_UART6
|
|
||||||
#elif (MODBUS_UART_NUMB == 6)
|
|
||||||
#define USED_MODBUS_UART USART6
|
|
||||||
#define USE_USART6
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (MODBUS_TIM_NUMB == 1)
|
|
||||||
#define USED_MODBUS_TIM TIM1
|
|
||||||
#define USE_TIM1
|
|
||||||
#elif (MODBUS_TIM_NUMB == 2)
|
|
||||||
#define USED_MODBUS_TIM TIM2
|
|
||||||
#define USE_TIM2
|
|
||||||
#elif (MODBUS_TIM_NUMB == 3)
|
|
||||||
#define USED_MODBUS_TIM TIM3
|
|
||||||
#define USE_TIM3
|
|
||||||
#elif (MODBUS_TIM_NUMB == 4)
|
|
||||||
#define USED_MODBUS_TIM TIM4
|
|
||||||
#define USE_TIM4
|
|
||||||
#elif (MODBUS_TIM_NUMB == 5)
|
|
||||||
#define USED_MODBUS_TIM TIM5
|
|
||||||
#define USE_TIM5
|
|
||||||
#elif (MODBUS_TIM_NUMB == 6)
|
|
||||||
#define USED_MODBUS_TIM TIM6
|
|
||||||
#define USE_TIM6
|
|
||||||
#elif (MODBUS_TIM_NUMB == 7)
|
|
||||||
#define USED_MODBUS_TIM TIM7
|
|
||||||
#define USE_TIM7
|
|
||||||
#elif (MODBUS_TIM_NUMB == 8)
|
|
||||||
#define USED_MODBUS_TIM TIM8
|
|
||||||
#define USE_TIM8
|
|
||||||
#elif (MODBUS_TIM_NUMB == 9)
|
|
||||||
#define USED_MODBUS_TIM TIM9
|
|
||||||
#define USE_TIM9
|
|
||||||
#elif (MODBUS_TIM_NUMB == 10)
|
|
||||||
#define USED_MODBUS_TIM TIM10
|
|
||||||
#define USE_TIM10
|
|
||||||
#elif (MODBUS_TIM_NUMB == 11)
|
|
||||||
#define USED_MODBUS_TIM TIM11
|
|
||||||
#define USE_TIM11
|
|
||||||
#elif (MODBUS_TIM_NUMB == 12)
|
|
||||||
#define USED_MODBUS_TIM TIM12
|
|
||||||
#define USE_TIM12
|
|
||||||
#elif (MODBUS_TIM_NUMB == 13)
|
|
||||||
#define USED_MODBUS_TIM TIM13
|
|
||||||
#define USE_TIM13
|
|
||||||
#elif (MODBUS_TIM_NUMB == 14)
|
|
||||||
#define USED_MODBUS_TIM TIM14
|
|
||||||
#define USE_TIM14
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif //__MODBUS_H_
|
|
||||||
@ -1,71 +0,0 @@
|
|||||||
//-----------MODBUS DEVICE DATA SETTING-------------
|
|
||||||
//--------------DEFINES FOR REGISTERS---------------
|
|
||||||
// DEFINES FOR ARRAYS
|
|
||||||
#define LOG_SIZE 500
|
|
||||||
|
|
||||||
#define R_SINE_LOG_ADDR 0
|
|
||||||
#define R_SINE_LOG_QNT LOG_SIZE
|
|
||||||
|
|
||||||
#define R_PWM_LOG_ADDR 500
|
|
||||||
#define R_PWM_LOG_QNT LOG_SIZE
|
|
||||||
|
|
||||||
#define R_CNT_LOG_ADDR 1000
|
|
||||||
#define R_CNT_LOG_QNT LOG_SIZE
|
|
||||||
|
|
||||||
#define R_TIME_LOG_ADDR 1500
|
|
||||||
#define R_TIME_LOG_QNT LOG_SIZE
|
|
||||||
|
|
||||||
|
|
||||||
#define R_SETTINGS_START_ADDR 20000
|
|
||||||
|
|
||||||
#define R_PWM_CTRL_ADDR R_SETTINGS_START_ADDR
|
|
||||||
#define R_PWM_CTRL_QNT 8
|
|
||||||
|
|
||||||
#define R_LOG_CTRL_ADDR (R_SETTINGS_START_ADDR+8)
|
|
||||||
#define R_LOG_CTRL_QNT 8
|
|
||||||
|
|
||||||
#define R_UART_CTRL_ADDR R_SETTINGS_START_ADDR+16
|
|
||||||
#define R_UART_CTRL_QNT 8
|
|
||||||
|
|
||||||
// DEFINES FOR REGISTERS
|
|
||||||
|
|
||||||
#define R_PWM_CTRL_PWM_VALUE 0 // PWM value: sin freq OR pwm duty
|
|
||||||
#define R_PWM_CTRL_PWM_HZ 1 // frequency of PWM Timer
|
|
||||||
#define R_PWM_CTRL_MIN_PULSE_DUR 2 // duration of shortest pulse in sine PWM
|
|
||||||
#define R_PWM_CTRL_DEAD_TIME 3 // duration between between switches half waves (channels)
|
|
||||||
#define R_PWM_CTRL_SIN_TABLE_SIZE 4 // size of sinus table
|
|
||||||
|
|
||||||
#define R_LOG_CTRL_LOG_SIZE 0 // size of number elements in log
|
|
||||||
#define R_LOG_CTRL_LOG_PWM_NUMB 1 // number of PWM periods in log
|
|
||||||
#define R_LOG_CTRL_LOG_HZ 2 // frequency of log Timer
|
|
||||||
|
|
||||||
#define R_UART_CTRL_SPEED 0 // sin frequency
|
|
||||||
|
|
||||||
|
|
||||||
//----------------DEFINES FOR COILS-----------------
|
|
||||||
// DEFINES FOR ARRAYS
|
|
||||||
#define C_GPIOD_ADDR 0
|
|
||||||
#define C_GPIOD_QNT 16 // minimum 16
|
|
||||||
|
|
||||||
#define C_CTRL_COILS_ADDR 0x10
|
|
||||||
#define C_CTRL_COILS_QNT 160 // minimum 16
|
|
||||||
|
|
||||||
|
|
||||||
// DEFINES FOR COILS
|
|
||||||
#define COIL_GPIOD_LED1 12
|
|
||||||
#define COIL_GPIOD_LED2 13
|
|
||||||
#define COIL_GPIOD_LED3 14
|
|
||||||
#define COIL_GPIOD_LED4 15
|
|
||||||
#define COIL_GPIOD_LED1_GLOBAL (C_GPIOD_ADDR+COIL_GPIOD_LED1)
|
|
||||||
#define COIL_GPIOD_LED2_GLOBAL (C_GPIOD_ADDR+COIL_GPIOD_LED2)
|
|
||||||
#define COIL_GPIOD_LED3_GLOBAL (C_GPIOD_ADDR+COIL_GPIOD_LED3)
|
|
||||||
#define COIL_GPIOD_LED4_GLOBAL (C_GPIOD_ADDR+COIL_GPIOD_LED4)
|
|
||||||
|
|
||||||
#define COIL_UART_CTRL (0)
|
|
||||||
#define COIL_UART_CTRL_GLOBAL (C_CTRL_COILS_ADDR+COIL_UART_CTRL)
|
|
||||||
#define COIL_PWM_DC_MODE (1)
|
|
||||||
#define COIL_PWM_DC_MODE_GLOBAL (C_CTRL_COILS_ADDR+COIL_PWM_DC_MODE)
|
|
||||||
#define COIL_PWM_CH_MODE (2)
|
|
||||||
#define COIL_PWM_CH_MODE_GLOBAL (C_CTRL_COILS_ADDR+COIL_PWM_CH_MODE)
|
|
||||||
#define COIL_PWM_PHASE_MODE (3)
|
|
||||||
#define COIL_PWM_PHASE_MODE_GLOBAL (C_CTRL_COILS_ADDR+COIL_PWM_PHASE_MODE)
|
|
||||||
@ -1,502 +0,0 @@
|
|||||||
/**********************************RS***************************************
|
|
||||||
Данный файл содержит базовые функции для реализации протоколов по RS/UART.
|
|
||||||
//-------------------Функции-------------------//
|
|
||||||
@func users
|
|
||||||
- Parse_Message/Collect_Message Заполнение структуры сообщения и буфера
|
|
||||||
- RS_Response Ответ на сообщение
|
|
||||||
- RS_Define_Size_of_RX_Message Определение размера принимаемых данных
|
|
||||||
|
|
||||||
@func general
|
|
||||||
- RS_Receive_IT Ожидание комманды и ответ на неё
|
|
||||||
- RS_Transmit_IT Отправление комманды и ожидание ответа
|
|
||||||
- RS_Init Инициализация переферии и структуры для RS
|
|
||||||
- RS_ReInit_UART Реинициализация UART для RS
|
|
||||||
- RS_Abort Отмена приема/передачи по ЮАРТ
|
|
||||||
- RS_Init Инициализация периферии и modbus handler
|
|
||||||
|
|
||||||
@func callback/handler
|
|
||||||
- RS_Handle_Receive_Start Функция для запуска приема или остановки RS
|
|
||||||
- RS_Handle_Transmit_Start Функция для запуска передачи или остановки RS
|
|
||||||
|
|
||||||
- RS_UART_RxCpltCallback Коллбек при окончании приема или передачи
|
|
||||||
RS_UART_TxCpltCallback
|
|
||||||
|
|
||||||
- RS_UART_Handler Обработчик прерывания для UART
|
|
||||||
- RS_TIM_Handler Обработчик прерывания для TIM
|
|
||||||
|
|
||||||
@func uart initialize (это было в отдельных файлах, мб надо обратно разнести)
|
|
||||||
- UART_Base_Init Инициализация UART для RS
|
|
||||||
- RS_UART_GPIO_Init Инициализация GPIO для RS
|
|
||||||
- UART_DMA_Init Инициализация DMA для RS
|
|
||||||
- UART_MspInit Аналог HAL_MspInit для RS
|
|
||||||
- UART_MspDeInit Аналог HAL_MspDeInit для RS
|
|
||||||
|
|
||||||
//-------------------Общее--------------------//
|
|
||||||
@note Для настройки RS/UART под нужный протокол, необходимо:
|
|
||||||
- Определить структуру сообщения RS_MsgTypeDef и
|
|
||||||
дефайны RX_FIRST_PART_SIZE и MSG_SIZE_MAX.
|
|
||||||
- Подключить этот файл в раздел USER SETTINGS rs_message.h.
|
|
||||||
- Определить функции для обработки сообщения @func users.
|
|
||||||
- Добавить UART/TIM Handler в Хендлер используемых UART/TIM.
|
|
||||||
***************************************************************************/
|
|
||||||
#include "rs_message.h"
|
|
||||||
|
|
||||||
uint8_t RS_Buffer[MSG_SIZE_MAX]; // uart buffer
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//-------------------------GENERAL FUNCTIONS-------------------------
|
|
||||||
/**
|
|
||||||
* @brief Start receive IT.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации приема.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef RS_RES = 0;
|
|
||||||
HAL_StatusTypeDef uart_res = 0;
|
|
||||||
|
|
||||||
//-------------CHECK RS LINE----------------
|
|
||||||
// check that receive isnt busy
|
|
||||||
if( RS_Is_RX_Busy(hRS) ) // if tx busy - return busy status
|
|
||||||
return RS_BUSY;
|
|
||||||
|
|
||||||
//-----------INITIALIZE RECEIVE-------------
|
|
||||||
// if all OK: start receiving
|
|
||||||
RS_Set_Busy(hRS); // set RS busy
|
|
||||||
RS_Set_RX_Flags(hRS); // initialize flags for receive
|
|
||||||
hRS->pMessagePtr = RS_msg; // set pointer to message structire for filling it from UARTHandler fucntions
|
|
||||||
|
|
||||||
// start receiving
|
|
||||||
uart_res = HAL_UART_Receive_IT(hRS->huart, hRS->pBufferPtr, RX_FIRST_PART_SIZE); // receive until ByteCnt+1 byte,
|
|
||||||
// then in Callback restart receive for rest bytes
|
|
||||||
|
|
||||||
// if receive isnt started - abort RS
|
|
||||||
if(uart_res != HAL_OK)
|
|
||||||
{
|
|
||||||
RS_RES = RS_Abort(hRS, ABORT_RS);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
RS_RES = RS_OK;
|
|
||||||
|
|
||||||
hRS->RS_STATUS = RS_RES;
|
|
||||||
return RS_RES; // returns result of receive init
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Start transmit IT.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации передачи.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef RS_RES = 0;
|
|
||||||
HAL_StatusTypeDef uart_res = 0;
|
|
||||||
|
|
||||||
//-------------CHECK RS LINE----------------
|
|
||||||
// check that transmit isnt busy
|
|
||||||
if( RS_Is_TX_Busy(hRS) ) // if tx busy - return busy status
|
|
||||||
return RS_BUSY;
|
|
||||||
// check receive line
|
|
||||||
|
|
||||||
|
|
||||||
//------------COLLECT MESSAGE---------------
|
|
||||||
RS_RES = Collect_Message(hRS, RS_msg, hRS->pBufferPtr);
|
|
||||||
if (RS_RES != RS_OK) // if message isnt collect - stop RS and return error in RS_RES
|
|
||||||
{// need collect message status, so doesnt write abort to RS_RES
|
|
||||||
RS_Abort(hRS, ABORT_RS);
|
|
||||||
RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); // restart receive
|
|
||||||
}
|
|
||||||
else // if collect successful
|
|
||||||
{
|
|
||||||
|
|
||||||
//----------INITIALIZE TRANSMIT-------------
|
|
||||||
RS_Set_Busy(hRS); // set RS busy
|
|
||||||
RS_Set_TX_Flags(hRS); // initialize flags for transmit IT
|
|
||||||
hRS->pMessagePtr = RS_msg; // set pointer for filling given structure from UARTHandler fucntion
|
|
||||||
|
|
||||||
// if all OK: start transmitting
|
|
||||||
uart_res = HAL_UART_Transmit_IT(hRS->huart, hRS->pBufferPtr, hRS->RS_Message_Size);
|
|
||||||
// if transmit isnt started - abort RS
|
|
||||||
if(uart_res != HAL_OK)
|
|
||||||
{
|
|
||||||
RS_RES = RS_Abort(hRS, ABORT_RS);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
RS_RES = RS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
hRS->RS_STATUS = RS_RES;
|
|
||||||
return RS_RES; // returns result of transmit init
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize UART and handle RS stucture.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @param stim - указатель на структуру с настройками таймера.
|
|
||||||
* @param pRS_BufferPtr - указатель на буффер для приема-передачи по UART. Если он NULL, то поставиться библиотечный буфер.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации.
|
|
||||||
* @note Инициализация перефирии и структуры для приема-передачи по RS.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_SettingsTypeDef *suart, TIM_SettingsTypeDef *stim, uint8_t *pRS_BufferPtr)
|
|
||||||
{
|
|
||||||
// check that hRS is defined
|
|
||||||
if (hRS == NULL)
|
|
||||||
return RS_ERR;
|
|
||||||
|
|
||||||
// check that huart is defined
|
|
||||||
if ((suart->huart.Instance == NULL) || (suart->huart.Init.BaudRate == NULL))
|
|
||||||
return RS_ERR;
|
|
||||||
|
|
||||||
// init uart
|
|
||||||
UART_Base_Init(suart);
|
|
||||||
hRS->huart = &suart->huart;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// check that timeout in interrupt needed
|
|
||||||
if (hRS->sRS_Timeout)
|
|
||||||
{
|
|
||||||
if (stim->htim.Instance == NULL) // check is timer defined
|
|
||||||
return RS_ERR;
|
|
||||||
|
|
||||||
// calc frequency corresponding to timeout and tims 1ms tickbase
|
|
||||||
stim->sTickBaseMHz = TIM_TickBase_1MS;
|
|
||||||
stim->htim.Init.Period = hRS->sRS_Timeout;
|
|
||||||
|
|
||||||
TIM_Base_Init(stim);
|
|
||||||
hRS->htim = &stim->htim;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hRS->sRS_RX_Size_Mode == NULL)
|
|
||||||
return RS_ERR;
|
|
||||||
|
|
||||||
// check that buffer is defined
|
|
||||||
if (hRS->pBufferPtr == NULL)
|
|
||||||
{
|
|
||||||
hRS->pBufferPtr = RS_Buffer; // if no - set default
|
|
||||||
}
|
|
||||||
else
|
|
||||||
hRS->pBufferPtr = pRS_BufferPtr; // if yes - set by user
|
|
||||||
|
|
||||||
return RS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief ReInitialize UART and RS receive.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации.
|
|
||||||
* @note Реинициализация UART и приема по RS.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef RS_ReInit_UART(RS_HandleTypeDef *hRS, UART_SettingsTypeDef *suart)
|
|
||||||
{
|
|
||||||
HAL_StatusTypeDef RS_RES;
|
|
||||||
hRS->fReInit_UART = 0;
|
|
||||||
|
|
||||||
// check is settings are valid
|
|
||||||
if(Check_UART_Init_Struct(suart) != HAL_OK)
|
|
||||||
return HAL_ERROR;
|
|
||||||
|
|
||||||
RS_Abort(hRS, ABORT_RS);
|
|
||||||
UART_MspDeInit(&suart->huart);
|
|
||||||
RS_RES = UART_Base_Init(suart);
|
|
||||||
|
|
||||||
|
|
||||||
RS_Receive_IT(hRS, hRS->pMessagePtr);
|
|
||||||
return RS_RES;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Abort RS/UART.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param AbortMode - выбор, что надо отменить.
|
|
||||||
- ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX,
|
|
||||||
- ABORT_RX: Отмена приема по ЮАРТ, с очищением флагов RX,
|
|
||||||
- ABORT_RX_TX: Отмена приема и передачи по ЮАРТ,
|
|
||||||
- ABORT_RS: Отмена приема-передачи RS, с очищением всей структуры.
|
|
||||||
* @return RS_RES - статус о состоянии RS после аборта.
|
|
||||||
* @note Отмена работы UART в целом или отмена приема/передачи RS.
|
|
||||||
Также очищается хендл hRS.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode)
|
|
||||||
{
|
|
||||||
HAL_StatusTypeDef uart_res = 0;
|
|
||||||
hRS->htim->Instance->CNT = 0;
|
|
||||||
__HAL_TIM_CLEAR_IT(hRS->htim, TIM_IT_UPDATE);
|
|
||||||
|
|
||||||
if(hRS->sRS_Timeout) // if timeout setted
|
|
||||||
HAL_TIM_Base_Stop_IT(hRS->htim); // stop timeout
|
|
||||||
|
|
||||||
if((AbortMode&ABORT_RS) == 0x00)
|
|
||||||
{
|
|
||||||
if((AbortMode&ABORT_RX) == ABORT_RX)
|
|
||||||
{
|
|
||||||
uart_res = HAL_UART_AbortReceive(hRS->huart); // abort receive
|
|
||||||
RS_Reset_RX_Flags(hRS);
|
|
||||||
}
|
|
||||||
|
|
||||||
if((AbortMode&ABORT_TX) == ABORT_TX)
|
|
||||||
{
|
|
||||||
uart_res = HAL_UART_AbortTransmit(hRS->huart); // abort transmit
|
|
||||||
RS_Reset_TX_Flags(hRS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uart_res = HAL_UART_Abort(hRS->huart);
|
|
||||||
RS_Clear_All(hRS);
|
|
||||||
}
|
|
||||||
hRS->RS_STATUS = RS_ABORTED;
|
|
||||||
return RS_ABORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------GENERAL FUNCTIONS-------------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
|
|
||||||
/**
|
|
||||||
* @brief Handle for starting receive.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации приема или окончания общения.
|
|
||||||
* @note Определяет начинать прием команды/ответа или нет.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef RS_RES = 0;
|
|
||||||
|
|
||||||
switch(hRS->sRS_Mode)
|
|
||||||
{
|
|
||||||
case SLAVE_ALWAYS_WAIT: // in slave mode with permanent waiting
|
|
||||||
RS_RES = RS_Receive_IT(hRS, RS_msg); break; // start receiving again
|
|
||||||
case SLAVE_TIMEOUT_WAIT: // in slave mode with timeout waiting (start receiving cmd by request)
|
|
||||||
RS_Set_Free(hRS); RS_RES = RS_OK; break; // end RS communication (set RS unbusy)
|
|
||||||
}
|
|
||||||
|
|
||||||
return RS_RES;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Handle for starting transmit.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации передачи.
|
|
||||||
* @note Определяет отвечать ли на команду или нет.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef RS_RES = 0;
|
|
||||||
|
|
||||||
switch(hRS->sRS_Mode)
|
|
||||||
{
|
|
||||||
case SLAVE_ALWAYS_WAIT: // in slave mode always response
|
|
||||||
case SLAVE_TIMEOUT_WAIT: // transmit response
|
|
||||||
RS_RES = RS_Transmit_IT(hRS, RS_msg); break;
|
|
||||||
}
|
|
||||||
return RS_RES;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief UART RX Callback: define behaviour after receiving parts of message.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @return RS_RES - статус о состоянии RS после обработки приема.
|
|
||||||
* @note Контролирует прием сообщения: определяет размер принимаемой посылки и обрабатывает его.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_UART_RxCpltCallback(RS_HandleTypeDef *hRS)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef RS_RES = 0;
|
|
||||||
HAL_StatusTypeDef uart_res = 0;
|
|
||||||
|
|
||||||
// if we had received bytes before ByteCnt
|
|
||||||
if((hRS->sRS_RX_Size_Mode == RS_RX_Size_NotConst) && (hRS->fRX_Half == 0)) // if data size isnt constant and its first half, and
|
|
||||||
{ // First receive part of message, then define size of rest of message, and start receive it
|
|
||||||
hRS->fRX_Half = 1;
|
|
||||||
//---------------FIND DATA SIZE-----------------
|
|
||||||
uint32_t NuRS_of_Rest_Bytes = 0;
|
|
||||||
RS_RES = RS_Define_Size_of_RX_Message(hRS, &NuRS_of_Rest_Bytes);
|
|
||||||
|
|
||||||
|
|
||||||
// if there is no bytes to receive OR we need to skip this message - restart receive
|
|
||||||
if ((NuRS_of_Rest_Bytes == 0) || (RS_RES == RS_SKIP))
|
|
||||||
{
|
|
||||||
RS_Abort(hRS, ABORT_RX);
|
|
||||||
RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
|
|
||||||
return RS_RES;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------START UART RECEIVE---------------
|
|
||||||
uart_res = HAL_UART_Receive_IT(hRS->huart, (hRS->pBufferPtr + RX_FIRST_PART_SIZE), NuRS_of_Rest_Bytes);
|
|
||||||
|
|
||||||
if(uart_res != HAL_OK)
|
|
||||||
{// need uart status, so doesnt write abort to RS_RES
|
|
||||||
RS_RES = RS_Abort(hRS, ABORT_RS);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
RS_RES = RS_OK;
|
|
||||||
}
|
|
||||||
else // if we had received whole message
|
|
||||||
{
|
|
||||||
hRS->fRX_Half = 0;
|
|
||||||
|
|
||||||
//---------PROCESS DATA & ENDING RECEIVING--------
|
|
||||||
RS_Set_RX_End(hRS);
|
|
||||||
|
|
||||||
if(hRS->sRS_Timeout) // if timeout setted
|
|
||||||
HAL_TIM_Base_Stop_IT(hRS->htim); // stop timeout
|
|
||||||
|
|
||||||
// parse received data
|
|
||||||
RS_RES = Parse_Message(hRS, hRS->pMessagePtr, hRS->pBufferPtr); // parse message
|
|
||||||
|
|
||||||
// RESPONSE
|
|
||||||
RS_RES = RS_Response(hRS, hRS->pMessagePtr);
|
|
||||||
}
|
|
||||||
|
|
||||||
return RS_RES;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief UART TX Callback: define behaviour after transmiting message.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @return RS_RES - статус о состоянии RS после обработки приема.
|
|
||||||
* @note Определяет поведение RS после передачи сообщения.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_UART_TxCpltCallback(RS_HandleTypeDef *hRS)
|
|
||||||
{
|
|
||||||
RS_StatusTypeDef RS_RES = RS_OK;
|
|
||||||
HAL_StatusTypeDef uart_res = 0;
|
|
||||||
|
|
||||||
//--------------ENDING TRANSMITTING-------------
|
|
||||||
RS_Set_TX_End(hRS);
|
|
||||||
|
|
||||||
//-----------START RECEIVING or END RS----------
|
|
||||||
RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
|
|
||||||
|
|
||||||
return RS_RES;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Handler for UART.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @note Обрабатывает ошибки если есть и вызывает RS Коллбеки.
|
|
||||||
* Добавить вызов этой функции в UARTx_IRQHandler().
|
|
||||||
*/
|
|
||||||
void RS_UART_Handler(RS_HandleTypeDef *hRS)
|
|
||||||
{
|
|
||||||
HAL_UART_IRQHandler(hRS->huart);
|
|
||||||
//-------------CALL RS CALLBACKS------------
|
|
||||||
/* IF NO ERROR OCCURS */
|
|
||||||
if(hRS->huart->ErrorCode == 0)
|
|
||||||
{
|
|
||||||
hRS->htim->Instance->CNT = 0; // reset cnt;
|
|
||||||
/* Start timeout */
|
|
||||||
if(hRS->sRS_Timeout) // if timeout setted
|
|
||||||
if((hRS->huart->RxXferCount+1 == hRS->huart->RxXferSize) && RS_Is_RX_Busy(hRS)) // if first byte is received and receive is active
|
|
||||||
HAL_TIM_Base_Start_IT(hRS->htim);
|
|
||||||
|
|
||||||
/* RX Callback */
|
|
||||||
if (( hRS->huart->RxXferCount == 0U) && RS_Is_RX_Busy(hRS) && // if all bytes are received and receive is active
|
|
||||||
hRS->huart->RxState != HAL_UART_STATE_BUSY_RX) // also check that receive "REALLY" isnt busy
|
|
||||||
RS_UART_RxCpltCallback(hRS);
|
|
||||||
|
|
||||||
/* TX Callback */
|
|
||||||
if (( hRS->huart->TxXferCount == 0U) && RS_Is_TX_Busy(hRS) && // if all bytes are transmited and transmit is active
|
|
||||||
hRS->huart->gState != HAL_UART_STATE_BUSY_TX) // also check that receive "REALLY" isnt busy
|
|
||||||
RS_UART_TxCpltCallback(hRS);
|
|
||||||
}
|
|
||||||
//----------------ERRORS HANDLER----------------
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* de-init uart transfer */
|
|
||||||
RS_Abort(hRS, ABORT_RS);
|
|
||||||
RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
|
|
||||||
|
|
||||||
// later, maybe, will be added specific handlers for err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Handler for TIM.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @note Попадание сюда = таймаут и перезапуск RS приема
|
|
||||||
* Добавить вызов этой функции в TIMx_IRQHandler().
|
|
||||||
*/
|
|
||||||
void RS_TIM_Handler(RS_HandleTypeDef *hRS)
|
|
||||||
{
|
|
||||||
HAL_TIM_IRQHandler(hRS->htim);
|
|
||||||
HAL_TIM_Base_Stop_IT(hRS->htim);
|
|
||||||
RS_Abort(hRS, ABORT_RS);
|
|
||||||
|
|
||||||
RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
|
|
||||||
}
|
|
||||||
//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//--------------WEAK PROTOTYPES FOR PROCESSING MESSAGE---------------
|
|
||||||
///**
|
|
||||||
// * @brief Respond accord to received message.
|
|
||||||
// * @param hRS - указатель на хендлер RS.
|
|
||||||
// * @param RS_msg - указатель на структуру сообщения.
|
|
||||||
// * @return RS_RES - статус о результате ответа на комманду.
|
|
||||||
// * @note Обработка принятой комманды и ответ на неё.
|
|
||||||
// */
|
|
||||||
//__weak RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
|
|
||||||
//{
|
|
||||||
// /* Redefine function for user purposes */
|
|
||||||
// return RS_ERR;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * @brief Collect message in buffer to transmit it.
|
|
||||||
// * @param hRS - указатель на хендлер RS.
|
|
||||||
// * @param RS_msg - указатель на структуру сообщения.
|
|
||||||
// * @param msg_uart_buff - указатель на буффер UART.
|
|
||||||
// * @return RS_RES - статус о результате заполнения буфера.
|
|
||||||
// * @note Заполнение буффера UART из структуры сообщения.
|
|
||||||
// */
|
|
||||||
//__weak RS_StatusTypeDef Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
|
|
||||||
//{
|
|
||||||
// /* Redefine function for user purposes */
|
|
||||||
// return RS_ERR;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * @brief Parse message from buffer to process it.
|
|
||||||
// * @param hRS - указатель на хендлер RS.
|
|
||||||
// * @param RS_msg - указатель на структуру сообщения.
|
|
||||||
// * @param msg_uart_buff - указатель на буффер UART.
|
|
||||||
// * @return RS_RES - статус о результате заполнения структуры.
|
|
||||||
// * @note Заполнение структуры сообщения из буффера UART.
|
|
||||||
// */
|
|
||||||
//__weak RS_StatusTypeDef Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff)
|
|
||||||
//{
|
|
||||||
// /* Redefine function for user purposes */
|
|
||||||
// return RS_ERR;
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
///**
|
|
||||||
// * @brief Define size of RX Message that need to be received.
|
|
||||||
// * @param hRS - указатель на хендлер RS.
|
|
||||||
// * @param rx_data_size - указатель на переменную для записи кол-ва байт для принятия.
|
|
||||||
// * @return RS_RES - статус о корректности рассчета кол-ва байт для принятия.
|
|
||||||
// * @note Определение сколько байтов надо принять по протоколу.
|
|
||||||
// */
|
|
||||||
//__weak RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hRS, uint32_t *rx_data_size)
|
|
||||||
//{
|
|
||||||
// /* Redefine function for user purposes */
|
|
||||||
// return RS_ERR;
|
|
||||||
//}
|
|
||||||
//--------------WEAK PROTOTYPES FOR PROCESSING MESSAGE---------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
@ -1,297 +0,0 @@
|
|||||||
/**********************************RS***************************************
|
|
||||||
Данный файл содержит объявления базовых функции и дефайны для реализации
|
|
||||||
протоколов по RS/UART.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __RS_LIB_H_
|
|
||||||
#define __RS_LIB_H_
|
|
||||||
|
|
||||||
#include "modbus.h"
|
|
||||||
|
|
||||||
#include "periph_general.h"
|
|
||||||
#include "crc_algs.h"
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////---DEFINES---////////////////////////////
|
|
||||||
/* Check that all defines required by RS are defined */
|
|
||||||
#ifndef MSG_SIZE_MAX
|
|
||||||
#error Define MSG_SIZE_MAX (Maximum size of message). This is necessary to create buffer for UART.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef RX_FIRST_PART_SIZE
|
|
||||||
#error Define RX_FIRST_PART_SIZE (Size of first part of message). This is necessary to receive the first part of the message, from which determine the size of the remaining part of the message.
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Clear message-uart buffer */
|
|
||||||
#define RS_Clear_Buff(_buff_) for(int i=0; i<MSG_SIZE_MAX;i++) _buff_[i] = NULL
|
|
||||||
|
|
||||||
/* Set/Reset flags */
|
|
||||||
#define RS_Set_Free(_hRS_) _hRS_->fRS_Busy = 0
|
|
||||||
#define RS_Set_Busy(_hRS_) _hRS_->fRS_Busy = 1
|
|
||||||
|
|
||||||
#define RS_Set_RX_Flags(_hRS_) _hRS_->fRX_Busy = 1; _hRS_->fRX_Done = 0; _hRS_->fRX_Half = 0
|
|
||||||
#define RS_Set_TX_Flags(_hRS_) _hRS_->fTX_Busy = 1; _hRS_->fTX_Done = 0
|
|
||||||
|
|
||||||
#define RS_Reset_RX_Flags(_hRS_) _hRS_->fRX_Busy = 0; _hRS_->fRX_Done = 0; _hRS_->fRX_Half = 0
|
|
||||||
#define RS_Reset_TX_Flags(_hRS_) _hRS_->fTX_Busy = 0; _hRS_->fTX_Done = 0
|
|
||||||
|
|
||||||
#define RS_Set_RX_End_Flag(_hRS_) _hRS_->fRX_Done = 1
|
|
||||||
#define RS_Set_TX_End_Flag(_hRS_) _hRS_->fTX_Done = 1
|
|
||||||
|
|
||||||
#define RS_Set_RX_End(_hRS_) RS_Reset_RX_Flags(_hRS_); RS_Set_RX_End_Flag(_hRS_)
|
|
||||||
#define RS_Set_TX_End(_hRS_) RS_Reset_TX_Flags(_hRS_); RS_Set_TX_End_Flag(_hRS_)
|
|
||||||
|
|
||||||
/* Clear all RS stuff */
|
|
||||||
#define RS_Clear_All(_hRS_) RS_Clear_Buff(_hRS_->pBufferPtr); RS_Reset_RX_Flags(_hRS_); RS_Reset_TX_Flags(_hRS_);
|
|
||||||
|
|
||||||
//#define MB_Is_RX_Busy(_hRS_) ((_hRS_->huart->gState&HAL_USART_STATE_BUSY_RX) == HAL_USART_STATE_BUSY_RX)
|
|
||||||
//#define MB_Is_TX_Busy(_hRS_) ((_hRS_->huart->gState&HAL_USART_STATE_BUSY_RX) == HAL_USART_STATE_BUSY_TX)
|
|
||||||
#define RS_Is_RX_Busy(_hRS_) (_hRS_->fRX_Busy == 1)
|
|
||||||
#define RS_Is_TX_Busy(_hRS_) (_hRS_->fTX_Busy == 1)
|
|
||||||
////////////////////////////---DEFINES---////////////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
|
||||||
//------------------ENUMERATIONS--------------------
|
|
||||||
/* Enums for respond CMD about RS status*/
|
|
||||||
typedef enum // RS_StatusTypeDef
|
|
||||||
{
|
|
||||||
/* IN-CODE STATUS (start from 0x01, and goes up)*/
|
|
||||||
/*0x01*/ RS_OK = 0x01,
|
|
||||||
/*0x02*/ RS_ERR,
|
|
||||||
/*0x03*/ RS_ABORTED,
|
|
||||||
/*0x04*/ RS_BUSY,
|
|
||||||
/*0x05*/ RS_SKIP,
|
|
||||||
|
|
||||||
/*0x06*/ RS_COLLECT_MSG_ERR,
|
|
||||||
/*0x07*/ RS_PARSE_MSG_ERR,
|
|
||||||
|
|
||||||
// reserved values
|
|
||||||
// /*0x00*/ RS_UNKNOWN_ERR = 0x00, // reserved for case, if no one error founded (nothing changed response from zero)
|
|
||||||
}RS_StatusTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* Enums for RS Modes */
|
|
||||||
typedef enum // RS_ModeTypeDef
|
|
||||||
{
|
|
||||||
SLAVE_ALWAYS_WAIT = 0x01, // Slave mode with infinity waiting
|
|
||||||
SLAVE_TIMEOUT_WAIT = 0x02, // Slave mode with waiting with timeout
|
|
||||||
// MASTER = 0x03, // Master mode
|
|
||||||
}RS_ModeTypeDef;
|
|
||||||
|
|
||||||
/* Enums for RS UART Modes */
|
|
||||||
typedef enum // RS_ITModeTypeDef
|
|
||||||
{
|
|
||||||
BLCK_MODE = 0x00, // Blocking mode
|
|
||||||
IT_MODE = 0x01, // Interrupt mode
|
|
||||||
}RS_ITModeTypeDef;
|
|
||||||
|
|
||||||
/* Enums for Abort modes */
|
|
||||||
typedef enum // RS_AbortTypeDef
|
|
||||||
{
|
|
||||||
ABORT_TX = 0x01, // Abort transmit
|
|
||||||
ABORT_RX = 0x02, // Abort receive
|
|
||||||
ABORT_RX_TX = 0x03, // Abort receive and transmit
|
|
||||||
ABORT_RS = 0x04, // Abort uart and reset RS structure
|
|
||||||
}RS_AbortTypeDef;
|
|
||||||
|
|
||||||
/* Enums for RX Size modes */
|
|
||||||
typedef enum // RS_RXSizeTypeDef
|
|
||||||
{
|
|
||||||
RS_RX_Size_Const = 0x01, // size of receiving message is constant
|
|
||||||
RS_RX_Size_NotConst = 0x02, // size of receiving message isnt constant
|
|
||||||
}RS_RXSizeTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
//-----------STRUCTURE FOR HANDLE RS------------
|
|
||||||
/**
|
|
||||||
* @brief Handle for RS communication.
|
|
||||||
* @note Prefixes: h - handle, s - settings, f - flag
|
|
||||||
*/
|
|
||||||
typedef struct // RS_HandleTypeDef
|
|
||||||
{
|
|
||||||
/* MESSAGE */
|
|
||||||
uint8_t ID; // ID of RS "channel"
|
|
||||||
RS_MsgTypeDef *pMessagePtr; // pointer to message struct
|
|
||||||
uint8_t *pBufferPtr; // pointer to message buffer
|
|
||||||
uint32_t RS_Message_Size; // size of whole message, not only data
|
|
||||||
|
|
||||||
/* HANDLERS and SETTINGS */
|
|
||||||
UART_HandleTypeDef *huart; // handler for used uart
|
|
||||||
TIM_HandleTypeDef *htim; // handler for used tim
|
|
||||||
RS_ModeTypeDef sRS_Mode; // setting: slave or master @ref RS_ModeTypeDef
|
|
||||||
RS_ITModeTypeDef sRS_IT_Mode; // setting: 1 - IT mode, 0 - Blocking mode
|
|
||||||
uint16_t sRS_Timeout; // setting: timeout in ms
|
|
||||||
RS_RXSizeTypeDef sRS_RX_Size_Mode; // setting: 1 - not const, 0 - const
|
|
||||||
|
|
||||||
/* FLAGS */
|
|
||||||
// These flags for controling receive/transmit
|
|
||||||
unsigned fRX_Half:1; // flag: 0 - receiving msg before ByteCnt, 0 - receiving msg after ByteCnt
|
|
||||||
|
|
||||||
unsigned fRS_Busy:1; // flag: 1 - RS is busy, 0 - RS isnt busy
|
|
||||||
unsigned fRX_Busy:1; // flag: 1 - receiving is active, 0 - receiving isnt active
|
|
||||||
unsigned fTX_Busy:1; // flag: 1 - transmiting is active, 0 - transmiting isnt active
|
|
||||||
|
|
||||||
unsigned fRX_Done:1; // flag: 1 - receiving is done, 0 - receiving isnt done
|
|
||||||
unsigned fTX_Done:1; // flag: 1 - transmiting is done, 0 - transmiting isnt done
|
|
||||||
|
|
||||||
// setted by user
|
|
||||||
unsigned fMessageHandled:1; // flag: 1 - RS command is handled, 0 - RS command isnt handled yet
|
|
||||||
unsigned fEchoResponse:1; // flag: 1 - response with received msg, 0 - response with own msg
|
|
||||||
unsigned fDeferredResponse:1; // flag: 1 - response not in interrupt, 0 - response in interrupt
|
|
||||||
unsigned fReInit_UART:1; // flag: 1 - need to reinitialize uart, 0 - nothing
|
|
||||||
|
|
||||||
/* RS STATUS */
|
|
||||||
RS_StatusTypeDef RS_STATUS; // RS status
|
|
||||||
}RS_HandleTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////---STRUCTURES & ENUMS---//////////////////////
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
//----------------FUNCTIONS FOR PROCESSING MESSAGE-------------------
|
|
||||||
/*--------------------Defined by users purposes--------------------*/
|
|
||||||
/**
|
|
||||||
* @brief Respond accord to received message.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о результате ответа на комманду.
|
|
||||||
* @note Обработка принятой комманды и ответ на неё.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Collect message in buffer to transmit it.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @param msg_uart_buff - указатель на буффер UART.
|
|
||||||
* @return RS_RES - статус о результате заполнения буфера.
|
|
||||||
* @note Заполнение буффера UART из структуры сообщения.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Parse message from buffer to process it.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @param msg_uart_buff - указатель на буффер UART.
|
|
||||||
* @return RS_RES - статус о результате заполнения структуры.
|
|
||||||
* @note Заполнение структуры сообщения из буффера UART.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef Parse_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg, uint8_t *msg_uart_buff);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Define size of RX Message that need to be received.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param rx_data_size - указатель на переменную для записи кол-ва байт для принятия.
|
|
||||||
* @return RS_RES - статус о корректности рассчета кол-ва байт для принятия.
|
|
||||||
* @note Определение сколько байтов надо принять по протоколу.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Define_Size_of_RX_Message(RS_HandleTypeDef *hRS, uint32_t *rx_data_size);
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------GENERAL FUNCTIONS-------------------------
|
|
||||||
/*-----------------Should be called from main code-----------------*/
|
|
||||||
/**
|
|
||||||
* @brief Start receive IT.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации приема.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Start transmit IT.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации передачи.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialize UART and handle RS stucture.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @param stim - указатель на структуру с настройками таймера.
|
|
||||||
* @param pRS_BufferPtr - указатель на буффер для приема-передачи по UART. Если он NULL, то поставиться библиотечный буфер.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_SettingsTypeDef *suart, TIM_SettingsTypeDef *stim, uint8_t *pRS_BufferPtr);
|
|
||||||
/**
|
|
||||||
* @brief ReInitialize UART and RS receive.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param suart - указатель на структуру с настройками UART.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации.
|
|
||||||
*/
|
|
||||||
HAL_StatusTypeDef RS_ReInit_UART(RS_HandleTypeDef *hRS, UART_SettingsTypeDef *suart);
|
|
||||||
/**
|
|
||||||
* @brief Abort RS/UART.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param AbortMode - выбор, что надо отменить.
|
|
||||||
- ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX,
|
|
||||||
- ABORT_RX: Отмена приема по ЮАРТ, с очищением флагов RX,
|
|
||||||
- ABORT_RX_TX: Отмена приема и передачи по ЮАРТ,
|
|
||||||
- ABORT_RS: Отмена приема-передачи RS, с очищением всей структуры.
|
|
||||||
* @return RS_RES - статус о состоянии RS после аборта.
|
|
||||||
* @note Отмена работы UART в целом или отмена приема/передачи RS.
|
|
||||||
Также очищается хендл hRS.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode);
|
|
||||||
//-------------------------GENERAL FUNCTIONS-------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
|
|
||||||
/**
|
|
||||||
* @brief Handle for starting receive.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации приема или окончания общения.
|
|
||||||
* @note Определяет начинать прием команды/ответа или нет.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg);
|
|
||||||
/**
|
|
||||||
* @brief Handle for starting transmit.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @param RS_msg - указатель на структуру сообщения.
|
|
||||||
* @return RS_RES - статус о состоянии RS после инициализации передачи.
|
|
||||||
* @note Определяет отвечать ли на команду или нет.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg);
|
|
||||||
/**
|
|
||||||
* @brief UART RX Callback: define behaviour after receiving parts of message.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @return RS_RES - статус о состоянии RS после обработки приема.
|
|
||||||
* @note Контролирует прием сообщения: определяет размер принимаемой посылки и обрабатывает его.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_UART_RxCpltCallback(RS_HandleTypeDef *hRS);
|
|
||||||
/**
|
|
||||||
* @brief UART TX Callback: define behaviour after transmiting message.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @return RS_RES - статус о состоянии RS после обработки приема.
|
|
||||||
* @note Определяет поведение RS после передачи сообщения.
|
|
||||||
*/
|
|
||||||
RS_StatusTypeDef RS_UART_TxCpltCallback(RS_HandleTypeDef *hRS);
|
|
||||||
/**
|
|
||||||
* @brief Handler for UART.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @note Обрабатывает ошибки если есть и вызывает RS Коллбеки.
|
|
||||||
* Добавить вызов этой функции в UARTx_IRQHandler().
|
|
||||||
*/
|
|
||||||
void RS_UART_Handler(RS_HandleTypeDef *hRS);
|
|
||||||
/**
|
|
||||||
* @brief Handler for TIM.
|
|
||||||
* @param hRS - указатель на хендлер RS.
|
|
||||||
* @note Попадание сюда = таймаут и перезапуск RS приема
|
|
||||||
* Добавить вызов этой функции в TIMx_IRQHandler().
|
|
||||||
*/
|
|
||||||
void RS_TIM_Handler(RS_HandleTypeDef *hRS);
|
|
||||||
//--------------------CALLBACK/HANDLER FUNCTIONS---------------------
|
|
||||||
///////////////////////////---FUNCTIONS---///////////////////////////
|
|
||||||
|
|
||||||
#endif // __RS_LIB_H_
|
|
||||||
@ -1,240 +0,0 @@
|
|||||||
#include "pwm.h"
|
|
||||||
|
|
||||||
|
|
||||||
TIM_SettingsTypeDef TIM_CTRL = {0};
|
|
||||||
|
|
||||||
// variables for filling arrays
|
|
||||||
int Numb_Of_Peroids = 2; // number of periods
|
|
||||||
int Samples_Per_Peroid = 0; // how many samples in one period
|
|
||||||
int Size_Of_Log = 0; // size of written data to log
|
|
||||||
int log_ind = 0; // index of log arrays
|
|
||||||
int cnt_to_cnt_log = 0; // counter for log_cnt
|
|
||||||
|
|
||||||
int sine_ind_prev = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Filling logs.
|
|
||||||
* @note Заполнение логов: синус, шим, пила.
|
|
||||||
* @note This called from TIM_CTRL_Handler
|
|
||||||
*/
|
|
||||||
void Fill_Logs_with_Data(void)
|
|
||||||
{
|
|
||||||
// calc pwm duty from timer
|
|
||||||
float PWM_Duty;
|
|
||||||
if(PWM_Get_Mode(&hpwm1, PWM_DC_MODE) == 0) // if sinus need to be written
|
|
||||||
{
|
|
||||||
if(PWM_Get_Mode(&hpwm1, PWM_CH_MODE)) // if its signed sine mode (two channels)
|
|
||||||
{
|
|
||||||
if(hpwm1.Duty_Table_Ind < hpwm1.Duty_Table_Size/2) // first half get from channel 1
|
|
||||||
PWM_Duty = (((float)PWM_Get_Compare1(&hpwm1))/(PWM_Get_Autoreload(&hpwm1)))+1;
|
|
||||||
else // second half get from channel 2
|
|
||||||
PWM_Duty = 1-(((float)PWM_Get_Compare2(&hpwm1))/(PWM_Get_Autoreload(&hpwm1)));
|
|
||||||
}
|
|
||||||
else // if its unsigned sine mode (single channel)
|
|
||||||
{ // just get current pwm duty
|
|
||||||
PWM_Duty = ((float)PWM_Get_Compare1(&hpwm1)/PWM_Get_Autoreload(&hpwm1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // if its dc pwm mode
|
|
||||||
{ // just get current pwm duty
|
|
||||||
if(PWM_Get_Mode(&hpwm1, PWM_CH_MODE)) // if its second channels mode
|
|
||||||
PWM_Duty = ((float)PWM_Get_Compare2(&hpwm1)/PWM_Get_Autoreload(&hpwm1));
|
|
||||||
else // if its first channel mode
|
|
||||||
PWM_Duty = ((float)PWM_Get_Compare1(&hpwm1)/PWM_Get_Autoreload(&hpwm1));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// WRITE SINUS TO WHOLE ARRAY
|
|
||||||
// sine_log[log_ind] = sin_val;
|
|
||||||
if(PWM_Get_Mode(&hpwm1,PWM_DC_MODE) == 0) // in table mode write PWM Duty (write sine) with scale 1/2 from sin table max value (0xFFFF/2)
|
|
||||||
sine_log[log_ind] = PWM_Duty*(0x8000-1);
|
|
||||||
else // in dc mode write PWM Duty (write sine)
|
|
||||||
sine_log[log_ind] = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// WRITE PWM
|
|
||||||
if(PWM_Get_Mode(&hpwm1,PWM_DC_MODE)) // in DC mode
|
|
||||||
{
|
|
||||||
// write 1 - if log_ind < Size_Of_Period*PWM_Dury
|
|
||||||
// write 0 - otherwise
|
|
||||||
pwm_log[log_ind] = (log_ind%(Size_Of_Log/Numb_Of_Peroids) < (Size_Of_Log/Numb_Of_Peroids+1)*hpwm1.PWM_Value/100)? 1: 0;
|
|
||||||
}
|
|
||||||
else // in table mode
|
|
||||||
{
|
|
||||||
// write fill whole pwm array at one interrupt
|
|
||||||
int PWM_Period_End_Ind = (Size_Of_Log/Numb_Of_Peroids);
|
|
||||||
int PWM_Step_End_Ind;
|
|
||||||
if(PWM_Get_Mode(&hpwm1,PWM_CH_MODE))
|
|
||||||
PWM_Step_End_Ind = PWM_Period_End_Ind*fabs(PWM_Duty-1);
|
|
||||||
else
|
|
||||||
PWM_Step_End_Ind = PWM_Period_End_Ind*PWM_Duty;
|
|
||||||
for(int i = 0; i <= PWM_Step_End_Ind; i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < Numb_Of_Peroids; j++)
|
|
||||||
pwm_log[i+j*PWM_Period_End_Ind] = 1;
|
|
||||||
}
|
|
||||||
for(int i = PWM_Step_End_Ind+1; i < PWM_Period_End_Ind; i++)
|
|
||||||
for (int j = 0; j < Numb_Of_Peroids; j++)
|
|
||||||
pwm_log[i+j*PWM_Period_End_Ind] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// WRITE COUNTER
|
|
||||||
cnt_log[log_ind] = cnt_to_cnt_log;
|
|
||||||
cnt_to_cnt_log++;
|
|
||||||
if(cnt_to_cnt_log>=Size_Of_Log/2)
|
|
||||||
cnt_to_cnt_log = 0;
|
|
||||||
|
|
||||||
// INCREMENT AND RESET COUNTER
|
|
||||||
log_ind++;
|
|
||||||
if(PWM_Get_Mode(&hpwm1,PWM_DC_MODE) == 0) // if its PWM table mode
|
|
||||||
{
|
|
||||||
// SYNCHRONIZE PERIOD OF SIN IN LOG
|
|
||||||
// (это надо, чтобы данные не съезжали из-за несинхронизированного периода)
|
|
||||||
|
|
||||||
// wait until period ended
|
|
||||||
if(log_ind>Size_Of_Log-1) // if logs are filled
|
|
||||||
{
|
|
||||||
if((unsigned)hpwm1.Duty_Table_Ind < sine_ind_prev) // and if new period started
|
|
||||||
{
|
|
||||||
log_ind = 0; // reset counter
|
|
||||||
sine_ind_prev = (unsigned)hpwm1.Duty_Table_Ind;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// update prev variable only if log currently writing
|
|
||||||
else
|
|
||||||
sine_ind_prev = (unsigned)hpwm1.Duty_Table_Ind;
|
|
||||||
}
|
|
||||||
else // if its PWM DC mode
|
|
||||||
{
|
|
||||||
// if logs are filled
|
|
||||||
if(log_ind>Size_Of_Log-1)
|
|
||||||
log_ind = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// if its overflow log array size - reset log_ind
|
|
||||||
if(log_ind>LOG_SIZE-1)
|
|
||||||
{
|
|
||||||
log_ind = 0;
|
|
||||||
sine_ind_prev = (unsigned)hpwm1.Duty_Table_Ind;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Update log parameters.
|
|
||||||
* @note Проверка надо ли обновлять параметры логов, и если надо - обновляет их.
|
|
||||||
* @note This called from TIM_CTRL_Handler
|
|
||||||
*/
|
|
||||||
void Update_Params_For_Log(void)
|
|
||||||
{
|
|
||||||
unsigned UpdateLog = 0;
|
|
||||||
|
|
||||||
// READ NUMB OF PERIOD IN LOGS
|
|
||||||
if(Numb_Of_Peroids != log_ctrl[R_LOG_CTRL_LOG_PWM_NUMB])
|
|
||||||
{
|
|
||||||
Numb_Of_Peroids = log_ctrl[R_LOG_CTRL_LOG_PWM_NUMB];
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
// READ SIZE OF LOGS
|
|
||||||
if(Size_Of_Log != log_ctrl[R_LOG_CTRL_LOG_SIZE])
|
|
||||||
{
|
|
||||||
Size_Of_Log = log_ctrl[R_LOG_CTRL_LOG_SIZE];
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// UPDATE LOG PARAMS
|
|
||||||
if(UpdateLog)
|
|
||||||
{
|
|
||||||
// set logs params
|
|
||||||
Set_Log_Params();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set up log parameters.
|
|
||||||
* @note Устанавливает настройки логов и проверяет их на корректность.
|
|
||||||
*/
|
|
||||||
void Set_Log_Params(void)
|
|
||||||
{
|
|
||||||
// SET LOG PARAMS
|
|
||||||
log_ind = 0;
|
|
||||||
Samples_Per_Peroid = TIM_CTRL.sTimFreqHz/hpwm1.PWM_Value;
|
|
||||||
|
|
||||||
if(Size_Of_Log > LOG_SIZE) // if its too much data in log
|
|
||||||
{
|
|
||||||
Numb_Of_Peroids = (LOG_SIZE/Samples_Per_Peroid);
|
|
||||||
log_ctrl[R_LOG_CTRL_LOG_SIZE] = Numb_Of_Peroids;
|
|
||||||
Size_Of_Log = Numb_Of_Peroids*Samples_Per_Peroid;
|
|
||||||
}
|
|
||||||
|
|
||||||
// clear logs arrays
|
|
||||||
for(int i = Size_Of_Log; i < LOG_SIZE; i++)
|
|
||||||
{
|
|
||||||
sine_log[i] = 0;
|
|
||||||
pwm_log[i] = 0;
|
|
||||||
cnt_log[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief reInitialization of control timer.
|
|
||||||
* @note Перенастраивает таймер согласно принятным настройкам в log_ctrl.
|
|
||||||
* @note This called from main while
|
|
||||||
*/
|
|
||||||
void Control_Timer_ReInit(TIM_SettingsTypeDef *stim)
|
|
||||||
{
|
|
||||||
TIM_Base_MspDeInit(&stim->htim);
|
|
||||||
hpwm1.stim.sTickBaseMHz = PROJSET.TIM_CTRL_TICKBASE;
|
|
||||||
TIM_Base_Init(stim);
|
|
||||||
|
|
||||||
HAL_TIM_Base_Start_IT(&stim->htim); // timer for sinus
|
|
||||||
HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 1, 1);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief First initialization of Control Timer.
|
|
||||||
* @note Первый управляющего таймера. Таймер записывает логи и обновляет параметры ШИМ.
|
|
||||||
* @note This called from main
|
|
||||||
*/
|
|
||||||
void Control_Timer_FirstInit(void)
|
|
||||||
{
|
|
||||||
//-------CONTROL TIMER INIT----------
|
|
||||||
// tim settings
|
|
||||||
TIM_CTRL.htim.Instance = TIM12;
|
|
||||||
TIM_CTRL.sTimMode = TIM_IT_MODE;
|
|
||||||
TIM_CTRL.sTickBaseMHz = PROJSET.TIM_CTRL_TICKBASE;
|
|
||||||
TIM_CTRL.sTimAHBFreqMHz = PROJSET.TIM_CTRL_AHB_FREQ;
|
|
||||||
TIM_CTRL.sTimFreqHz = HZ_TIMER_CTRL;
|
|
||||||
|
|
||||||
TIM_Base_Init(&TIM_CTRL);
|
|
||||||
HAL_NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 1, 1);
|
|
||||||
|
|
||||||
HAL_TIM_Base_Start_IT(&TIM_CTRL.htim); // timer for sinus
|
|
||||||
|
|
||||||
|
|
||||||
// FILL TIME ARRAY WITH TIME
|
|
||||||
for(int i = 0; i <= R_TIME_LOG_QNT; i++)
|
|
||||||
time_log[i] = i;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//------------------------HANDLERS FUNCTIONS-------------------------
|
|
||||||
//-------------CONTROL TIMER---------------
|
|
||||||
void TIM8_BRK_TIM12_IRQHandler(void)
|
|
||||||
{
|
|
||||||
Trace_CTRL_TIM_Enter();
|
|
||||||
HAL_TIM_IRQHandler(&TIM_CTRL.htim);
|
|
||||||
|
|
||||||
Fill_Logs_with_Data();
|
|
||||||
Update_Params_For_Log();
|
|
||||||
Update_Params_For_PWM(&hpwm1);
|
|
||||||
|
|
||||||
WriteSettingsToMem();
|
|
||||||
|
|
||||||
Trace_CTRL_TIM_Exit();
|
|
||||||
}
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
#ifndef __CONTROL_H_
|
|
||||||
#define __CONTROL_H_
|
|
||||||
|
|
||||||
#include "periph_general.h"
|
|
||||||
#include "modbus.h"
|
|
||||||
#include "math.h"
|
|
||||||
#include "settings.h"
|
|
||||||
|
|
||||||
#define M_PI 3.14159265358979323846 /* pi */
|
|
||||||
|
|
||||||
extern TIM_SettingsTypeDef TIM_CTRL;
|
|
||||||
|
|
||||||
//---------------------this called from TIM_CTRL_Handler()-----------------------
|
|
||||||
/**
|
|
||||||
* @brief Update log parameters.
|
|
||||||
* @note Проверка надо ли обновлять параметры логов, и если надо - обновляет их.
|
|
||||||
* @note This called from TIM_CTRL_Handler
|
|
||||||
*/
|
|
||||||
void Update_Params_For_Log(void);
|
|
||||||
/**
|
|
||||||
* @brief Filling logs.
|
|
||||||
* @note заполнение логов: синус, шим, пила.
|
|
||||||
* @note this called from TIM_CTRL_Handler
|
|
||||||
*/
|
|
||||||
void Fill_Logs_with_Data(void);
|
|
||||||
/**
|
|
||||||
* @brief Set up log parameters.
|
|
||||||
* @note Устанавливает настройки логов и проверяет их на корректность.
|
|
||||||
*/
|
|
||||||
void Set_Log_Params(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief First initialization of Control Timer.
|
|
||||||
* @note Первый управляющего таймера. Таймер записывает логи и обновляет параметры ШИМ.
|
|
||||||
* @note This called from main
|
|
||||||
*/
|
|
||||||
void Control_Timer_FirstInit(void);
|
|
||||||
|
|
||||||
// this called from main while(1)
|
|
||||||
/**
|
|
||||||
* @brief reInitialization of control timer.
|
|
||||||
* @param stim - указатель на настройки таймера.
|
|
||||||
* @note Перенастраивает таймер согласно принятным настройкам в log_ctrl.
|
|
||||||
* @note This called from main while
|
|
||||||
*/
|
|
||||||
void Control_Timer_ReInit(TIM_SettingsTypeDef *stim);
|
|
||||||
|
|
||||||
#endif // __CONTROL_H_
|
|
||||||
@ -1,855 +0,0 @@
|
|||||||
#include "pwm.h"
|
|
||||||
//#include "rng.h"
|
|
||||||
|
|
||||||
PWM_HandleTypeDef hpwm1;
|
|
||||||
PWM_SlaveHandleTypeDef hpwm2;
|
|
||||||
PWM_SlaveHandleTypeDef hpwm3;
|
|
||||||
|
|
||||||
uint32_t sin_table[SIN_TABLE_SIZE_MAX];
|
|
||||||
unsigned ActiveChannelSHDW_Master;
|
|
||||||
float DeadTimeCnt_Master;
|
|
||||||
|
|
||||||
unsigned ActiveChannelSHDW_Slave2;
|
|
||||||
float DeadTimeCnt_Slave2;
|
|
||||||
|
|
||||||
unsigned ActiveChannelSHDW_Slave3;
|
|
||||||
float DeadTimeCnt_Slave3;
|
|
||||||
/**
|
|
||||||
* @brief First set up of PWM.
|
|
||||||
* @note Первый инит ШИМ. Заполняет структуры и инициализирует таймер для генерации синуоидального ШИМ.
|
|
||||||
* Скважность ШИМ меняется по закону синусоиды, каждый канал генерирует свой полупериод синуса (от -1 до 0 И от 0 до 1)
|
|
||||||
* ШИМ генерируется на одном канале.
|
|
||||||
* @note This called from main
|
|
||||||
*/
|
|
||||||
void PWM_Sine_FirstInit(void)
|
|
||||||
{
|
|
||||||
hpwm1.pDuty_Table_Origin = SIN_TABLE_ORIGIN;
|
|
||||||
|
|
||||||
//---------PWM TIMER1 INIT------------
|
|
||||||
// channels settings
|
|
||||||
hpwm1.sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
|
||||||
hpwm1.sConfigOC.Pulse = 0;
|
|
||||||
hpwm1.sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
|
||||||
hpwm1.sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
|
||||||
|
|
||||||
// tim1 settings
|
|
||||||
hpwm1.stim.htim.Instance = TIMER_PWM1_INSTANCE;
|
|
||||||
hpwm1.stim.sTimMode = TIM_IT_MODE;
|
|
||||||
hpwm1.stim.sTimFreqHz = HZ_TIMER_PWM;
|
|
||||||
hpwm1.stim.sTickBaseMHz = PROJSET.TIM_PWM_TICKBASE;
|
|
||||||
hpwm1.stim.sTimAHBFreqMHz = PROJSET.TIM_PWM_AHB_FREQ;
|
|
||||||
hpwm1.GPIOx = TIMER_PWM1_GPIOx;
|
|
||||||
hpwm1.GPIO_PIN_X1 = PROJSET.TIM_PWM1_GPIO_PIN_X1;
|
|
||||||
hpwm1.GPIO_PIN_X2 = PROJSET.TIM_PWM1_GPIO_PIN_X2;
|
|
||||||
hpwm1.PWM_Channel1 = PROJSET.TIM_PWM1_TIM_CHANNEL1;
|
|
||||||
hpwm1.PWM_Channel2 = PROJSET.TIM_PWM1_TIM_CHANNEL2;
|
|
||||||
hpwm1.hpwm2 = (void *)&hpwm2;
|
|
||||||
hpwm1.hpwm3 = (void *)&hpwm3;
|
|
||||||
|
|
||||||
TIM_Base_Init(&hpwm1.stim);
|
|
||||||
TIM_Output_PWM_Init(&hpwm1.stim.htim, &hpwm1.sConfigOC, hpwm1.PWM_Channel1, hpwm1.GPIOx, hpwm1.GPIO_PIN_X1);
|
|
||||||
TIM_Output_PWM_Init(&hpwm1.stim.htim, &hpwm1.sConfigOC, hpwm1.PWM_Channel2, hpwm1.GPIOx, hpwm1.GPIO_PIN_X2);
|
|
||||||
|
|
||||||
|
|
||||||
// PWM SLAVES INIT
|
|
||||||
hpwm2.hMasterPWM = &hpwm1;
|
|
||||||
hpwm2.stim = hpwm1.stim;
|
|
||||||
hpwm2.stim.htim.Instance = (TIM_TypeDef *)PROJSET.TIM_PWM2_INSTANCE;
|
|
||||||
hpwm2.GPIOx = (GPIO_TypeDef *)PROJSET.TIM_PWM2_GPIOx;
|
|
||||||
hpwm2.GPIO_PIN_X1 = PROJSET.TIM_PWM2_GPIO_PIN_X1;
|
|
||||||
hpwm2.GPIO_PIN_X2 = PROJSET.TIM_PWM2_GPIO_PIN_X2;
|
|
||||||
hpwm2.PWM_Channel1 = PROJSET.TIM_PWM2_TIM_CHANNEL1;
|
|
||||||
hpwm2.PWM_Channel2 = PROJSET.TIM_PWM2_TIM_CHANNEL2;
|
|
||||||
hpwm2.Duty_Shift_Ratio = (float)2/3;
|
|
||||||
|
|
||||||
hpwm3.hMasterPWM = &hpwm1;
|
|
||||||
hpwm3.stim = hpwm1.stim;
|
|
||||||
hpwm3.stim.htim.Instance = (TIM_TypeDef *)PROJSET.TIM_PWM3_INSTANCE;
|
|
||||||
hpwm3.GPIOx = (GPIO_TypeDef *)PROJSET.TIM_PWM3_GPIOx;
|
|
||||||
hpwm3.GPIO_PIN_X1 = PROJSET.TIM_PWM3_GPIO_PIN_X1;
|
|
||||||
hpwm3.GPIO_PIN_X2 = PROJSET.TIM_PWM3_GPIO_PIN_X2;
|
|
||||||
hpwm3.PWM_Channel1 = PROJSET.TIM_PWM3_TIM_CHANNEL1;
|
|
||||||
hpwm3.PWM_Channel2 = PROJSET.TIM_PWM3_TIM_CHANNEL2;
|
|
||||||
hpwm3.Duty_Shift_Ratio = (float)-2/3;
|
|
||||||
|
|
||||||
PWM_SlavePhase_Init(&hpwm2);
|
|
||||||
PWM_SlavePhase_Init(&hpwm3);
|
|
||||||
|
|
||||||
//----------TIMERS START-------------
|
|
||||||
HAL_TIM_Base_Start_IT(&hpwm1.stim.htim); // timer for PWM
|
|
||||||
HAL_TIM_PWM_Start(&hpwm1.stim.htim, hpwm1.PWM_Channel1); // PWM channel 1
|
|
||||||
HAL_TIM_PWM_Start(&hpwm1.stim.htim, hpwm1.PWM_Channel2); // PWM channel 2
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief PWM Handler.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @note Управляет скважностью ШИМ.
|
|
||||||
* @note This called from TIM_PWM_Handler
|
|
||||||
*/
|
|
||||||
void PWM_Handler(PWM_HandleTypeDef *hpwm)
|
|
||||||
{
|
|
||||||
//------------SINUS MODE-------------
|
|
||||||
if(PWM_Get_Mode(&hpwm1,PWM_DC_MODE) == 0)
|
|
||||||
{
|
|
||||||
if(hpwm->PWM_Value != 0) // if there some frequency
|
|
||||||
{
|
|
||||||
unsigned sin_ind = PWM_Get_Duty_Table_Ind(hpwm, hpwm->stim.sTimFreqHz);
|
|
||||||
// overflow check
|
|
||||||
if(sin_ind >= hpwm->Duty_Table_Size)
|
|
||||||
sin_ind -= hpwm->Duty_Table_Size;
|
|
||||||
if(sin_ind >= hpwm->Duty_Table_Size) // if its still overflow reset it
|
|
||||||
sin_ind = 0;
|
|
||||||
|
|
||||||
// if unsigned sine enabled
|
|
||||||
if(PWM_Get_Mode(hpwm, PWM_CH_MODE) == 0)
|
|
||||||
{
|
|
||||||
// set pwm duty
|
|
||||||
PWM_Set_Duty_From_Table(hpwm, sin_ind); // set first channel
|
|
||||||
PWM_SlavePhase_Set_DutyTable_Unsigned(PWM_Set_pSlaveHandle(hpwm,hpwm2), sin_ind);
|
|
||||||
PWM_SlavePhase_Set_DutyTable_Unsigned(PWM_Set_pSlaveHandle(hpwm,hpwm3), sin_ind);
|
|
||||||
}
|
|
||||||
// if signed sine enabled
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int Duty = PWM_Get_Table_Element_Signed(hpwm, sin_ind);
|
|
||||||
|
|
||||||
if(Duty >= 0)
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hpwm, Duty); // set first channel
|
|
||||||
PWM_Set_Compare2(hpwm, 0); // reset second channel
|
|
||||||
}
|
|
||||||
else // если это вторая полуволна
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hpwm, 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(hpwm, -Duty); // set second channel
|
|
||||||
}
|
|
||||||
|
|
||||||
PWM_SlavePhase_Set_DutyTable_Signed(PWM_Set_pSlaveHandle(hpwm,hpwm2), sin_ind);
|
|
||||||
PWM_SlavePhase_Set_DutyTable_Signed(PWM_Set_pSlaveHandle(hpwm,hpwm3), sin_ind);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // if freq = 0 reset all channels
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hpwm, 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(hpwm, 0); // reset second channel
|
|
||||||
PWM_Set_Compare1(PWM_Set_pSlaveHandle(hpwm,hpwm2), 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(PWM_Set_pSlaveHandle(hpwm,hpwm2), 0); // reset second channel
|
|
||||||
PWM_Set_Compare1(PWM_Set_pSlaveHandle(hpwm,hpwm3), 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(PWM_Set_pSlaveHandle(hpwm,hpwm3), 0); // reset second channel
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
//-----------PWM DC MODE-------------
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(PWM_Set_pSlaveHandle(hpwm,hpwm2), 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(PWM_Set_pSlaveHandle(hpwm,hpwm2), 0); // reset second channel
|
|
||||||
PWM_Set_Compare1(PWM_Set_pSlaveHandle(hpwm,hpwm3), 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(PWM_Set_pSlaveHandle(hpwm,hpwm3), 0); // reset second channel
|
|
||||||
// uint32_t pwm_rng = 0;
|
|
||||||
// HAL_RNG_GenerateRandomNumber(&hrng, &pwm_rng);
|
|
||||||
// pwm_rng = ((pwm_rng&0xFFFF)/(0xFFFF/PWM_Get_Autoreload(hpwm)))/((float)100/hpwm->PWM_Value);
|
|
||||||
// if (pwm_rng < PWM_Calc_Min_Duty(hpwm))
|
|
||||||
// pwm_rng = PWM_Calc_Min_Duty(hpwm);
|
|
||||||
// if second channel enabled
|
|
||||||
if(PWM_Get_Mode(hpwm, PWM_CH_MODE))
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hpwm, 0); // reset first channel
|
|
||||||
PWM_Set_Duty_From_Percent(hpwm, hpwm->PWM_Channel2); // set second channel
|
|
||||||
// __HAL_TIM_SET_COMPARE(&(hpwm->stim.htim), TIM_CHANNEL_2, pwm_rng); // set second channel
|
|
||||||
}
|
|
||||||
// if first channel enabled
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// __HAL_TIM_SET_COMPARE(&(hpwm->stim.htim), TIM_CHANNEL_1, pwm_rng); // set second channel
|
|
||||||
PWM_Set_Duty_From_Percent(hpwm, hpwm->PWM_Channel1); // set first channel
|
|
||||||
PWM_Set_Compare2(hpwm, 0); // reset second channel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----CHECK CHANNELS FOR ERRORS-----
|
|
||||||
uint16_t min_duty = PWM_Calc_Min_Duty(hpwm);
|
|
||||||
// IF FIRST CHANNEL IS ACRIVE
|
|
||||||
if(PWM_Get_Compare1(hpwm) != 0)
|
|
||||||
{
|
|
||||||
// Duty shoud be bigger or equeal than min duration
|
|
||||||
if (PWM_Get_Compare1(hpwm)<min_duty)
|
|
||||||
PWM_Set_Compare1(hpwm, min_duty);
|
|
||||||
// Duty shoud be less or equeal than ARR-min duration
|
|
||||||
if (PWM_Get_Compare1(hpwm)>PWM_Get_Autoreload(hpwm)-min_duty)
|
|
||||||
PWM_Set_Compare1(hpwm, PWM_Get_Autoreload(hpwm)-min_duty);
|
|
||||||
}
|
|
||||||
// IF SECOND CHANNEL IS ACRIVE
|
|
||||||
else if(PWM_Get_Compare2(hpwm) != 0)
|
|
||||||
{
|
|
||||||
// Duty shoud be bigger or equeal than min duration
|
|
||||||
if (PWM_Get_Compare2(hpwm)<min_duty)
|
|
||||||
PWM_Set_Compare2(hpwm, min_duty);
|
|
||||||
// Duty shoud be less or equeal than ARR
|
|
||||||
if (PWM_Get_Compare2(hpwm)>PWM_Get_Autoreload(hpwm)-min_duty)
|
|
||||||
PWM_Set_Compare2(hpwm, PWM_Get_Autoreload(hpwm)-min_duty);
|
|
||||||
}
|
|
||||||
// IF BOTH CHANNEL IS ACRIVE
|
|
||||||
if((PWM_Get_Compare1(hpwm) != 0) && (PWM_Get_Compare2(hpwm) != 0))
|
|
||||||
{
|
|
||||||
// Only one channel shoud be active so disable all
|
|
||||||
PWM_Set_Compare1(hpwm, 0);
|
|
||||||
PWM_Set_Compare2(hpwm, 0);
|
|
||||||
}
|
|
||||||
PWM_SlavePhase_Check_Channels(PWM_Set_pSlaveHandle(hpwm,hpwm2));
|
|
||||||
PWM_SlavePhase_Check_Channels(PWM_Set_pSlaveHandle(hpwm,hpwm3));
|
|
||||||
|
|
||||||
if(hpwm->PWM_DeadTime)
|
|
||||||
{
|
|
||||||
PWM_CreateDeadTime(hpwm, &DeadTimeCnt_Master, &ActiveChannelSHDW_Master);
|
|
||||||
PWM_SlavePhase_CreateDeadTime(PWM_Set_pSlaveHandle(hpwm,hpwm2), &DeadTimeCnt_Slave2, &ActiveChannelSHDW_Slave2);
|
|
||||||
PWM_SlavePhase_CreateDeadTime(PWM_Set_pSlaveHandle(hpwm,hpwm3), &DeadTimeCnt_Slave3, &ActiveChannelSHDW_Slave3);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Update PWM parameters.
|
|
||||||
* @note Проверка надо ли обновлять параметры ШИМ, и если надо - обновляет их.
|
|
||||||
* @note This called from TIM_CTRL_Handler
|
|
||||||
*/
|
|
||||||
void Update_Params_For_PWM(PWM_HandleTypeDef *hpwm)
|
|
||||||
{
|
|
||||||
unsigned UpdateModeParams = 0;
|
|
||||||
unsigned UpdateLog = 0;
|
|
||||||
|
|
||||||
// READ PWM_DC_MODE
|
|
||||||
if(PWM_Get_Mode(hpwm, PWM_DC_MODE) != (MB_Read_Coil_Local(&coils_regs[0], COIL_PWM_DC_MODE) << PWM_DC_MODE_Pos))
|
|
||||||
{
|
|
||||||
if(MB_Read_Coil_Local(&coils_regs[0], COIL_PWM_DC_MODE))
|
|
||||||
{
|
|
||||||
hpwm->sPWM_Mode |= PWM_DC_MODE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hpwm->sPWM_Mode &= ~PWM_DC_MODE;
|
|
||||||
}
|
|
||||||
// update mode params
|
|
||||||
UpdateModeParams = 1;
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// READ PWM_CH_MODE
|
|
||||||
if(PWM_Get_Mode(hpwm, PWM_CH_MODE) != (MB_Read_Coil_Local(&coils_regs[0], COIL_PWM_CH_MODE) << PWM_CH_MODE_Pos))
|
|
||||||
{
|
|
||||||
if(MB_Read_Coil_Local(&coils_regs[0], COIL_PWM_CH_MODE))
|
|
||||||
{
|
|
||||||
hpwm->sPWM_Mode |= PWM_CH_MODE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hpwm->sPWM_Mode &= ~PWM_CH_MODE;
|
|
||||||
}
|
|
||||||
// update mode params
|
|
||||||
UpdateModeParams = 1;
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// READ PWM_CH_MODE
|
|
||||||
if(PWM_Get_Mode(hpwm, PWM_PHASE_MODE) != (MB_Read_Coil_Local(&coils_regs[0], COIL_PWM_PHASE_MODE) << PWM_PHASE_MODE_Pos))
|
|
||||||
{
|
|
||||||
if(MB_Read_Coil_Local(&coils_regs[0], COIL_PWM_PHASE_MODE))
|
|
||||||
{
|
|
||||||
hpwm->sPWM_Mode |= PWM_PHASE_MODE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hpwm->sPWM_Mode &= ~PWM_PHASE_MODE;
|
|
||||||
}
|
|
||||||
// update mode params
|
|
||||||
UpdateModeParams = 1;
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// READ PWM_VALUE
|
|
||||||
if(hpwm->PWM_Value != int_to_percent(pwm_ctrl[R_PWM_CTRL_PWM_VALUE]))
|
|
||||||
{
|
|
||||||
hpwm->PWM_Value = int_to_percent(pwm_ctrl[R_PWM_CTRL_PWM_VALUE]);
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// READ TABLE_SIZE
|
|
||||||
if(hpwm->Duty_Table_Size != pwm_ctrl[R_PWM_CTRL_SIN_TABLE_SIZE])
|
|
||||||
{
|
|
||||||
hpwm->Duty_Table_Size = PWM_Fill_Sine_Table(&hpwm1, pwm_ctrl[R_PWM_CTRL_SIN_TABLE_SIZE]);
|
|
||||||
pwm_ctrl[R_PWM_CTRL_SIN_TABLE_SIZE] = hpwm->Duty_Table_Size;
|
|
||||||
}
|
|
||||||
|
|
||||||
// READ MIN PULSE DURATION
|
|
||||||
if(hpwm->PWM_MinPulseDur != pwm_ctrl[R_PWM_CTRL_MIN_PULSE_DUR])
|
|
||||||
{
|
|
||||||
hpwm->PWM_MinPulseDur = pwm_ctrl[R_PWM_CTRL_MIN_PULSE_DUR];
|
|
||||||
// update mode params
|
|
||||||
UpdateModeParams = 1;
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// READ DEAD TIME
|
|
||||||
if(hpwm->PWM_DeadTime != pwm_ctrl[R_PWM_CTRL_DEAD_TIME])
|
|
||||||
{
|
|
||||||
hpwm->PWM_DeadTime = pwm_ctrl[R_PWM_CTRL_DEAD_TIME];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// UPDATE PWM PARAMS
|
|
||||||
if(UpdateModeParams)
|
|
||||||
{
|
|
||||||
// UPDATE DUTY TABLE SCALE
|
|
||||||
PWM_Update_DutyTableScale(hpwm);
|
|
||||||
|
|
||||||
|
|
||||||
// update logs params
|
|
||||||
UpdateLog = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// UPDATE LOG PARAMS
|
|
||||||
if(UpdateLog)
|
|
||||||
{
|
|
||||||
// set logs params
|
|
||||||
Set_Log_Params();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief reInitialization of PWM TIM.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @note Перенастраивает таймер согласно принятным настройкам в pwm_ctrl
|
|
||||||
* ШИМ генерируется на одном канале.
|
|
||||||
*/
|
|
||||||
void PWM_Sine_ReInit(PWM_HandleTypeDef *hpwm)
|
|
||||||
{
|
|
||||||
Trace_PWM_reInit_Enter();
|
|
||||||
TIM_Base_MspDeInit(&hpwm->stim.htim);
|
|
||||||
hpwm1.stim.sTickBaseMHz = TIMER_PWM_TICKBASE;
|
|
||||||
TIM_Base_Init(&hpwm->stim);
|
|
||||||
TIM_Output_PWM_Init(&hpwm->stim.htim, &hpwm->sConfigOC, hpwm->PWM_Channel1, hpwm->GPIOx, hpwm->GPIO_PIN_X1);
|
|
||||||
TIM_Output_PWM_Init(&hpwm->stim.htim, &hpwm->sConfigOC, hpwm->PWM_Channel2, hpwm->GPIOx, hpwm->GPIO_PIN_X2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PWM_Update_DutyTableScale(hpwm);
|
|
||||||
|
|
||||||
|
|
||||||
//----------TIMERS START-------------
|
|
||||||
HAL_TIM_Base_Start_IT(&hpwm1.stim.htim); // timer for PWM
|
|
||||||
HAL_TIM_PWM_Start(&hpwm1.stim.htim, hpwm->PWM_Channel1); // PWM channel 1
|
|
||||||
HAL_TIM_PWM_Start(&hpwm1.stim.htim, hpwm->PWM_Channel2); // PWM channel 2
|
|
||||||
|
|
||||||
Trace_PWM_reInit_Exit();
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief Getting ind for Duty Table.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @param FreqTIM - частота таймера ШИМ.
|
|
||||||
* @note Рассчитывает индекс для таблицы скважностей.
|
|
||||||
* PWM_Value в hpwm - частота с которой эта таблица должна выводиться на ШИМ
|
|
||||||
* @note This called from TIM_PWM_Handler
|
|
||||||
*/
|
|
||||||
uint32_t PWM_Get_Duty_Table_Ind(PWM_HandleTypeDef *hpwm, float FreqTIM)
|
|
||||||
{
|
|
||||||
float sine_ind_step;
|
|
||||||
uint32_t sine_ind;
|
|
||||||
// calc ind for sin table
|
|
||||||
sine_ind_step = hpwm->Duty_Table_Size/(FreqTIM/hpwm->PWM_Value);
|
|
||||||
hpwm->Duty_Table_Ind += sine_ind_step;
|
|
||||||
if(hpwm->Duty_Table_Ind >= hpwm->Duty_Table_Size)
|
|
||||||
hpwm->Duty_Table_Ind -= hpwm->Duty_Table_Size;
|
|
||||||
|
|
||||||
// if its too big (e.g. inf)
|
|
||||||
if(hpwm->Duty_Table_Ind >= 0xFFFF)
|
|
||||||
hpwm->Duty_Table_Ind = 0;
|
|
||||||
|
|
||||||
return hpwm->Duty_Table_Ind;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create Dead Time when switches channels.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
*/
|
|
||||||
void PWM_CreateDeadTime(PWM_HandleTypeDef *hpwm, float *LocalDeadTimeCnt, unsigned *LocalActiveChannel)
|
|
||||||
{
|
|
||||||
// get current active channel
|
|
||||||
hpwm->fActiveChannel = (PWM_Get_Compare2(hpwm) != 0); // if channel two is active - write 1, otherwise - 0
|
|
||||||
// when channels are swithed and no dead time currently active
|
|
||||||
if(*LocalActiveChannel != hpwm->fActiveChannel)
|
|
||||||
{ // update active channel
|
|
||||||
*LocalActiveChannel = hpwm->fActiveChannel;
|
|
||||||
// set deadtime
|
|
||||||
*LocalDeadTimeCnt = hpwm->PWM_DeadTime;
|
|
||||||
Trace_PWM_DeadTime_Enter();
|
|
||||||
}
|
|
||||||
// decrement dead time
|
|
||||||
*LocalDeadTimeCnt -= (PWM_Get_Autoreload(hpwm)+1)*hpwm->stim.sTickBaseMHz;
|
|
||||||
if(*LocalDeadTimeCnt > 0) // if dead time is still active
|
|
||||||
{ // reset all channels
|
|
||||||
// reset channels
|
|
||||||
PWM_Set_Compare1(hpwm, 0);
|
|
||||||
PWM_Set_Compare2(hpwm, 0);
|
|
||||||
}
|
|
||||||
else // if dead time is done
|
|
||||||
{ // set it to zero
|
|
||||||
*LocalDeadTimeCnt = 0;
|
|
||||||
Trace_PWM_DeadTime_Exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Filling table with one period of sinus values.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @param table_size - размер таблицы.
|
|
||||||
* @note Формирует таблицу синусов размером table_size.
|
|
||||||
*/
|
|
||||||
uint32_t PWM_Fill_Sine_Table(PWM_HandleTypeDef *hpwm, uint32_t table_size)
|
|
||||||
{
|
|
||||||
if((hpwm == NULL) || (hpwm->pDuty_Table_Origin == NULL) || (table_size == 0))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (table_size > SIN_TABLE_SIZE_MAX)
|
|
||||||
table_size = SIN_TABLE_SIZE_MAX;
|
|
||||||
|
|
||||||
|
|
||||||
hpwm->Duty_Table_Size = table_size;
|
|
||||||
float pi_step = 2*M_PI/(hpwm->Duty_Table_Size);
|
|
||||||
float pi_val = 0;
|
|
||||||
float sin_koef = 0;
|
|
||||||
uint32_t sin_val = 0;
|
|
||||||
|
|
||||||
// fill table with sinus
|
|
||||||
for(int i = 0; i < hpwm->Duty_Table_Size; i++)
|
|
||||||
{
|
|
||||||
// rotate pi
|
|
||||||
pi_val += pi_step;
|
|
||||||
// calc sin value
|
|
||||||
sin_koef = (float)0xFFFF;
|
|
||||||
sin_val = (sin(pi_val)+1)*sin_koef/2;
|
|
||||||
sin_table[i] = sin_val;
|
|
||||||
}
|
|
||||||
// fill rest of table with zeros
|
|
||||||
for(int i = hpwm->Duty_Table_Size; i < SIN_TABLE_SIZE_MAX; i++)
|
|
||||||
sin_table[i] = 0;
|
|
||||||
|
|
||||||
// if second channel is enabled
|
|
||||||
PWM_Update_DutyTableScale(hpwm);
|
|
||||||
|
|
||||||
return hpwm->Duty_Table_Size;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Calc and update new Duty Table Scale.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @note Используется, когда изменяется значение регистра ARR.
|
|
||||||
*/
|
|
||||||
void PWM_Update_DutyTableScale(PWM_HandleTypeDef *hpwm)
|
|
||||||
{
|
|
||||||
// UPDATE DUTY TABLE SCALE
|
|
||||||
if(PWM_Get_Mode(hpwm, PWM_CH_MODE)) // if second channel is enabled
|
|
||||||
{
|
|
||||||
hpwm->Duty_Table_Scale = PWM_Calc_Duty_Scale(&hpwm1, 0x8000);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hpwm->Duty_Table_Scale = PWM_Calc_Duty_Scale(&hpwm1, 0xFFFF);
|
|
||||||
}
|
|
||||||
// for case if min pulse dur is too big and scale is negative
|
|
||||||
if (hpwm->Duty_Table_Scale < 0)
|
|
||||||
hpwm->Duty_Table_Scale = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//-----------------------THREEPHASE FUNCTIONS------------------------
|
|
||||||
/**
|
|
||||||
* @brief Initialization of Slave PWM TIM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @note Вызывает функции инициализации и включения слейв ШИМ.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Init(PWM_SlaveHandleTypeDef *hspwm)
|
|
||||||
{
|
|
||||||
TIM_Base_Init(&hspwm->stim);
|
|
||||||
TIM_Output_PWM_Init(&hspwm->stim.htim, &hspwm->hMasterPWM->sConfigOC, hspwm->PWM_Channel1, hspwm->GPIOx, hspwm->GPIO_PIN_X1);
|
|
||||||
TIM_Output_PWM_Init(&hspwm->stim.htim, &hspwm->hMasterPWM->sConfigOC, hspwm->PWM_Channel2, hspwm->GPIOx, hspwm->GPIO_PIN_X2);
|
|
||||||
|
|
||||||
// if three phase enables
|
|
||||||
//----------TIMERS START-------------
|
|
||||||
HAL_TIM_Base_Start(&hspwm->stim.htim);
|
|
||||||
HAL_TIM_PWM_Start(&hspwm->stim.htim, hspwm->PWM_Channel1); // PWM channel 1
|
|
||||||
HAL_TIM_PWM_Start(&hspwm->stim.htim, hspwm->PWM_Channel2); // PWM channel 2
|
|
||||||
|
|
||||||
if(PWM_Get_Mode(hspwm->hMasterPWM, PWM_PHASE_MODE) == 0) // if three phase disabled
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hspwm, 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(hspwm, 0); // reset second channel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief reInitialization of Slave PWM TIM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @note Перенастраивает таймер согласно принятным настройкам в pwm_ctrl.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_reInit(PWM_SlaveHandleTypeDef *hspwm)
|
|
||||||
{
|
|
||||||
PWM_Slave_CopyTimSetting(hspwm, sTimFreqHz);
|
|
||||||
TIM_Base_MspDeInit(&hspwm->stim.htim);
|
|
||||||
|
|
||||||
PWM_SlavePhase_Init(hspwm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set Duty from table on Slave PWM at one channel by sin_ind of the Master PWM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
|
||||||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Set_DutyTable_Unsigned(PWM_SlaveHandleTypeDef *hspwm, uint16_t sin_ind)
|
|
||||||
{
|
|
||||||
// if three phase enables
|
|
||||||
if (PWM_Get_Mode(hspwm->hMasterPWM, PWM_PHASE_MODE))
|
|
||||||
{
|
|
||||||
if(hspwm->Duty_Shift_Ratio > 0)
|
|
||||||
sin_ind += hspwm->hMasterPWM->Duty_Table_Size*hspwm->Duty_Shift_Ratio;
|
|
||||||
else
|
|
||||||
sin_ind += hspwm->hMasterPWM->Duty_Table_Size*(1+hspwm->Duty_Shift_Ratio);
|
|
||||||
|
|
||||||
// overflow check
|
|
||||||
if(sin_ind > hspwm->hMasterPWM->Duty_Table_Size)
|
|
||||||
sin_ind -= hspwm->hMasterPWM->Duty_Table_Size;
|
|
||||||
|
|
||||||
PWM_Set_SlaveDuty_From_Table(hspwm, sin_ind); // set first channel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set Duty from table on Slave PWM at two channel by sin_ind of the Master PWM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
|
||||||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Set_DutyTable_Signed(PWM_SlaveHandleTypeDef *hspwm, uint16_t sin_ind)
|
|
||||||
{
|
|
||||||
int Duty;
|
|
||||||
// if three phase enables
|
|
||||||
if (PWM_Get_Mode(hspwm->hMasterPWM, PWM_PHASE_MODE))
|
|
||||||
{
|
|
||||||
if(hspwm->Duty_Shift_Ratio > 0)
|
|
||||||
sin_ind += hspwm->hMasterPWM->Duty_Table_Size*hspwm->Duty_Shift_Ratio;
|
|
||||||
else
|
|
||||||
sin_ind += hspwm->hMasterPWM->Duty_Table_Size*(1+hspwm->Duty_Shift_Ratio);
|
|
||||||
|
|
||||||
// overflow check
|
|
||||||
if(sin_ind >= hspwm->hMasterPWM->Duty_Table_Size)
|
|
||||||
sin_ind -= hspwm->hMasterPWM->Duty_Table_Size;
|
|
||||||
|
|
||||||
Duty = PWM_Get_Table_Element_Signed(hspwm->hMasterPWM, sin_ind);
|
|
||||||
// если это первая полуволна
|
|
||||||
if(Duty > 0)
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hspwm, Duty+PWM_Calc_Min_Duty(hspwm->hMasterPWM)); // set first channel
|
|
||||||
PWM_Set_Compare2(hspwm, 0); // reset second channel
|
|
||||||
}
|
|
||||||
else // если это вторая полуволна
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hspwm, 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(hspwm, (-Duty)+PWM_Calc_Min_Duty(hspwm->hMasterPWM)); // set second channel
|
|
||||||
}
|
|
||||||
//if(hspwm == &hpwm2)
|
|
||||||
//__ASM("");
|
|
||||||
}
|
|
||||||
else // if three phase disabled
|
|
||||||
{
|
|
||||||
PWM_Set_Compare1(hspwm, 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(hspwm, 0); // reset second channel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check is all Slave channels works properly.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @note Проверка работает ли только один из каналов, и проверка чтобы CCRx <= ARR
|
|
||||||
* @note В мастере проверка происходит напрямую в PWM_Handler.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Check_Channels(PWM_SlaveHandleTypeDef *hspwm)
|
|
||||||
{
|
|
||||||
// if three phase enables
|
|
||||||
if (PWM_Get_Mode(hspwm->hMasterPWM, PWM_PHASE_MODE))
|
|
||||||
{
|
|
||||||
uint16_t min_duty = PWM_Calc_Min_Duty(hspwm->hMasterPWM);
|
|
||||||
// IF FIRST CHANNEL IS ACRIVE
|
|
||||||
if(PWM_Get_Compare1(hspwm) != 0)
|
|
||||||
{
|
|
||||||
// Duty shoud be bigger or equeal than min duration
|
|
||||||
if (PWM_Get_Compare1(hspwm)<min_duty)
|
|
||||||
PWM_Set_Compare1(hspwm, min_duty);
|
|
||||||
// Duty shoud be less or equeal than ARR-min duration
|
|
||||||
if (PWM_Get_Compare1(hspwm)>PWM_Get_Autoreload(hspwm)-min_duty)
|
|
||||||
PWM_Set_Compare1(hspwm, PWM_Get_Autoreload(hspwm)-min_duty);
|
|
||||||
}
|
|
||||||
// IF SECOND CHANNEL IS ACRIVE
|
|
||||||
else if(PWM_Get_Compare2(hspwm) != 0)
|
|
||||||
// Duty shoud be bigger or equeal than min duration
|
|
||||||
if (PWM_Get_Compare2(hspwm)<min_duty)
|
|
||||||
PWM_Set_Compare2(hspwm, min_duty);
|
|
||||||
// Duty shoud be less or equeal than ARR
|
|
||||||
if (PWM_Get_Compare2(hspwm)>PWM_Get_Autoreload(hspwm)-min_duty)
|
|
||||||
PWM_Set_Compare2(hspwm, PWM_Get_Autoreload(hspwm)-min_duty);
|
|
||||||
// IF BOTH CHANNEL IS ACRIVE
|
|
||||||
if((PWM_Get_Compare1(hspwm) != 0) && (PWM_Get_Compare2(hspwm) != 0))
|
|
||||||
{
|
|
||||||
// Only one channel shoud be active so disable all
|
|
||||||
PWM_Set_Compare1(hspwm, 0);
|
|
||||||
PWM_Set_Compare2(hspwm, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// reset channels
|
|
||||||
PWM_Set_Compare1(hspwm, 0); // reset first channel
|
|
||||||
PWM_Set_Compare2(hspwm, 0); // reset second channel
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create Dead Time for Slave PWM when switches channels.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @param LocalDeadTimeCnt - указатель на переменную для отсчитывания дедтайма.
|
|
||||||
* @param LocalActiveChannel - указатель на переменную для отслеживания смены канала.
|
|
||||||
* @note Аналог функции PWM_CreateDeadTime но для слейв ШИМов.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_CreateDeadTime(PWM_SlaveHandleTypeDef *hspwm, float *LocalDeadTimeCnt, unsigned *LocalActiveChannel)
|
|
||||||
{
|
|
||||||
// get current active channel
|
|
||||||
hspwm->fActiveChannel = (PWM_Get_Compare2(hspwm) != 0); // if channel two is active - write 1, otherwise - 0
|
|
||||||
// when channels are swithed and no dead time currently active
|
|
||||||
if(*LocalActiveChannel != hspwm->fActiveChannel)
|
|
||||||
{ // update active channel
|
|
||||||
*LocalActiveChannel = hspwm->fActiveChannel;
|
|
||||||
// set deadtime
|
|
||||||
*LocalDeadTimeCnt = hspwm->hMasterPWM->PWM_DeadTime;
|
|
||||||
Trace_PWM_DeadTime_Enter();
|
|
||||||
}
|
|
||||||
// decrement dead time
|
|
||||||
*LocalDeadTimeCnt -= (PWM_Get_Autoreload(hspwm)+1)*hspwm->hMasterPWM->stim.sTickBaseMHz;
|
|
||||||
if(*LocalDeadTimeCnt > 0) // if dead time is still active
|
|
||||||
{ // reset all channels
|
|
||||||
// reset channels
|
|
||||||
PWM_Set_Compare1(hspwm, 0);
|
|
||||||
PWM_Set_Compare2(hspwm, 0);
|
|
||||||
}
|
|
||||||
else // if dead time is done
|
|
||||||
{ // set it to zero
|
|
||||||
*LocalDeadTimeCnt = 0;
|
|
||||||
Trace_PWM_DeadTime_Exit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//------------------------HANDLERS FUNCTIONS-------------------------
|
|
||||||
//---------------PWM TIMER-----------------
|
|
||||||
#if (PWM_MASTER_TIM_NUMB == 1) || (PWM_MASTER_TIM_NUMB == 10) // choose handler for TIM
|
|
||||||
void TIM1_UP_TIM10_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 2)
|
|
||||||
void TIM2_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 3)
|
|
||||||
void TIM3_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 4)
|
|
||||||
void TIM4_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 5)
|
|
||||||
void TIM5_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 6)
|
|
||||||
void TIM6_DAC_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 7)
|
|
||||||
void TIM7_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 8) || (PWM_MASTER_TIM_NUMB == 13)
|
|
||||||
void TIM8_UP_TIM13_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 1) || (PWM_MASTER_TIM_NUMB == 9)
|
|
||||||
void TIM1_BRK_TIM9_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 1) || (PWM_MASTER_TIM_NUMB == 11)
|
|
||||||
void TIM1_TRG_COM_TIM11_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 8) || (PWM_MASTER_TIM_NUMB == 12)
|
|
||||||
void TIM8_BRK_TIM12_IRQHandler(void)
|
|
||||||
#elif (PWM_MASTER_TIM_NUMB == 8) || (PWM_MASTER_TIM_NUMB == 14)
|
|
||||||
void TIM8_TRG_COM_TIM14_IRQHandler(void)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
Trace_PWM_TIM_Enter();
|
|
||||||
HAL_TIM_IRQHandler(&hpwm1.stim.htim);
|
|
||||||
PWM_Handler(&hpwm1);
|
|
||||||
|
|
||||||
Trace_PWM_TIM_Exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//-------------------------------------------------------------------
|
|
||||||
//-----------------------------OUTDATE-------------------------------
|
|
||||||
#ifdef OUTDATE
|
|
||||||
/**
|
|
||||||
* @brief First set up of PWM Single Channel.
|
|
||||||
* @note Первый инит ШИМ. Заполняет структуры и инициализирует таймер для генерации синуоидального ШИМ.
|
|
||||||
* Скважность ШИМ меняется по закону синусоиды, сдвинутой в положительную область (от 0 до 2)
|
|
||||||
* ШИМ генерируется на одном канале.
|
|
||||||
* @note This called from main
|
|
||||||
*/
|
|
||||||
void PWM_SineSingChannel_FirstInit(void)
|
|
||||||
{
|
|
||||||
hpwm1.pDuty_Table_Origin = SIN_TABLE_ORIGIN;
|
|
||||||
|
|
||||||
//---------PWM TIMER1 INIT------------
|
|
||||||
// channel settings
|
|
||||||
hpwm1.sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
|
||||||
hpwm1.sConfigOC.Pulse = 0;
|
|
||||||
hpwm1.sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
|
||||||
hpwm1.sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
|
||||||
|
|
||||||
// tim1 settings
|
|
||||||
hpwm1.stim.htim.Instance = TIMER_PWM1_INSTANCE;
|
|
||||||
hpwm1.stim.sTimMode = TIM_IT_MODE;
|
|
||||||
hpwm1.stim.sTickBaseMHz = TIM_TickBase_1US;
|
|
||||||
hpwm1.stim.sTimAHBFreqMHz = 72;
|
|
||||||
hpwm1.stim.sTimFreqHz = HZ_TIMER_PWM;
|
|
||||||
hpwm1.GPIOx = GPIOD;
|
|
||||||
hpwm1.GPIO_PIN_X1 = GPIO_PIN_12;
|
|
||||||
|
|
||||||
TIM_Base_Init(&hpwm1.stim);
|
|
||||||
TIM_Output_PWM_Init(&hpwm1.stim.htim, &hpwm1.sConfigOC, hpwm->PWM_Channel1, hpwm1.GPIOx, hpwm1.GPIO_PIN_X1);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//----------TIMERS START-------------
|
|
||||||
HAL_TIM_PWM_Start_IT(&hpwm1.stim.htim, hpwm->PWM_Channel1); // timer for PWM
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef SINE_THREE_PHASE_PWM_ENABLE
|
|
||||||
|
|
||||||
//---------PWM TIMER2 INIT------------
|
|
||||||
// tim2 settings
|
|
||||||
hpwm2 = hpwm1;
|
|
||||||
hpwm2.stim.htim.Instance = TIM5;
|
|
||||||
hpwm2.GPIOx = GPIOA;
|
|
||||||
hpwm2.GPIO_PIN_X = GPIO_PIN_0;
|
|
||||||
|
|
||||||
TIM_Base_Init(&hpwm2.stim);
|
|
||||||
TIM_Output_PWM_Init(&hpwm2.stim.htim, &hpwm2.sConfigOC, TIM_CHANNEL_1, hpwm2.GPIOx, hpwm2.GPIO_PIN_X);
|
|
||||||
|
|
||||||
//---------PWM TIMER3 INIT------------
|
|
||||||
// tim3 settings
|
|
||||||
hpwm3 = hpwm2;
|
|
||||||
hpwm3.stim.htim.Instance = TIM8;
|
|
||||||
hpwm3.GPIOx = GPIOC;
|
|
||||||
hpwm3.GPIO_PIN_X = GPIO_PIN_6;
|
|
||||||
|
|
||||||
TIM_Base_Init(&hpwm3.stim);
|
|
||||||
TIM_Output_PWM_Init(&hpwm3.stim.htim, &hpwm3.sConfigOC, TIM_CHANNEL_1, hpwm3.GPIOx, hpwm3.GPIO_PIN_X);
|
|
||||||
|
|
||||||
HAL_TIM_PWM_Start(&hpwm2.stim.htim, TIM_CHANNEL_1); // timer for PWM
|
|
||||||
HAL_TIM_PWM_Start(&hpwm3.stim.htim, TIM_CHANNEL_1); // timer for PWM
|
|
||||||
#endif // SINE_THREE_PHASE_PWM_ENABLE
|
|
||||||
|
|
||||||
void PWM_Threephase_Init(void)
|
|
||||||
{
|
|
||||||
#ifdef INTERNAL_THREE_PHASE_PWM_ENABLE
|
|
||||||
TIM_OC_InitTypeDef sPWMConfigOC = {0};
|
|
||||||
TIM_OC_InitTypeDef sOCConfigOC = {0};
|
|
||||||
int us100Time = 10000/TIM_CTRL.sTimFreqHz; // 1/TIM_CTRL.sTimFreqHz * 10^6 - Sample time in us
|
|
||||||
|
|
||||||
// PWM CHANNEL SETTINGS
|
|
||||||
sPWMConfigOC.OCMode = TIM_OCMODE_PWM1;
|
|
||||||
sPWMConfigOC.Pulse = us100Time/2;
|
|
||||||
sPWMConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
|
|
||||||
sPWMConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
|
||||||
|
|
||||||
// CC CHANNEL SETTINGS
|
|
||||||
sOCConfigOC.OCMode = TIM_OCMODE_ACTIVE;
|
|
||||||
sOCConfigOC.Pulse = (2*us100Time-1) / 3;
|
|
||||||
sOCConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
|
||||||
|
|
||||||
|
|
||||||
// TIMER1 PWM MASTER INIT
|
|
||||||
TIM_3PWM1.htim = &tim_3pwm1;
|
|
||||||
TIM_3PWM1.htim->Instance = TIM1;
|
|
||||||
TIM_3PWM1.htim->Init.Prescaler = 7200-1; // 1 us
|
|
||||||
TIM_3PWM1.htim->Init.Period = us100Time-1; // period in us = Sample time in us
|
|
||||||
|
|
||||||
TIM_3PWM1.sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC2REF;
|
|
||||||
TIM_3PWM1.sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
|
||||||
|
|
||||||
TIM_3PWM1.sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
|
|
||||||
|
|
||||||
TIM_Base_Init(&TIM_3PWM1);
|
|
||||||
TIM_Output_PWM_Init(TIM_3PWM1.htim, &sPWMConfigOC, TIM_CHANNEL_1, GPIOE, GPIO_PIN_9);
|
|
||||||
HAL_TIM_OC_ConfigChannel(TIM_3PWM1.htim, &sOCConfigOC, TIM_CHANNEL_2);
|
|
||||||
|
|
||||||
|
|
||||||
// TIMER2 PWM SLAVE INIT
|
|
||||||
TIM_3PWM2 = TIM_3PWM1;
|
|
||||||
TIM_3PWM2.htim = &tim_3pwm2;
|
|
||||||
*TIM_3PWM2.htim = *TIM_3PWM1.htim;
|
|
||||||
TIM_3PWM2.htim->Instance = TIM2;
|
|
||||||
TIM_3PWM1.TIM_MODE = TIM_DEFAULT;
|
|
||||||
|
|
||||||
TIM_3PWM2.sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER;
|
|
||||||
TIM_3PWM2.sSlaveConfig.InputTrigger = TIM_TS_ITR0;
|
|
||||||
|
|
||||||
TIM_Base_Init(&TIM_3PWM2);
|
|
||||||
TIM_Output_PWM_Init(TIM_3PWM2.htim, &sPWMConfigOC, TIM_CHANNEL_1, GPIOA, GPIO_PIN_5);
|
|
||||||
HAL_TIM_OC_ConfigChannel(TIM_3PWM2.htim, &sOCConfigOC, TIM_CHANNEL_2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TIMER3 PWM SLAVE INIT
|
|
||||||
TIM_3PWM3 = TIM_3PWM2;
|
|
||||||
TIM_3PWM3.htim = &tim_3pwm3;
|
|
||||||
*TIM_3PWM3.htim = *TIM_3PWM2.htim;
|
|
||||||
TIM_3PWM3.htim->Instance = TIM3;
|
|
||||||
TIM_3PWM3.sSlaveConfig.InputTrigger = TIM_TS_ITR1;
|
|
||||||
|
|
||||||
TIM_Base_Init(&TIM_3PWM3);
|
|
||||||
TIM_Output_PWM_Init(TIM_3PWM3.htim, &sPWMConfigOC, TIM_CHANNEL_1, GPIOA, GPIO_PIN_6);
|
|
||||||
|
|
||||||
hpwm1.Duty_Table_Size = PWM_Fill_Sine_Table(&sin_table, SIN_TABLE_SIZE_MAX);
|
|
||||||
|
|
||||||
// TIMERS START
|
|
||||||
HAL_TIM_OC_Start(TIM_3PWM3.htim, TIM_CHANNEL_2);
|
|
||||||
HAL_TIM_PWM_Start(TIM_3PWM3.htim, TIM_CHANNEL_1);
|
|
||||||
|
|
||||||
HAL_TIM_PWM_Start(TIM_3PWM2.htim, TIM_CHANNEL_1);
|
|
||||||
HAL_TIM_OC_Start(TIM_3PWM2.htim, TIM_CHANNEL_2);
|
|
||||||
|
|
||||||
HAL_TIM_OC_Start(TIM_3PWM1.htim, TIM_CHANNEL_2);
|
|
||||||
HAL_TIM_PWM_Start(TIM_3PWM1.htim, TIM_CHANNEL_1);
|
|
||||||
#endif // INTERNAL_THREE_PHASE_PWM_ENABLE
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
@ -1,324 +0,0 @@
|
|||||||
/********************************MODBUS*************************************
|
|
||||||
Данный файл содержит объявления базовых функции и дефайны для реализации
|
|
||||||
MODBUS.
|
|
||||||
Данный файл необходимо подключить в rs_message.h. После подключать rs_message.h
|
|
||||||
к основному проекту.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __PWM_H_
|
|
||||||
#define __PWM_H_
|
|
||||||
#include "control.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern uint32_t sin_table[SIN_TABLE_SIZE_MAX];
|
|
||||||
|
|
||||||
#define int_to_percent(_int_) ((float)_int_/100)
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////
|
|
||||||
////////////////////////////---DEFINES---////////////////////////////
|
|
||||||
//----------------------------PWM HANDLE----------------------------//
|
|
||||||
/**
|
|
||||||
* @brief Calc duration of minimum pulse in ticks.
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @return _val_ - количество тиков кратчайшего импульса.
|
|
||||||
*/
|
|
||||||
#define PWM_Calc_Min_Duty(_hpwm_) ((_hpwm_)->PWM_MinPulseDur/(_hpwm_)->stim.sTickBaseMHz)
|
|
||||||
/**
|
|
||||||
* @brief Calc Scale Koef for Table & AUTORELOAD REGISTER
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _scale_ - верхняя граница диапазона значений.
|
|
||||||
* @return _koef_ - коэффициент для масштабирования.
|
|
||||||
* @note Данный макрос рассчитывает коэффициент для приведения значений с диапазоном [0,_scale_]
|
|
||||||
к регистру автозагрузки с диапазоном [0,ARR].
|
|
||||||
* @note Если задана минимальная длительность импульса в тактах n, она вычитается из ARR: [0, ARR-2*n]
|
|
||||||
И потом регистр ARR заполняется так, что диапазон его значений будет [n, ARR-n] @ref PWM_Get_Table_Element_Unsigned
|
|
||||||
*/
|
|
||||||
#define PWM_Calc_Duty_Scale(_hpwm_, _scale_) ((float)PWM_Get_Autoreload(_hpwm_))/(_scale_)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get Table Element Scaled corresponding to TIM ARR register
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _ind_ - номер элемента из таблицы скважностей.
|
|
||||||
* @return _val_ - масштабированный под регистры таймера значение.
|
|
||||||
* @note Если задана минимальная длительность импульса в тактах n,
|
|
||||||
то регистр ARR заполняется так, что диапазон его значений будет [n, ARR-n]
|
|
||||||
*/
|
|
||||||
#define PWM_Get_Table_Element_Unsigned(_hpwm_,_ind_) (*((_hpwm_)->pDuty_Table_Origin+_ind_)*((_hpwm_)->Duty_Table_Scale))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get Table Element Scaled and Shifted corresponding to TIM ARR register
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _ind_ - номер элемента из таблицы скважностей.
|
|
||||||
* @return _val_ - масштабированный под регистры таймера значение.
|
|
||||||
* @note По сути такая же как PWM_Get_Table_Element_Unsigned но добавляется сдвиг на одну амплитуду для учитывания знака.
|
|
||||||
(если точнее, то сдвиг добавляется для компенсации сдвига, который имитирует знак)
|
|
||||||
* @note 0x8000*(_hpwm_)->Duty_Table_Scale - т.к. первая полуволна находится в диапазоне (0x8000-0xFFFF) вычитаем константу 0x8000 с масштабированием
|
|
||||||
*/
|
|
||||||
#define PWM_Get_Table_Element_Signed(_hpwm_,_ind_) ((int)(*((_hpwm_)->pDuty_Table_Origin+_ind_)*((_hpwm_)->Duty_Table_Scale))-0x8000*(_hpwm_)->Duty_Table_Scale)
|
|
||||||
/**
|
|
||||||
* @brief Create pointer to slave PWM from pointer to void in PWM_HandleTypeDef.
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _slavepwm_ - имя слейв pwm.
|
|
||||||
* @return _pslavepwm_ - указатель на структуру PWM_SlaveHandleTypeDef.
|
|
||||||
*/
|
|
||||||
#define PWM_Set_pSlaveHandle(_hpwm_,_slavepwm_) ((PWM_SlaveHandleTypeDef *)_hpwm_->_slavepwm_)
|
|
||||||
/**
|
|
||||||
* @brief Copy setting from master TIM_SettingsTypeDef to slave TIM_SettingsTypeDef.
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @return _set_ - имя настройки.
|
|
||||||
*/
|
|
||||||
#define PWM_Slave_CopyTimSetting(_hspwm_, _set_) ((_hspwm_)->stim._set_ = (_hspwm_)->hMasterPWM->stim._set_)
|
|
||||||
|
|
||||||
//---------------------------TIMER REGS----------------------------//
|
|
||||||
/**
|
|
||||||
* @brief Set PWM autoreload value (max duty value).
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _val_ - значение, которое нужно записать в Compare.
|
|
||||||
*/
|
|
||||||
#define PWM_Get_Autoreload(_hpwm_) __HAL_TIM_GET_AUTORELOAD(&((_hpwm_)->stim.htim))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get PWM Duty on corresponding channel.
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _val_ - значение, которое нужно записать в Compare.
|
|
||||||
*/
|
|
||||||
#define PWM_Get_Compare1(_hpwm_) __HAL_TIM_GET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel1)
|
|
||||||
#define PWM_Get_Compare2(_hpwm_) __HAL_TIM_GET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel2)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set PWM Duty on corresponding channel.
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _val_ - значение, которое нужно записать в Compare.
|
|
||||||
*/
|
|
||||||
#define PWM_Set_Compare1(_hpwm_, _val_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel1, (_val_))
|
|
||||||
#define PWM_Set_Compare2(_hpwm_, _val_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), (_hpwm_)->PWM_Channel2, (_val_))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set PWM Duty From PWM_Value Percent
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _channel_ - канал для выставления скважности.
|
|
||||||
* @param _ind_ - номер элемента из таблицы скважностей.
|
|
||||||
*/
|
|
||||||
#define PWM_Set_Duty_From_Percent(_hpwm_, _channel_) __HAL_TIM_SET_COMPARE(&((_hpwm_)->stim.htim), _channel_, ((_hpwm_)->PWM_Value/100)*(PWM_Get_Autoreload(_hpwm_)+1))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set PWM Duty From table
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _channel_ - канал для выставления скважности.
|
|
||||||
* @param _ind_ - номер элемента из таблицы скважностей.
|
|
||||||
*/
|
|
||||||
#define PWM_Set_Duty_From_Table(_hpwm_, _ind_) (PWM_Set_Compare1(_hpwm_, (PWM_Get_Table_Element_Unsigned((_hpwm_), (_ind_))+1)))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Set PWM Duty From table
|
|
||||||
* @param _hpwm_ - указатель на хендл pwm.
|
|
||||||
* @param _channel_ - канал для выставления скважности.
|
|
||||||
* @param _ind_ - номер элемента из таблицы скважностей.
|
|
||||||
*/
|
|
||||||
#define PWM_Set_SlaveDuty_From_Table(_hpwm_, _ind_) (PWM_Set_Compare1(_hpwm_, (PWM_Get_Table_Element_Unsigned((_hpwm_)->hMasterPWM, (_ind_))+1)))
|
|
||||||
|
|
||||||
|
|
||||||
// MODE DEFINES
|
|
||||||
#define PWM_DC_MODE_Pos (0)
|
|
||||||
#define PWM_CH_MODE_Pos (1)
|
|
||||||
#define PWM_PHASE_MODE_Pos (2)
|
|
||||||
|
|
||||||
#define PWM_DC_MODE (1<<(PWM_DC_MODE_Pos)) // 0 - set pwm duty from table with PWM_Value period, 1 - set pwm duty PWM_Value (in percent)
|
|
||||||
#define PWM_CH_MODE (1<<(PWM_CH_MODE_Pos))
|
|
||||||
// DC MODE: 0 - pwm on channel 1, 1 - pwm on channel 2
|
|
||||||
// TABLE MODE: 0 - signed mode, 1 - unsigned mode
|
|
||||||
#define PWM_PHASE_MODE (1<<(PWM_PHASE_MODE_Pos))
|
|
||||||
|
|
||||||
#define PWM_Get_Mode(_hpwm_, _mode_) ((_hpwm_)->sPWM_Mode&(_mode_))
|
|
||||||
/* Structure for PWM modes */
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
PWM_TABLE_UNSIGN = 0, /* set pwm duty from table with PWM_Value period */
|
|
||||||
PWM_TABLE_SIGN = PWM_CH_MODE, /* set pwm duty from table with PWM_Value period on two channels (positive and negative halfes) */
|
|
||||||
PWM_DC_POS = PWM_DC_MODE, /* set pwm duty PWM_Value (in percent) on first channel */
|
|
||||||
PWM_DC_NEG = PWM_DC_MODE|PWM_CH_MODE, /* set pwm duty PWM_Value (in percent) on second channel */
|
|
||||||
|
|
||||||
PWM_PHASE_UNSIGN = PWM_PHASE_MODE, /* set pwm table duty on three pins, with requested shift */
|
|
||||||
PWM_PHASE_SIGN = PWM_CH_MODE|PWM_PHASE_MODE, /* set pwm table duty on six pins (two pins = one phase (positive and negative halfes)) */
|
|
||||||
}PWM_ModeTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Handle for PWM.
|
|
||||||
* @note Prefixes: h - handle, s - settings, f - flag
|
|
||||||
*/
|
|
||||||
typedef struct // PWM_HandleTypeDef
|
|
||||||
{
|
|
||||||
/* PWM VARIABLES */
|
|
||||||
PWM_ModeTypeDef sPWM_Mode; /* PWM Mode: 0 - DC mode, 1 - Table mode */
|
|
||||||
float PWM_Value; /* DC mode: PWM duty, Table mode: frequency*/
|
|
||||||
uint32_t PWM_MinPulseDur; /* minimum pulse duration for PWM in us*/
|
|
||||||
uint32_t PWM_DeadTime; /* dead-Time between switches half waves (channels) in us */
|
|
||||||
|
|
||||||
/* SETTINGS FOR TIMER */
|
|
||||||
TIM_SettingsTypeDef stim; /* settings for TIM */
|
|
||||||
TIM_OC_InitTypeDef sConfigOC; /* settings for oc channel */
|
|
||||||
unsigned fActiveChannel; /* flag for active oc channel: 0 - first channel, 1 - second channel */
|
|
||||||
uint16_t PWM_Channel1; /* instance of first channel */
|
|
||||||
uint16_t PWM_Channel2; /* instance of second channel */
|
|
||||||
|
|
||||||
/* VARIABLES FOR TABLE DUTY PARAMETERS */
|
|
||||||
uint32_t *pDuty_Table_Origin; /* pointer to table of pwm duties */
|
|
||||||
uint32_t Duty_Table_Size; /* size of duty table */
|
|
||||||
float Duty_Table_Ind; /* current ind of duty table */
|
|
||||||
float Duty_Table_Scale; /* scale for TIM ARR register */
|
|
||||||
|
|
||||||
/* SETTIGNS FOR PWM OUTPUT */
|
|
||||||
GPIO_TypeDef *GPIOx; /* GPIO port for PWM output */
|
|
||||||
uint32_t GPIO_PIN_X1; /* GPIO pin for PWM output */
|
|
||||||
uint32_t GPIO_PIN_X2; /* GPIO pin for PWM output (second half wave) */
|
|
||||||
|
|
||||||
/* SLAVES PWM */
|
|
||||||
void *hpwm2;
|
|
||||||
void *hpwm3;
|
|
||||||
|
|
||||||
}PWM_HandleTypeDef;
|
|
||||||
extern PWM_HandleTypeDef hpwm1;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Handle for Slave PWM.
|
|
||||||
* @note Prefixes: h - handle, s - settings, f - flag
|
|
||||||
*/
|
|
||||||
typedef struct // PWM_SlaveHandleTypeDef
|
|
||||||
{
|
|
||||||
/* MASTER PWM*/
|
|
||||||
PWM_HandleTypeDef *hMasterPWM; /* master pwm handle */
|
|
||||||
|
|
||||||
/* SETTINGS FOR TIMER */
|
|
||||||
TIM_SettingsTypeDef stim; /* slave tim handle */
|
|
||||||
unsigned fActiveChannel; /* flag for active oc channel: 0 - first channel, 1 - second channel */
|
|
||||||
uint16_t PWM_Channel1; /* instance of first channel */
|
|
||||||
uint16_t PWM_Channel2; /* instance of second channel */
|
|
||||||
|
|
||||||
/* VARIABLES FOR TABLE DUTY PARAMETERS */
|
|
||||||
float Duty_Table_Ind; /* current ind of duty table */
|
|
||||||
float Duty_Shift_Ratio; /* Ratio of table shift: 0.5 shift - shift = Table_Size/2 */
|
|
||||||
|
|
||||||
/* SETTIGNS FOR PWM OUTPUT */
|
|
||||||
GPIO_TypeDef *GPIOx; /* GPIO port for PWM output */
|
|
||||||
uint32_t GPIO_PIN_X1; /* GPIO pin for PWM output */
|
|
||||||
uint32_t GPIO_PIN_X2; /* GPIO pin for PWM output (second half wave) */
|
|
||||||
}PWM_SlaveHandleTypeDef;
|
|
||||||
extern PWM_SlaveHandleTypeDef hpwm2;
|
|
||||||
extern PWM_SlaveHandleTypeDef hpwm3;
|
|
||||||
|
|
||||||
//--------------------------------PWM FUNCTIONS----------------------------------
|
|
||||||
/**
|
|
||||||
* @brief reInitialization of PWM TIM.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @note Перенастраивает таймер согласно принятным настройкам в pwm_ctrl.
|
|
||||||
*/
|
|
||||||
void PWM_Sine_ReInit(PWM_HandleTypeDef *hpwm);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Initialization of Slave PWM TIM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @note Вызывает функции инициализации и включения слейв ШИМ.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Init(PWM_SlaveHandleTypeDef *hspwm);
|
|
||||||
/**
|
|
||||||
* @brief reInitialization of Slave PWM TIM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @note Перенастраивает таймер согласно принятным настройкам в pwm_ctrl.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_reInit(PWM_SlaveHandleTypeDef *hspwm);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Filling table with one period of sinus values.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @param table_size - размер таблицы.
|
|
||||||
* @note Формирует таблицу синусов размером table_size.
|
|
||||||
*/
|
|
||||||
uint32_t PWM_Fill_Sine_Table(PWM_HandleTypeDef *hpwm, uint32_t table_size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Calc and update new Duty Table Scale.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @note Используется, когда изменяется значение регистра ARR.
|
|
||||||
*/
|
|
||||||
void PWM_Update_DutyTableScale(PWM_HandleTypeDef *hpwm);
|
|
||||||
//---------------------this called from TIM_PWM_Handler()------------------------
|
|
||||||
// MASTER PWM FUNCTIONS
|
|
||||||
/**
|
|
||||||
* @brief PWM Handler.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @note Управляет скважность ШИМ в режиме PWM_TABLE.
|
|
||||||
* @note This called from TIM_PWM_Handler
|
|
||||||
*/
|
|
||||||
void PWM_Handler(PWM_HandleTypeDef *hpwm);
|
|
||||||
/**
|
|
||||||
* @brief Getting ind for Duty Table.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @param FreqTIM - частота таймера ШИМ.
|
|
||||||
* @note Рассчитывает индекс для таблицы скважностей.
|
|
||||||
* PWM_Value в hpwm - частота с которой эта таблица должна выводиться на ШИМ
|
|
||||||
* @note This called from TIM_PWM_Handler
|
|
||||||
*/
|
|
||||||
uint32_t PWM_Get_Duty_Table_Ind(PWM_HandleTypeDef *hpwm, float FreqTIM);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create Dead Time when switches channels.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @param LocalDeadTimeCnt - указатель на переменную для отсчитывания дедтайма.
|
|
||||||
* @param LocalActiveChannel - указатель на переменную для отслеживания смены канала.
|
|
||||||
*/
|
|
||||||
void PWM_CreateDeadTime(PWM_HandleTypeDef *hpwm, float *LocalDeadTimeCnt, unsigned *LocalActiveChannel);
|
|
||||||
|
|
||||||
// SLAVE PWM FUNCTIONS
|
|
||||||
/**
|
|
||||||
* @brief Set Duty from table on Slave PWM at one channel by sin_ind of the Master PWM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
|
||||||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Set_DutyTable_Unsigned(PWM_SlaveHandleTypeDef *hspwm, uint16_t sin_ind);
|
|
||||||
/**
|
|
||||||
* @brief Set Duty from table on Slave PWM at two channel by sin_ind of the Master PWM.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @param sin_ind - индекс таблицы для Мастер ШИМ.
|
|
||||||
* @note Индекс для свейл ШИМ расчитывается в самой функции.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Set_DutyTable_Signed(PWM_SlaveHandleTypeDef *hspwm, uint16_t sin_ind);
|
|
||||||
/**
|
|
||||||
* @brief Check is all Slave channels works properly.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @note Проверка работает ли только один из каналов, и проверка чтобы CCRx <= ARR
|
|
||||||
* @note В мастере проверка происходит напрямую в PWM_Handler.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_Check_Channels(PWM_SlaveHandleTypeDef *hspwm);
|
|
||||||
/**
|
|
||||||
* @brief Create Dead Time for Slave PWM when switches channels.
|
|
||||||
* @param hspwm - указатель на хендл слейв ШИМ.
|
|
||||||
* @param LocalDeadTimeCnt - указатель на переменную для отсчитывания дедтайма.
|
|
||||||
* @param LocalActiveChannel - указатель на переменную для отслеживания смены канала.
|
|
||||||
* @note Аналог функции PWM_CreateDeadTime но для слейв ШИМов.
|
|
||||||
*/
|
|
||||||
void PWM_SlavePhase_CreateDeadTime(PWM_SlaveHandleTypeDef *hspwm, float *LocalDeadTimeCnt, unsigned *LocalActiveChannel);
|
|
||||||
//---------------------this called from TIM_CTRL_Handler()-----------------------
|
|
||||||
/**
|
|
||||||
* @brief Update PWM parameters.
|
|
||||||
* @param hpwm - указатель на хендл ШИМ.
|
|
||||||
* @note Проверка надо ли обновлять параметры ШИМ, и если надо - обновляет их.
|
|
||||||
* @note This called from TIM_CTRL_Handler
|
|
||||||
*/
|
|
||||||
void Update_Params_For_PWM(PWM_HandleTypeDef *hpwm);
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------this called from main()-----------------------------
|
|
||||||
/**
|
|
||||||
* @brief First set up of PWM Two Channel.
|
|
||||||
* @note Первый инит ШИМ. Заполняет структуры и инициализирует таймер для генерации синуоидального ШИМ.
|
|
||||||
* Скважность ШИМ меняется по закону синусоиды, каждый канал генерирует свой полупериод синуса (от -1 до 0 И от 0 до 1)
|
|
||||||
* ШИМ генерируется на одном канале.
|
|
||||||
* @note This called from main OR by setted coil
|
|
||||||
*/
|
|
||||||
void PWM_Sine_FirstInit(void);
|
|
||||||
|
|
||||||
|
|
||||||
#endif // __PWM_H_
|
|
||||||
@ -1,265 +0,0 @@
|
|||||||
#include "control.h"
|
|
||||||
ProjectSettings_TypeDef PROJSET;
|
|
||||||
uint32_t PageError = 0x00;
|
|
||||||
uint8_t UpdateSettings = 0;
|
|
||||||
|
|
||||||
void WriteSettingsToMem(void)
|
|
||||||
{
|
|
||||||
FillStructWithDefines();
|
|
||||||
//HAL_FLASH_Unlock();
|
|
||||||
//
|
|
||||||
//CheckSettingsInFLASH();
|
|
||||||
//
|
|
||||||
//if(CheckIsSettingsValid(&PROJSET)) // if new settings are invalid
|
|
||||||
// PROJSET = *PROJSET_MEM; // take the old settings from mem
|
|
||||||
//else // if new settings are valid
|
|
||||||
// SetFlagUpdateSettingsInMem(); // save the new settings in mem (set flag to do this)
|
|
||||||
//
|
|
||||||
//HAL_FLASH_Lock();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetFlagUpdateSettingsInMem(void)
|
|
||||||
{
|
|
||||||
//UpdateSettings = 0;
|
|
||||||
//// MODBUS settings
|
|
||||||
//if(PROJSET_MEM->MB_DEVICE_ID != PROJSET.MB_DEVICE_ID)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->MB_SPEED != PROJSET.MB_SPEED)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->MB_GPIOX != PROJSET.MB_GPIOX)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->MB_GPIO_PIN_RX != PROJSET.MB_GPIO_PIN_RX)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->MB_GPIO_PIN_RX != PROJSET.MB_GPIO_PIN_RX)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->MB_MAX_TIMEOUT != PROJSET.MB_MAX_TIMEOUT)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//
|
|
||||||
//// PWM settings
|
|
||||||
//if(PROJSET_MEM->TIM_PWM_TICKBASE != PROJSET.TIM_PWM_TICKBASE)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM_AHB_FREQ != PROJSET.TIM_PWM_AHB_FREQ)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//
|
|
||||||
//if(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL1 != PROJSET.TIM_PWM1_TIM_CHANNEL1)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL2 != PROJSET.TIM_PWM1_TIM_CHANNEL2)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM1_GPIOx != PROJSET.TIM_PWM1_GPIOx)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X1 != PROJSET.TIM_PWM1_GPIO_PIN_X1)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X2 != PROJSET.TIM_PWM1_GPIO_PIN_X2)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//
|
|
||||||
//if(PROJSET_MEM->TIM_PWM2_INSTANCE != PROJSET.TIM_PWM2_INSTANCE)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL1 != PROJSET.TIM_PWM2_TIM_CHANNEL1)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL2 != PROJSET.TIM_PWM2_TIM_CHANNEL2)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM2_GPIOx != PROJSET.TIM_PWM2_GPIOx)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X1 != PROJSET.TIM_PWM2_GPIO_PIN_X1)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X2 != PROJSET.TIM_PWM2_GPIO_PIN_X2)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//
|
|
||||||
//if(PROJSET_MEM->TIM_PWM3_INSTANCE != PROJSET.TIM_PWM3_INSTANCE)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL1 != PROJSET.TIM_PWM3_TIM_CHANNEL1)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL2 != PROJSET.TIM_PWM3_TIM_CHANNEL2)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM3_GPIOx != PROJSET.TIM_PWM3_GPIOx)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X1 != PROJSET.TIM_PWM3_GPIO_PIN_X1)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X2 != PROJSET.TIM_PWM3_GPIO_PIN_X2)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//
|
|
||||||
//// CTRL settings
|
|
||||||
//if(PROJSET_MEM->TIM_CTRL_TICKBASE != PROJSET.TIM_CTRL_TICKBASE)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
//if(PROJSET_MEM->TIM_CTRL_AHB_FREQ != PROJSET.TIM_CTRL_AHB_FREQ)
|
|
||||||
// UpdateSettings = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void UpdateSettingsInMem(void)
|
|
||||||
{
|
|
||||||
//if(UpdateSettings)
|
|
||||||
//{
|
|
||||||
// FLASH_EraseInitTypeDef EraseInitStruct;
|
|
||||||
// PageError = 0x00;
|
|
||||||
//
|
|
||||||
// EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages
|
|
||||||
// EraseInitStruct.Banks = FLASH_BANK_1;
|
|
||||||
// EraseInitStruct.Sector = FLASH_SECTOR_4; //first sector for erase
|
|
||||||
// EraseInitStruct.NbSectors = 1;// num of sector that need to be erased
|
|
||||||
//
|
|
||||||
// HAL_FLASH_Unlock();
|
|
||||||
// HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// /* Wait for last operation to be completed */
|
|
||||||
// if(FLASH_WaitForLastOperation((uint32_t)50000U) == HAL_OK)
|
|
||||||
// {
|
|
||||||
// /* If the previous operation is completed, proceed to program the new data */
|
|
||||||
// CLEAR_BIT(FLASH->CR, FLASH_CR_PSIZE);
|
|
||||||
// FLASH->CR |= FLASH_PSIZE_WORD;
|
|
||||||
// FLASH->CR |= FLASH_CR_PG;
|
|
||||||
// *PROJSET_MEM = PROJSET; // save the new settings in mem
|
|
||||||
// }
|
|
||||||
// HAL_FLASH_Lock();
|
|
||||||
// UpdateSettings = 0;
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FillSettingsWithDefines(void)
|
|
||||||
{
|
|
||||||
// rewrite all setting corresponding to defines
|
|
||||||
|
|
||||||
//FLASH_EraseInitTypeDef EraseInitStruct;
|
|
||||||
//PageError = 0x00;
|
|
||||||
//
|
|
||||||
//EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages
|
|
||||||
//EraseInitStruct.Banks = FLASH_BANK_1;
|
|
||||||
//EraseInitStruct.Sector = FLASH_SECTOR_4; //first sector for erase
|
|
||||||
//EraseInitStruct.NbSectors = 1;// num of sector that need to be erased
|
|
||||||
//
|
|
||||||
//HAL_FLASH_Unlock();
|
|
||||||
//HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
|
|
||||||
//// MODBUS settings
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_DEVICE_ID, MODBUS_DEVICE_ID);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_SPEED, MODBUS_SPEED);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIOX, (uint32_t)MODBUS_GPIOX);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIO_PIN_RX, MODBUS_GPIO_PIN_RX);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_GPIO_PIN_TX, MODBUS_GPIO_PIN_TX);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_MAX_TIMEOUT, MODBUS_MAX_TIMEOUT);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->MB_TIM_AHB_FREQ, MODBUS_TIM_AHB_FREQ);
|
|
||||||
//
|
|
||||||
//// PWM settings
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM_TICKBASE, TIMER_PWM_TICKBASE);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM_AHB_FREQ, TIMER_PWM_AHB_FREQ);
|
|
||||||
//
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL1, TIMER_PWM1_TIM_CHANNEL1);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_TIM_CHANNEL2, TIMER_PWM1_TIM_CHANNEL2);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIOx, (uint32_t)TIMER_PWM1_GPIOx);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X1, TIMER_PWM1_GPIO_PIN_X1);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM1_GPIO_PIN_X2, TIMER_PWM1_GPIO_PIN_X2);
|
|
||||||
//
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_INSTANCE, (uint32_t)TIMER_PWM2_INSTANCE);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL1, TIMER_PWM2_TIM_CHANNEL1);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_TIM_CHANNEL2, TIMER_PWM2_TIM_CHANNEL2);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIOx, (uint32_t)TIMER_PWM2_GPIOx);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X1, TIMER_PWM2_GPIO_PIN_X1);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM2_GPIO_PIN_X2, TIMER_PWM2_GPIO_PIN_X2);
|
|
||||||
//
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_INSTANCE, (uint32_t)TIMER_PWM3_INSTANCE);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL1, TIMER_PWM3_TIM_CHANNEL1);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_TIM_CHANNEL2, TIMER_PWM3_TIM_CHANNEL2);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIOx, (uint32_t)TIMER_PWM3_GPIOx);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X1, TIMER_PWM3_GPIO_PIN_X1);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_PWM3_GPIO_PIN_X2, TIMER_PWM3_GPIO_PIN_X2);
|
|
||||||
//
|
|
||||||
//// CTRL settings
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_CTRL_TICKBASE, TIMER_CTRL_TICKBASE);
|
|
||||||
//FLASH_WRITE_SETTING(PROJSET_MEM->TIM_CTRL_AHB_FREQ, TIMER_CTRL_AHB_FREQ);
|
|
||||||
//HAL_FLASH_Lock();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void FillStructWithDefines(void)
|
|
||||||
{
|
|
||||||
// rewrite all setting corresponding to defines
|
|
||||||
|
|
||||||
|
|
||||||
// MODBUS settings
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.MB_DEVICE_ID, MODBUS_DEVICE_ID);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.MB_SPEED, MODBUS_SPEED);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.MB_GPIOX, MODBUS_GPIOX);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.MB_GPIO_PIN_RX, MODBUS_GPIO_PIN_RX);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.MB_GPIO_PIN_TX, MODBUS_GPIO_PIN_TX);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.MB_MAX_TIMEOUT, MODBUS_MAX_TIMEOUT);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.MB_TIM_AHB_FREQ, MODBUS_TIM_AHB_FREQ);
|
|
||||||
|
|
||||||
// PWM settings
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM_TICKBASE, TIMER_PWM_TICKBASE);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM_AHB_FREQ, TIMER_PWM_AHB_FREQ);
|
|
||||||
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_TIM_CHANNEL1, TIMER_PWM1_TIM_CHANNEL1);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_TIM_CHANNEL2, TIMER_PWM1_TIM_CHANNEL2);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_GPIOx, TIMER_PWM1_GPIOx);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_GPIO_PIN_X1, TIMER_PWM1_GPIO_PIN_X1);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM1_GPIO_PIN_X2, TIMER_PWM1_GPIO_PIN_X2);
|
|
||||||
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_INSTANCE, TIMER_PWM2_INSTANCE);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_TIM_CHANNEL1, TIMER_PWM2_TIM_CHANNEL1);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_TIM_CHANNEL2, TIMER_PWM2_TIM_CHANNEL2);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_GPIOx, TIMER_PWM2_GPIOx);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_GPIO_PIN_X1, TIMER_PWM2_GPIO_PIN_X1);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM2_GPIO_PIN_X2, TIMER_PWM2_GPIO_PIN_X2);
|
|
||||||
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_INSTANCE, TIMER_PWM3_INSTANCE);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_TIM_CHANNEL1, TIMER_PWM3_TIM_CHANNEL1);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_TIM_CHANNEL2, TIMER_PWM3_TIM_CHANNEL2);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_GPIOx, TIMER_PWM3_GPIOx);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_GPIO_PIN_X1, TIMER_PWM3_GPIO_PIN_X1);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_PWM3_GPIO_PIN_X2, TIMER_PWM3_GPIO_PIN_X2);
|
|
||||||
|
|
||||||
// CTRL settings
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_CTRL_TICKBASE, TIMER_CTRL_TICKBASE);
|
|
||||||
STRUCT_WRITE_SETTING(PROJSET.TIM_CTRL_AHB_FREQ, TIMER_CTRL_AHB_FREQ);
|
|
||||||
|
|
||||||
}
|
|
||||||
void CheckSettingsInFLASH(void)
|
|
||||||
{
|
|
||||||
//if(CheckIsSettingsValid(PROJSET_MEM))
|
|
||||||
// FillSettingsWithDefines();
|
|
||||||
//
|
|
||||||
//PROJSET = *PROJSET_MEM;
|
|
||||||
}
|
|
||||||
int CheckIsSettingsValid(ProjectSettings_TypeDef *set_struct)
|
|
||||||
{
|
|
||||||
// if some of setting are missing
|
|
||||||
// chech MODBUS
|
|
||||||
if((!IS_UART_BAUDRATE(set_struct->MB_SPEED) || (set_struct->MB_SPEED ) == 0) ||
|
|
||||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->MB_GPIOX)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->MB_GPIO_PIN_TX)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->MB_GPIO_PIN_RX)) ||
|
|
||||||
((set_struct->MB_TIM_AHB_FREQ) == 0))
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// chech control tim
|
|
||||||
if((set_struct->TIM_CTRL_AHB_FREQ) == 0)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
// chech PWM tims
|
|
||||||
if((set_struct->TIM_PWM_AHB_FREQ) == 0 ||
|
|
||||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIOx)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIO_PIN_X1)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM1_GPIO_PIN_X2)) ||
|
|
||||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM1_TIM_CHANNEL1)) ||
|
|
||||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM1_TIM_CHANNEL2)) ||
|
|
||||||
(!IS_TIM_INSTANCE((TIM_TypeDef *)set_struct->TIM_PWM2_INSTANCE)) ||
|
|
||||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIOx)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIO_PIN_X1)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM2_GPIO_PIN_X2)) ||
|
|
||||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM2_TIM_CHANNEL1)) ||
|
|
||||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM2_TIM_CHANNEL2)) ||
|
|
||||||
(!IS_TIM_INSTANCE((TIM_TypeDef *)set_struct->TIM_PWM3_INSTANCE)) ||
|
|
||||||
(!IS_GPIO_ALL_INSTANCE((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIOx)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIO_PIN_X1)) ||
|
|
||||||
(!IS_GPIO_PIN((GPIO_TypeDef *)set_struct->TIM_PWM3_GPIO_PIN_X2)) ||
|
|
||||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM3_TIM_CHANNEL1)) ||
|
|
||||||
(!IS_TIM_CHANNELS(set_struct->TIM_PWM3_TIM_CHANNEL2)))
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@ -1,151 +0,0 @@
|
|||||||
/********************************MODBUS*************************************
|
|
||||||
Данный файл содержит объявления базовых функции и дефайны для реализации
|
|
||||||
MODBUS.
|
|
||||||
Данный файл необходимо подключить в rs_message.h. После подключать rs_message.h
|
|
||||||
к основному проекту.
|
|
||||||
***************************************************************************/
|
|
||||||
#ifndef __PROJ_SETTINGS_H_
|
|
||||||
#define __PROJ_SETTINGS_H_
|
|
||||||
|
|
||||||
#include "stm32f4xx_hal.h"
|
|
||||||
//--------DEFINES FOR SETTING OF SETTINGS-----------
|
|
||||||
#define SETTINGS_FLASH_ADDRESS_SHIFT (0x10000)
|
|
||||||
#define SETTINGS_FLASH_ADDRESS (FLASH_BASE + SETTINGS_FLASH_ADDRESS_SHIFT)
|
|
||||||
|
|
||||||
#define EEPROM_BASE
|
|
||||||
#define SETTINGS_EEPROM_ADDRESS_SHIFT
|
|
||||||
#define SETTINGS_EEPROM_ADDRESS (EEPROM_BASE + SETTINGS_EEPROM_ADDRESS_SHIFT)
|
|
||||||
|
|
||||||
#ifdef USE_EEPROM
|
|
||||||
#define SETTINGS_ADDRESS SETTINGS_EEPROM_ADDRESS
|
|
||||||
#else // USE_EEPROM
|
|
||||||
#define SETTINGS_ADDRESS (SETTINGS_FLASH_ADDRESS)
|
|
||||||
#endif // USE_EEPROM
|
|
||||||
//--------------------------------------------------
|
|
||||||
//------------DEFINES FOR PWM SETTING---------------
|
|
||||||
// settings defines
|
|
||||||
#define HZ_TIMER_CTRL 400
|
|
||||||
#define HZ_TIMER_PWM 1000
|
|
||||||
|
|
||||||
|
|
||||||
// TIM PWM1 SETTINGS
|
|
||||||
#define PWM_MASTER_TIM_NUMB 4
|
|
||||||
#define TIMER_PWM_TICKBASE TIM_TickBase_1US
|
|
||||||
#define TIMER_PWM_AHB_FREQ 72
|
|
||||||
|
|
||||||
#define TIMER_PWM1_INSTANCE TIM4
|
|
||||||
#define TIMER_PWM1_TIM_CHANNEL1 TIM_CHANNEL_1
|
|
||||||
#define TIMER_PWM1_TIM_CHANNEL2 TIM_CHANNEL_2
|
|
||||||
#define TIMER_PWM1_GPIOx GPIOD
|
|
||||||
#define TIMER_PWM1_GPIO_PIN_X1 GPIO_PIN_12
|
|
||||||
#define TIMER_PWM1_GPIO_PIN_X2 GPIO_PIN_13
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TIM PWM2 SETTINGS
|
|
||||||
#define TIMER_PWM2_INSTANCE TIM3
|
|
||||||
#define TIMER_PWM2_TIM_CHANNEL1 TIM_CHANNEL_3
|
|
||||||
#define TIMER_PWM2_TIM_CHANNEL2 TIM_CHANNEL_4
|
|
||||||
#define TIMER_PWM2_GPIOx GPIOB
|
|
||||||
#define TIMER_PWM2_GPIO_PIN_X1 GPIO_PIN_0
|
|
||||||
#define TIMER_PWM2_GPIO_PIN_X2 GPIO_PIN_1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// TIM PWM3 SETTINGS
|
|
||||||
#define TIMER_PWM3_INSTANCE TIM1
|
|
||||||
#define TIMER_PWM3_TIM_CHANNEL1 TIM_CHANNEL_1
|
|
||||||
#define TIMER_PWM3_TIM_CHANNEL2 TIM_CHANNEL_2
|
|
||||||
#define TIMER_PWM3_GPIOx GPIOE
|
|
||||||
#define TIMER_PWM3_GPIO_PIN_X1 GPIO_PIN_9
|
|
||||||
#define TIMER_PWM3_GPIO_PIN_X2 GPIO_PIN_11
|
|
||||||
|
|
||||||
// TIM CTRL SETTINGS
|
|
||||||
#define TIMER_CTRL_TICKBASE TIM_TickBase_1US
|
|
||||||
#define TIMER_CTRL_AHB_FREQ 72
|
|
||||||
|
|
||||||
// PWM SETTINGS
|
|
||||||
#define SIN_TABLE_ORIGIN sin_table
|
|
||||||
#define SIN_TABLE_SIZE_MAX 1000
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
//----------DEFINES FOR MODBUS SETTING--------------
|
|
||||||
#define MODBUS_UART_NUMB 3 // number of used uart
|
|
||||||
#define MODBUS_SPEED 115200
|
|
||||||
#define MODBUS_GPIOX GPIOB
|
|
||||||
#define MODBUS_GPIO_PIN_RX GPIO_PIN_11
|
|
||||||
#define MODBUS_GPIO_PIN_TX GPIO_PIN_10
|
|
||||||
/* accord to this define sets define USED_MB_UART = USARTx */
|
|
||||||
#define MODBUS_TIM_NUMB 7 // number of used uart
|
|
||||||
#define MODBUS_TIM_AHB_FREQ 72
|
|
||||||
/* accord to this define sets define USED_MB_TIM = TIMx */
|
|
||||||
|
|
||||||
/* defines for modbus behaviour */
|
|
||||||
#define MODBUS_DEVICE_ID 1 // number of used uart
|
|
||||||
#define MODBUS_MAX_TIMEOUT 5000 // is ms
|
|
||||||
// custom define for size of receive message
|
|
||||||
//--------------------------------------------------
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
// ctrl periph settings
|
|
||||||
uint64_t TIM_CTRL_TICKBASE;
|
|
||||||
uint64_t TIM_CTRL_AHB_FREQ;
|
|
||||||
// pwm peripth settings
|
|
||||||
uint64_t TIM_PWM_TICKBASE;
|
|
||||||
uint64_t TIM_PWM_AHB_FREQ;
|
|
||||||
|
|
||||||
// uint64_t TIM_PWM1_INSTANCE;
|
|
||||||
uint64_t TIM_PWM1_TIM_CHANNEL1;
|
|
||||||
uint64_t TIM_PWM1_TIM_CHANNEL2;
|
|
||||||
uint64_t TIM_PWM1_GPIOx;
|
|
||||||
uint64_t TIM_PWM1_GPIO_PIN_X1;
|
|
||||||
uint64_t TIM_PWM1_GPIO_PIN_X2;
|
|
||||||
|
|
||||||
uint64_t TIM_PWM2_INSTANCE;
|
|
||||||
uint64_t TIM_PWM2_TIM_CHANNEL1;
|
|
||||||
uint64_t TIM_PWM2_TIM_CHANNEL2;
|
|
||||||
uint64_t TIM_PWM2_GPIOx;
|
|
||||||
uint64_t TIM_PWM2_GPIO_PIN_X1;
|
|
||||||
uint64_t TIM_PWM2_GPIO_PIN_X2;
|
|
||||||
|
|
||||||
uint64_t TIM_PWM3_INSTANCE;
|
|
||||||
uint64_t TIM_PWM3_TIM_CHANNEL1;
|
|
||||||
uint64_t TIM_PWM3_TIM_CHANNEL2;
|
|
||||||
uint64_t TIM_PWM3_GPIOx;
|
|
||||||
uint64_t TIM_PWM3_GPIO_PIN_X1;
|
|
||||||
uint64_t TIM_PWM3_GPIO_PIN_X2;
|
|
||||||
|
|
||||||
|
|
||||||
// modbus peripth settings
|
|
||||||
uint64_t MB_DEVICE_ID;
|
|
||||||
uint64_t MB_SPEED;
|
|
||||||
uint64_t MB_GPIOX;
|
|
||||||
uint64_t MB_GPIO_PIN_RX;
|
|
||||||
uint64_t MB_GPIO_PIN_TX;
|
|
||||||
uint64_t MB_MAX_TIMEOUT;
|
|
||||||
uint64_t MB_TIM_AHB_FREQ;
|
|
||||||
|
|
||||||
// uint32_t MB_UART_NUMB;
|
|
||||||
// uint32_t MB_TIM_NUMB;
|
|
||||||
}ProjectSettings_TypeDef;
|
|
||||||
extern ProjectSettings_TypeDef PROJSET;
|
|
||||||
|
|
||||||
//#define PROJSET_MEM ((ProjectSettings_TypeDef *)SETTINGS_ADDRESS)
|
|
||||||
|
|
||||||
|
|
||||||
//#define HAL_FLASH_GET_TYPEPROGRAM(_val_) (sizeof(PROJSET_MEM->MB_DEVICE_ID)/2 - 1)
|
|
||||||
#define HAL_FLASH_GET_TYPEPROGRAM(_val_) FLASH_TYPEPROGRAM_WORD
|
|
||||||
#define FLASH_WRITE_SETTING(_setting_, _val_) HAL_FLASH_Program(HAL_FLASH_GET_TYPEPROGRAM(_setting_), (uint32_t)(&_setting_), (uint32_t)_val_);
|
|
||||||
#define STRUCT_WRITE_SETTING(_setting_, _val_) (_setting_ = _val_)
|
|
||||||
|
|
||||||
|
|
||||||
void FillStructWithDefines(void);
|
|
||||||
void SetFlagUpdateSettingsInMem(void);
|
|
||||||
void UpdateSettingsInMem(void);
|
|
||||||
void WriteSettingsToMem(void);
|
|
||||||
void FillSettingsWithDefines(void);
|
|
||||||
void CheckSettingsInFLASH(void);
|
|
||||||
int CheckIsSettingsValid(ProjectSettings_TypeDef *set_struct);
|
|
||||||
|
|
||||||
#endif // __PROJ_SETTINGS_H_
|
|
||||||
@ -64,37 +64,86 @@ void SystemClock_Config(void);
|
|||||||
* И чтобы не реинициализировать периферию в прерывании, она реинится в main while(1).
|
* И чтобы не реинициализировать периферию в прерывании, она реинится в main while(1).
|
||||||
*/
|
*/
|
||||||
void Periph_reInit(void)
|
void Periph_reInit(void)
|
||||||
{
|
{
|
||||||
// wait for reinit modbus coil (requested by modbus interrupt)
|
unsigned UpdatePWMTIM = 0;
|
||||||
if(MB_Read_Coil_Global(COIL_UART_CTRL_GLOBAL, NULL) && hmodbus1.fTX_Done)
|
unsigned UpdateLog = 0;
|
||||||
|
|
||||||
|
// if (sin3Phase)
|
||||||
|
// coils_regs[0]=0xc;
|
||||||
|
//////////////вкл/выкл 74AC08//////////
|
||||||
|
if ((GPIOC->IDR & (1 << 1)) == 0)
|
||||||
|
GPIOC->ODR &= ~(1 << 0);
|
||||||
|
else
|
||||||
|
GPIOC->ODR |= (1 << 0);
|
||||||
|
///////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
// wait for reinit modbus coil (requested by modbus interrupt)
|
||||||
|
if (MB_Read_Coil_Global(COIL_UART_CTRL_GLOBAL, NULL) && hmodbus1.fTX_Done)
|
||||||
{
|
{
|
||||||
MB_Write_Coil_Global(COIL_UART_CTRL_GLOBAL, RESET_COIL);
|
MB_Write_Coil_Global(COIL_UART_CTRL_GLOBAL, RESET_COIL);
|
||||||
modbus1_suart.huart.Init.BaudRate = uart_ctrl[R_UART_CTRL_SPEED];
|
modbus1_suart.huart.Init.BaudRate = uart_ctrl[R_UART_CTRL_SPEED];
|
||||||
RS_ReInit_UART(&hmodbus1 ,&modbus1_suart);
|
RS_ReInit_UART(&hmodbus1, &modbus1_suart);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fait for reinit log timer (requested by modbus interrupt)
|
// fait for reinit log timer (requested by modbus interrupt)
|
||||||
if((TIM_CTRL.sTimFreqHz != log_ctrl[R_LOG_CTRL_LOG_HZ]) && (log_ctrl[R_LOG_CTRL_LOG_HZ] != 0))
|
if ((TIM_CTRL.sTimFreqHz != log_ctrl[R_LOG_CTRL_LOG_HZ]) && (log_ctrl[R_LOG_CTRL_LOG_HZ] != 0))
|
||||||
{
|
{
|
||||||
TIM_CTRL.sTimFreqHz = log_ctrl[R_LOG_CTRL_LOG_HZ];
|
TIM_CTRL.sTimFreqHz = log_ctrl[R_LOG_CTRL_LOG_HZ];
|
||||||
// clear logs params
|
// update logs params
|
||||||
Set_Log_Params();
|
UpdateLog = 1;
|
||||||
TIM_Base_MspDeInit(&TIM_CTRL.htim);
|
TIM_Base_MspDeInit(&TIM_CTRL.htim);
|
||||||
Control_Timer_ReInit(&TIM_CTRL);
|
Control_Timer_ReInit(&TIM_CTRL);
|
||||||
|
// hpwm_a.hramp[PWM_RampSineHz_Ind].SampleT = 1.0f/TIM_CTRL.sTimFreqHz;
|
||||||
|
// hpwm_a.hramp[PWM_RampPWMDuty_Ind].SampleT = 1.0f/TIM_CTRL.sTimFreqHz;
|
||||||
}
|
}
|
||||||
|
|
||||||
// READ TIM_PWM_HZ
|
// READ TIM_PWM_HZ
|
||||||
if(hpwm1.stim.sTimFreqHz != pwm_ctrl[R_PWM_CTRL_PWM_HZ])
|
if (hpwm_a.stim.sTimFreqHz != pwm_ctrl[R_PWM_CTRL_PWM_HZ])
|
||||||
{
|
{
|
||||||
hpwm1.stim.sTimFreqHz = pwm_ctrl[R_PWM_CTRL_PWM_HZ];
|
hpwm_a.stim.sTimFreqHz = pwm_ctrl[R_PWM_CTRL_PWM_HZ];
|
||||||
pwm_ctrl[R_PWM_CTRL_PWM_HZ] = hpwm1.stim.sTimFreqHz;
|
pwm_ctrl[R_PWM_CTRL_PWM_HZ] = hpwm_a.stim.sTimFreqHz;
|
||||||
|
|
||||||
|
// update tim
|
||||||
|
UpdatePWMTIM = 1;
|
||||||
// update logs params
|
// update logs params
|
||||||
Set_Log_Params();
|
UpdateLog = 1;
|
||||||
// reinit tim
|
|
||||||
PWM_Sine_ReInit(&hpwm1);
|
|
||||||
PWM_SlavePhase_reInit(&hpwm2);
|
|
||||||
PWM_SlavePhase_reInit(&hpwm3);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// READ TICKBASE_PRESCALER
|
||||||
|
if (hpwm_a.stim.sTickBasePrescaler != pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER])
|
||||||
|
{
|
||||||
|
if ((hpwm_a.stim.sTickBasePrescaler > 1) ||
|
||||||
|
(pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER] > 1))
|
||||||
|
{
|
||||||
|
hpwm_a.stim.sTickBasePrescaler = pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER];
|
||||||
|
pwm_ctrl[R_PWM_CTRL_TICKBASE_PRESCALER] = hpwm_a.stim.sTickBasePrescaler;
|
||||||
|
|
||||||
|
// update tim
|
||||||
|
UpdatePWMTIM = 1;
|
||||||
|
// update logs params
|
||||||
|
UpdateLog = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UPDATE LOG PARAMS
|
||||||
|
if (UpdateLog)
|
||||||
|
{
|
||||||
|
// set logs params
|
||||||
|
Set_Log_Params();
|
||||||
|
}
|
||||||
|
|
||||||
|
// UPDATE PWM TIM PARAMS
|
||||||
|
if (UpdatePWMTIM)
|
||||||
|
{
|
||||||
|
// reinit tims
|
||||||
|
PWM_Sine_ReInit(&hpwm_a);
|
||||||
|
|
||||||
|
// UPDATE DUTY TABLE SCALE
|
||||||
|
PWM_Update_Params(&hpwm_a);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE END 0 */
|
/* USER CODE END 0 */
|
||||||
@ -138,25 +187,28 @@ int main(void)
|
|||||||
|
|
||||||
/* Infinite loop */
|
/* Infinite loop */
|
||||||
/* USER CODE BEGIN WHILE */
|
/* USER CODE BEGIN WHILE */
|
||||||
|
|
||||||
// init params for pwm and log
|
// init params for pwm and log
|
||||||
pwm_ctrl[R_PWM_CTRL_PWM_VALUE] = 2560;
|
pwm_ctrl[R_PWM_CTRL_PWM_SINE_HZ] = 10000;
|
||||||
pwm_ctrl[R_PWM_CTRL_PWM_HZ] = HZ_TIMER_PWM;
|
pwm_ctrl[R_PWM_CTRL_DUTY_BRIDGE] = 10000;//HZ_TIMER_PWM;
|
||||||
pwm_ctrl[R_PWM_CTRL_MIN_PULSE_DUR] = 30;
|
pwm_ctrl[R_PWM_CTRL_PWM_HZ] = 200;//HZ_TIMER_PWM;
|
||||||
pwm_ctrl[R_PWM_CTRL_DEAD_TIME] = 1;
|
pwm_ctrl[R_PWM_CTRL_MAX_PULSE_DUR] = 0;
|
||||||
pwm_ctrl[R_PWM_CTRL_SIN_TABLE_SIZE] = SIN_TABLE_SIZE_MAX;
|
pwm_ctrl[R_PWM_CTRL_MIN_PULSE_DUR] = 0;
|
||||||
//MB_Write_Coil_Global(COIL_PWM_DC_MODE_GLOBAL, SET_COIL);
|
pwm_ctrl[R_PWM_CTRL_DEAD_TIME] = 100;
|
||||||
MB_Write_Coil_Global(COIL_PWM_CH_MODE_GLOBAL, SET_COIL);
|
pwm_ctrl[R_PWM_CTRL_SIN_TABLE_SIZE] = SIN_TABLE_SIZE_MAX;
|
||||||
MB_Write_Coil_Global(COIL_PWM_PHASE_MODE_GLOBAL, SET_COIL);
|
MB_Write_Coil_Global(COIL_PWM_PHASE_MODE_GLOBAL, SET_COIL);
|
||||||
|
MB_Write_Coil_Global(COIL_PWM_BRIDGE_MODE_GLOBAL, SET_COIL);
|
||||||
log_ctrl[R_LOG_CTRL_LOG_HZ] = HZ_TIMER_CTRL;
|
MB_Write_Coil_Global(COIL_PWM_DC_MODE_GLOBAL, SET_COIL);
|
||||||
log_ctrl[R_LOG_CTRL_LOG_SIZE] = 50;
|
|
||||||
log_ctrl[R_LOG_CTRL_LOG_PWM_NUMB] = 3;
|
log_ctrl[R_LOG_CTRL_LOG_HZ] = HZ_TIMER_CTRL;
|
||||||
|
log_ctrl[R_LOG_CTRL_LOG_SIZE] = 50;
|
||||||
WriteSettingsToMem();
|
log_ctrl[R_LOG_CTRL_LOG_PWM_NUMB] = 3;
|
||||||
MODBUS_FirstInit();
|
|
||||||
Control_Timer_FirstInit();
|
CheckSettingsInFLASH();
|
||||||
PWM_Sine_FirstInit();
|
//EncoderFirstInit();
|
||||||
|
MODBUS_FirstInit();
|
||||||
|
Control_Timer_FirstInit();
|
||||||
|
PWM_Sine_FirstInit();
|
||||||
|
|
||||||
//---------------TEST MODBUS------------------
|
//---------------TEST MODBUS------------------
|
||||||
// MODBUS_Transmit_IT(&hmodbus1, &MODBUS_MSG);
|
// MODBUS_Transmit_IT(&hmodbus1, &MODBUS_MSG);
|
||||||
@ -179,48 +231,14 @@ int main(void)
|
|||||||
*/
|
*/
|
||||||
void SystemClock_Config(void)
|
void SystemClock_Config(void)
|
||||||
{
|
{
|
||||||
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
|
|
||||||
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
|
|
||||||
|
|
||||||
/** Configure the main internal regulator output voltage
|
|
||||||
*/
|
|
||||||
__HAL_RCC_PWR_CLK_ENABLE();
|
|
||||||
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
|
|
||||||
|
|
||||||
/** Initializes the RCC Oscillators according to the specified parameters
|
|
||||||
* in the RCC_OscInitTypeDef structure.
|
|
||||||
*/
|
|
||||||
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
|
|
||||||
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
|
||||||
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
|
|
||||||
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
|
||||||
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
|
|
||||||
RCC_OscInitStruct.PLL.PLLM = 8;
|
|
||||||
RCC_OscInitStruct.PLL.PLLN = 72;
|
|
||||||
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
|
|
||||||
RCC_OscInitStruct.PLL.PLLQ = 4;
|
|
||||||
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
|
|
||||||
{
|
|
||||||
Error_Handler();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Initializes the CPU, AHB and APB buses clocks
|
|
||||||
*/
|
|
||||||
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|
|
||||||
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
|
|
||||||
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
|
||||||
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
|
||||||
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
|
||||||
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
|
||||||
|
|
||||||
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
|
|
||||||
{
|
|
||||||
Error_Handler();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 4 */
|
/* USER CODE BEGIN 4 */
|
||||||
|
HAL_StatusTypeDef HAL_FLASH_Unlock() {}
|
||||||
|
HAL_StatusTypeDef HAL_FLASH_Lock() {}
|
||||||
|
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data) {}
|
||||||
|
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef* pEraseInit, uint32_t* SectorError) {}
|
||||||
|
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout) {}
|
||||||
/* USER CODE END 4 */
|
/* USER CODE END 4 */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1,10 +0,0 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
|
|
||||||
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
|
|
||||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
|
||||||
<security>
|
|
||||||
<requestedPrivileges>
|
|
||||||
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
|
|
||||||
</requestedPrivileges>
|
|
||||||
</security>
|
|
||||||
</trustInfo>
|
|
||||||
</assembly>
|
|
||||||
@ -26,7 +26,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "arm_math.h"
|
#include "controller_functions.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup PID
|
* @addtogroup PID
|
||||||
|
|||||||
@ -26,7 +26,7 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "arm_math.h"
|
#include "controller_functions.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup PID
|
* @addtogroup PID
|
||||||
|
|||||||
@ -81,10 +81,6 @@ MSVC.
|
|||||||
#define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr)))
|
#define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __ALIGNED
|
|
||||||
#define __ALIGNED(x) __attribute__((aligned(x)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef __RESTRICT
|
#ifndef __RESTRICT
|
||||||
#define __RESTRICT __restrict
|
#define __RESTRICT __restrict
|
||||||
#endif
|
#endif
|
||||||
@ -165,14 +161,14 @@ MSVC.
|
|||||||
#define __REVSH(value) value
|
#define __REVSH(value) value
|
||||||
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
\brief Rotate Right in unsigned value (32 bit)
|
// \brief Rotate Right in unsigned value (32 bit)
|
||||||
\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
// \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
||||||
\param [in] op1 Value to rotate
|
// \param [in] op1 Value to rotate
|
||||||
\param [in] op2 Number of Bits to rotate
|
// \param [in] op2 Number of Bits to rotate
|
||||||
\return Rotated value
|
// \return Rotated value
|
||||||
*/
|
// */
|
||||||
#define __ROR()
|
//#define __ROR()
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -191,15 +187,15 @@ MSVC.
|
|||||||
\param [in] value Value to reverse
|
\param [in] value Value to reverse
|
||||||
\return Reversed value
|
\return Reversed value
|
||||||
*/
|
*/
|
||||||
#define __RBIT() _byteswap_ulong(_rotr(value, 16))
|
#define __RBIT(value) _byteswap_ulong(_rotr(value, 16))
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
\brief Count leading zeros
|
// \brief Count leading zeros
|
||||||
\details Counts the number of leading zeros of a data value.
|
// \details Counts the number of leading zeros of a data value.
|
||||||
\param [in] value Value to count the leading zeros
|
// \param [in] value Value to count the leading zeros
|
||||||
\return number of leading zeros in value
|
// \return number of leading zeros in value
|
||||||
*/
|
// */
|
||||||
#define __CLZ() __lzcnt(value)
|
//#define __CLZ(value) __lzcnt(value)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -270,22 +266,22 @@ MSVC.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
\brief Signed Saturate
|
// \brief Signed Saturate
|
||||||
\details Saturates a signed value.
|
// \details Saturates a signed value.
|
||||||
\param [in] value Value to be saturated
|
// \param [in] value Value to be saturated
|
||||||
\param [in] sat Bit position to saturate to (1..32)
|
// \param [in] sat Bit position to saturate to (1..32)
|
||||||
\return Saturated value
|
// \return Saturated value
|
||||||
*/
|
// */
|
||||||
#define __SSAT
|
//#define __SSAT
|
||||||
|
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
\brief Unsigned Saturate
|
// \brief Unsigned Saturate
|
||||||
\details Saturates an unsigned value.
|
// \details Saturates an unsigned value.
|
||||||
\param [in] value Value to be saturated
|
// \param [in] value Value to be saturated
|
||||||
\param [in] sat Bit position to saturate to (0..31)
|
// \param [in] sat Bit position to saturate to (0..31)
|
||||||
\return Saturated value
|
// \return Saturated value
|
||||||
*/
|
// */
|
||||||
#define __USAT
|
//#define __USAT
|
||||||
|
|
||||||
|
|||||||
@ -11,38 +11,38 @@
|
|||||||
#define __stdint_h
|
#define __stdint_h
|
||||||
#define __ARMCLIB_VERSION 6190004
|
#define __ARMCLIB_VERSION 6190004
|
||||||
|
|
||||||
#ifdef __INT64_TYPE__
|
#ifdef __INT64_TYPE__
|
||||||
/* armclang predefines '__INT64_TYPE__' and '__INT64_C_SUFFIX__' */
|
/* armclang predefines '__INT64_TYPE__' and '__INT64_C_SUFFIX__' */
|
||||||
#define __INT64 __INT64_TYPE__
|
#define __INT64 __INT64_TYPE__
|
||||||
#else
|
#else
|
||||||
/* armcc has builtin '__int64' which can be used in --strict mode */
|
/* armcc has builtin '__int64' which can be used in --strict mode */
|
||||||
#define __INT64 __int64
|
#define __INT64 __int64
|
||||||
#define __INT64_C_SUFFIX__ ll
|
#define __INT64_C_SUFFIX__ ll
|
||||||
#endif
|
#endif
|
||||||
#define __PASTE2(x, y) x ## y
|
#define __PASTE2(x, y) x ## y
|
||||||
#define __PASTE(x, y) __PASTE2(x, y)
|
#define __PASTE(x, y) __PASTE2(x, y)
|
||||||
#define __INT64_C(x) __ESCAPE__(__PASTE(x, __INT64_C_SUFFIX__))
|
#define __INT64_C(x) __ESCAPE__(__PASTE(x, __INT64_C_SUFFIX__))
|
||||||
#define __UINT64_C(x) __ESCAPE__(__PASTE(x ## u, __INT64_C_SUFFIX__))
|
#define __UINT64_C(x) __ESCAPE__(__PASTE(x ## u, __INT64_C_SUFFIX__))
|
||||||
#if defined(__clang__) || (defined(__ARMCC_VERSION) && !defined(__STRICT_ANSI__))
|
#if defined(__clang__) || (defined(__ARMCC_VERSION) && !defined(__STRICT_ANSI__))
|
||||||
/* armclang and non-strict armcc allow 'long long' in system headers */
|
/* armclang and non-strict armcc allow 'long long' in system headers */
|
||||||
#define __LONGLONG long long
|
#define __LONGLONG long long
|
||||||
#else
|
#else
|
||||||
/* strict armcc has '__int64' */
|
/* strict armcc has '__int64' */
|
||||||
#define __LONGLONG __int64
|
#define __LONGLONG __int64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __STDINT_DECLS
|
#ifndef __STDINT_DECLS
|
||||||
#define __STDINT_DECLS
|
#define __STDINT_DECLS
|
||||||
|
|
||||||
#undef __CLIBNS
|
#undef __CLIBNS
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
namespace std {
|
namespace std {
|
||||||
#define __CLIBNS std::
|
#define __CLIBNS std::
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#else
|
#else
|
||||||
#define __CLIBNS
|
#define __CLIBNS
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -50,51 +50,50 @@ namespace std {
|
|||||||
* the typedef is used to declare a bitfield.
|
* the typedef is used to declare a bitfield.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* 7.18.1.1 */
|
/* 7.18.1.1 */
|
||||||
|
|
||||||
/* exact-width signed integer types */
|
/* exact-width signed integer types */
|
||||||
typedef signed char int8_t;
|
typedef signed char int8_t;
|
||||||
typedef signed short int int16_t;
|
typedef signed short int int16_t;
|
||||||
typedef signed int int32_t;
|
typedef signed int int32_t;
|
||||||
typedef signed __INT64 int64_t;
|
typedef signed __INT64 int64_t;
|
||||||
|
|
||||||
/* exact-width unsigned integer types */
|
/* exact-width unsigned integer types */
|
||||||
typedef unsigned char uint8_t;
|
typedef unsigned char uint8_t;
|
||||||
typedef unsigned short int uint16_t;
|
typedef unsigned short int uint16_t;
|
||||||
typedef unsigned int uint32_t;
|
typedef unsigned int uint32_t;
|
||||||
typedef unsigned __INT64 uint64_t;
|
typedef unsigned __INT64 uint64_t;
|
||||||
|
|
||||||
/* 7.18.1.2 */
|
/* 7.18.1.2 */
|
||||||
|
|
||||||
/* smallest type of at least n bits */
|
/* smallest type of at least n bits */
|
||||||
/* minimum-width signed integer types */
|
/* minimum-width signed integer types */
|
||||||
typedef signed char int_least8_t;
|
typedef signed char int_least8_t;
|
||||||
typedef signed short int int_least16_t;
|
typedef signed short int int_least16_t;
|
||||||
typedef signed int int_least32_t;
|
typedef signed int int_least32_t;
|
||||||
typedef signed __INT64 int_least64_t;
|
typedef signed __INT64 int_least64_t;
|
||||||
|
|
||||||
/* minimum-width unsigned integer types */
|
/* minimum-width unsigned integer types */
|
||||||
typedef unsigned char uint_least8_t;
|
typedef unsigned char uint_least8_t;
|
||||||
typedef unsigned short int uint_least16_t;
|
typedef unsigned short int uint_least16_t;
|
||||||
typedef unsigned int uint_least32_t;
|
typedef unsigned int uint_least32_t;
|
||||||
typedef unsigned __INT64 uint_least64_t;
|
typedef unsigned __INT64 uint_least64_t;
|
||||||
|
|
||||||
/* 7.18.1.3 */
|
/* 7.18.1.3 */
|
||||||
|
|
||||||
/* fastest minimum-width signed integer types */
|
/* fastest minimum-width signed integer types */
|
||||||
typedef signed int int_fast8_t;
|
typedef signed int int_fast8_t;
|
||||||
typedef signed int int_fast16_t;
|
typedef signed int int_fast16_t;
|
||||||
typedef signed int int_fast32_t;
|
typedef signed int int_fast32_t;
|
||||||
typedef signed __INT64 int_fast64_t;
|
typedef signed __INT64 int_fast64_t;
|
||||||
|
|
||||||
/* fastest minimum-width unsigned integer types */
|
/* fastest minimum-width unsigned integer types */
|
||||||
typedef unsigned int uint_fast8_t;
|
typedef unsigned int uint_fast8_t;
|
||||||
typedef unsigned int uint_fast16_t;
|
typedef unsigned int uint_fast16_t;
|
||||||
typedef unsigned int uint_fast32_t;
|
typedef unsigned int uint_fast32_t;
|
||||||
typedef unsigned __INT64 uint_fast64_t;
|
typedef unsigned __INT64 uint_fast64_t;
|
||||||
|
|
||||||
/* 7.18.1.4 integer types capable of holding object pointers */
|
/* 7.18.1.4 integer types capable of holding object pointers */
|
||||||
|
|
||||||
#if __sizeof_ptr == 8
|
#if __sizeof_ptr == 8
|
||||||
typedef signed __INT64 intptr_t;
|
typedef signed __INT64 intptr_t;
|
||||||
typedef unsigned __INT64 uintptr_t;
|
typedef unsigned __INT64 uintptr_t;
|
||||||
@ -103,16 +102,16 @@ typedef signed int intptr_t;
|
|||||||
typedef unsigned int uintptr_t;
|
typedef unsigned int uintptr_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* 7.18.1.5 greatest-width integer types */
|
/* 7.18.1.5 greatest-width integer types */
|
||||||
typedef signed __LONGLONG intmax_t;
|
typedef signed __LONGLONG intmax_t;
|
||||||
typedef unsigned __LONGLONG uintmax_t;
|
typedef unsigned __LONGLONG uintmax_t;
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__cplusplus) || defined(__USE_C99_ALL) || 201103L <= __cplusplus || defined(__STDC_LIMIT_MACROS)
|
#if !defined(__cplusplus) || defined(__USE_C99_ALL) || 201103L <= __cplusplus || defined(__STDC_LIMIT_MACROS)
|
||||||
|
|
||||||
/* 7.18.2.1 */
|
/* 7.18.2.1 */
|
||||||
|
|
||||||
/* minimum values of exact-width signed integer types */
|
/* minimum values of exact-width signed integer types */
|
||||||
#define INT8_MIN -128
|
#define INT8_MIN -128
|
||||||
#define INT16_MIN -32768
|
#define INT16_MIN -32768
|
||||||
#define INT32_MIN (~0x7fffffff) /* -2147483648 is unsigned */
|
#define INT32_MIN (~0x7fffffff) /* -2147483648 is unsigned */
|
||||||
@ -233,14 +232,14 @@ typedef unsigned __LONGLONG uintmax_t;
|
|||||||
#undef WCHAR_MAX
|
#undef WCHAR_MAX
|
||||||
|
|
||||||
#if defined(__WCHAR32) || (defined(__ARM_SIZEOF_WCHAR_T) && __ARM_SIZEOF_WCHAR_T == 4)
|
#if defined(__WCHAR32) || (defined(__ARM_SIZEOF_WCHAR_T) && __ARM_SIZEOF_WCHAR_T == 4)
|
||||||
#define WCHAR_MIN 0
|
#define WCHAR_MIN 0
|
||||||
#define WCHAR_MAX 0xffffffffU
|
#define WCHAR_MAX 0xffffffffU
|
||||||
#else
|
#else
|
||||||
#define WCHAR_MIN 0
|
#define WCHAR_MIN 0
|
||||||
#define WCHAR_MAX 65535
|
#define WCHAR_MAX 65535
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* limits of wint_t */
|
/* limits of wint_t */
|
||||||
#define WINT_MIN (~0x7fffffff)
|
#define WINT_MIN (~0x7fffffff)
|
||||||
#define WINT_MAX 2147483647
|
#define WINT_MAX 2147483647
|
||||||
|
|
||||||
@ -265,44 +264,44 @@ typedef unsigned __LONGLONG uintmax_t;
|
|||||||
|
|
||||||
#endif /* __STDC_CONSTANT_MACROS */
|
#endif /* __STDC_CONSTANT_MACROS */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
} /* namespace std */
|
} /* namespace std */
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
#endif /* __STDINT_DECLS */
|
#endif /* __STDINT_DECLS */
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#ifndef __STDINT_NO_EXPORTS
|
#ifndef __STDINT_NO_EXPORTS
|
||||||
using ::std::int8_t;
|
using ::std::int8_t;
|
||||||
using ::std::int16_t;
|
using ::std::int16_t;
|
||||||
using ::std::int32_t;
|
using ::std::int32_t;
|
||||||
using ::std::int64_t;
|
using ::std::int64_t;
|
||||||
using ::std::uint8_t;
|
using ::std::uint8_t;
|
||||||
using ::std::uint16_t;
|
using ::std::uint16_t;
|
||||||
using ::std::uint32_t;
|
using ::std::uint32_t;
|
||||||
using ::std::uint64_t;
|
using ::std::uint64_t;
|
||||||
using ::std::int_least8_t;
|
using ::std::int_least8_t;
|
||||||
using ::std::int_least16_t;
|
using ::std::int_least16_t;
|
||||||
using ::std::int_least32_t;
|
using ::std::int_least32_t;
|
||||||
using ::std::int_least64_t;
|
using ::std::int_least64_t;
|
||||||
using ::std::uint_least8_t;
|
using ::std::uint_least8_t;
|
||||||
using ::std::uint_least16_t;
|
using ::std::uint_least16_t;
|
||||||
using ::std::uint_least32_t;
|
using ::std::uint_least32_t;
|
||||||
using ::std::uint_least64_t;
|
using ::std::uint_least64_t;
|
||||||
using ::std::int_fast8_t;
|
using ::std::int_fast8_t;
|
||||||
using ::std::int_fast16_t;
|
using ::std::int_fast16_t;
|
||||||
using ::std::int_fast32_t;
|
using ::std::int_fast32_t;
|
||||||
using ::std::int_fast64_t;
|
using ::std::int_fast64_t;
|
||||||
using ::std::uint_fast8_t;
|
using ::std::uint_fast8_t;
|
||||||
using ::std::uint_fast16_t;
|
using ::std::uint_fast16_t;
|
||||||
using ::std::uint_fast32_t;
|
using ::std::uint_fast32_t;
|
||||||
using ::std::uint_fast64_t;
|
using ::std::uint_fast64_t;
|
||||||
using ::std::intptr_t;
|
using ::std::intptr_t;
|
||||||
using ::std::uintptr_t;
|
using ::std::uintptr_t;
|
||||||
using ::std::intmax_t;
|
using ::std::intmax_t;
|
||||||
using ::std::uintmax_t;
|
using ::std::uintmax_t;
|
||||||
#endif
|
#endif
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#undef __INT64
|
#undef __INT64
|
||||||
#undef __LONGLONG
|
#undef __LONGLONG
|
||||||
|
|||||||
@ -250,28 +250,28 @@ __weak void HAL_MspDeInit(void)
|
|||||||
* @param TickPriority Tick interrupt priority.
|
* @param TickPriority Tick interrupt priority.
|
||||||
* @retval HAL status
|
* @retval HAL status
|
||||||
*/
|
*/
|
||||||
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
//__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
||||||
{
|
//{
|
||||||
/* Configure the SysTick to have interrupt in 1ms time basis*/
|
// /* Configure the SysTick to have interrupt in 1ms time basis*/
|
||||||
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
|
// if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
|
||||||
{
|
// {
|
||||||
return HAL_ERROR;
|
// return HAL_ERROR;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/* Configure the SysTick IRQ priority */
|
// /* Configure the SysTick IRQ priority */
|
||||||
if (TickPriority < (1UL << __NVIC_PRIO_BITS))
|
// if (TickPriority < (1UL << __NVIC_PRIO_BITS))
|
||||||
{
|
// {
|
||||||
HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
|
// HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U);
|
||||||
uwTickPrio = TickPriority;
|
// uwTickPrio = TickPriority;
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
return HAL_ERROR;
|
// return HAL_ERROR;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/* Return function status */
|
// /* Return function status */
|
||||||
return HAL_OK;
|
// return HAL_OK;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
@ -412,11 +412,11 @@ __weak void HAL_Delay(uint32_t Delay)
|
|||||||
* implementations in user file.
|
* implementations in user file.
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
__weak void HAL_SuspendTick(void)
|
//__weak void HAL_SuspendTick(void)
|
||||||
{
|
//{
|
||||||
/* Disable SysTick Interrupt */
|
// /* Disable SysTick Interrupt */
|
||||||
SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
|
// SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Resume Tick increment.
|
* @brief Resume Tick increment.
|
||||||
@ -428,11 +428,11 @@ __weak void HAL_SuspendTick(void)
|
|||||||
* implementations in user file.
|
* implementations in user file.
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
__weak void HAL_ResumeTick(void)
|
//__weak void HAL_ResumeTick(void)
|
||||||
{
|
//{
|
||||||
/* Enable SysTick Interrupt */
|
// /* Enable SysTick Interrupt */
|
||||||
SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
|
// SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;
|
||||||
}
|
//}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns the HAL revision
|
* @brief Returns the HAL revision
|
||||||
|
|||||||
@ -651,6 +651,8 @@ void TIM1_TRG_COM_TIM11_IRQHandler(void) {}
|
|||||||
#endif
|
#endif
|
||||||
#ifndef USE_TIM8_BRK_TIM12_HANDLER
|
#ifndef USE_TIM8_BRK_TIM12_HANDLER
|
||||||
void TIM8_BRK_TIM12_IRQHandler(void) {}
|
void TIM8_BRK_TIM12_IRQHandler(void) {}
|
||||||
|
//#else
|
||||||
|
//extern void TIM8_BRK_TIM12_IRQHandler(void);
|
||||||
#endif
|
#endif
|
||||||
#ifndef USE_TIM8_TRG_COM_TIM14_HANDLER
|
#ifndef USE_TIM8_TRG_COM_TIM14_HANDLER
|
||||||
void TIM8_TRG_COM_TIM14_IRQHandler(void) {}
|
void TIM8_TRG_COM_TIM14_IRQHandler(void) {}
|
||||||
|
|||||||
@ -67,12 +67,12 @@
|
|||||||
#define USE_TIM4_HANDLER
|
#define USE_TIM4_HANDLER
|
||||||
//#define USE_TIM5_HANDLER
|
//#define USE_TIM5_HANDLER
|
||||||
//#define USE_TIM6_HANDLER
|
//#define USE_TIM6_HANDLER
|
||||||
//#define USE_TIM7_HANDLER
|
#define USE_TIM7_HANDLER
|
||||||
//#define USE_TIM8_UP_TIM13_HANDLER
|
#define USE_TIM8_UP_TIM13_HANDLER
|
||||||
//#define USE_TIM1_BRK_TIM9_HANDLER
|
//#define USE_TIM1_BRK_TIM9_HANDLER
|
||||||
//#define USE_TIM1_TRG_COM_TIM11_HANDLER
|
//#define USE_TIM1_TRG_COM_TIM11_HANDLER
|
||||||
#define USE_TIM8_BRK_TIM12_HANDLER
|
//#define USE_TIM8_BRK_TIM12_HANDLER
|
||||||
//#define USE_TIM8_TRG_COM_TIM14_HANDLER
|
#define USE_TIM8_TRG_COM_TIM14_HANDLER
|
||||||
|
|
||||||
|
|
||||||
/** SIMULATOR_CONF
|
/** SIMULATOR_CONF
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
set defines=-D"STM32F407xx" -D"USE_HAL_DRIVER"^
|
set defines=-D"STM32F407xx" -D"USE_HAL_DRIVER"^
|
||||||
-D"MATLAB"^
|
-D"MATLAB"^
|
||||||
-D"ARM_MATH_CM4"^
|
|
||||||
-D"__sizeof_ptr=8"
|
-D"__sizeof_ptr=8"
|
||||||
:: -------------------------USERS PATHS AND CODE---------------------------
|
:: -------------------------USERS PATHS AND CODE---------------------------
|
||||||
:: заголовочные файлы (не добавлять CMSIS и HAL, они добавлены ниже)
|
:: заголовочные файлы (не добавлять CMSIS и HAL, они добавлены ниже)
|
||||||
@ -10,13 +9,15 @@ set includes_USER= -I"..\pwm_tools\Core\Inc" -I"..\pwm_tools\Core\GENERAL"^
|
|||||||
-I"..\pwm_tools\Core\Modbus" -I"..\pwm_tools\Core\PWM"
|
-I"..\pwm_tools\Core\Modbus" -I"..\pwm_tools\Core\PWM"
|
||||||
|
|
||||||
:: Пользовательский код программы УПП
|
:: Пользовательский код программы УПП
|
||||||
set code_USER=..\pwm_tools\Core\PWM\pwm.c^
|
set code_USER=.\App_Wrapper\main.c^
|
||||||
..\pwm_tools\Core\PWM\control.c^
|
|
||||||
..\pwm_tools\Core\Src\main.c^
|
|
||||||
..\pwm_tools\Core\Src\gpio.c^
|
..\pwm_tools\Core\Src\gpio.c^
|
||||||
..\pwm_tools\Core\Src\stm32f4xx_hal_msp.c^
|
..\pwm_tools\Core\Src\stm32f4xx_hal_msp.c^
|
||||||
..\pwm_tools\Core\Src\stm32f4xx_it.c^
|
..\pwm_tools\Core\Src\stm32f4xx_it.c^
|
||||||
..\pwm_tools\Core\Src\system_stm32f4xx.c^
|
..\pwm_tools\Core\Src\system_stm32f4xx.c^
|
||||||
|
..\pwm_tools\Core\Src\stm32f4xx_hal_timebase_tim.c^
|
||||||
|
..\pwm_tools\Core\PWM\pwm.c^
|
||||||
|
..\pwm_tools\Core\PWM\control.c^
|
||||||
|
..\pwm_tools\Core\PWM\settings.c^
|
||||||
..\pwm_tools\Core\Modbus\modbus.c^
|
..\pwm_tools\Core\Modbus\modbus.c^
|
||||||
..\pwm_tools\Core\Modbus\rs_message.c^
|
..\pwm_tools\Core\Modbus\rs_message.c^
|
||||||
..\pwm_tools\Core\Modbus\crc_algs.c^
|
..\pwm_tools\Core\Modbus\crc_algs.c^
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user