/** ****************************************************************************** * @file py32f403_hal_esmc.h * @author MCU Application Team * @brief Header file of ESMC HAL module. ****************************************************************************** * @attention * *

© Copyright (c) 2023 Puya Semiconductor Co. * All rights reserved.

* * This software component is licensed by Puya under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** * @attention * *

© Copyright (c) 2016 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __PY32F403_HAL_ESMC_H #define __PY32F403_HAL_ESMC_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "py32f403_hal_def.h" /** @addtogroup PY32F403_HAL_Driver * @{ */ /** @addtogroup ESMC * @{ */ /* Exported types ------------------------------------------------------------*/ /** @defgroup ESMC_Exported_Types ESMC Exported Types * @{ */ /** * @brief ESMC Init structure definition */ typedef struct { uint32_t ClockPrescaler; /* Specifies the prescaler factor for generating clock based on the AHB clock. This parameter can be a number between 2 and 255 */ uint32_t ClockMode; /* Specifies the Clock Mode. It indicates the level that clock takes between commands. This parameter can be a value of @ref ESMC_ClockMode */ uint32_t DualFlash; /* Specifies the Dual Flash Mode State This parameter can be a value of @ref ESMC_DualFlash_Mode */ } ESMC_InitTypeDef; /** * @brief HAL ESMC State structures definition */ typedef enum { HAL_ESMC_STATE_RESET = 0x00U, /*!< Peripheral not initialized */ HAL_ESMC_STATE_READY = 0x01U, /*!< Peripheral initialized and ready for use */ HAL_ESMC_STATE_BUSY = 0x02U, /*!< Peripheral in indirect mode and busy */ HAL_ESMC_STATE_BUSY_INDIRECT_TX = 0x12U, /*!< Peripheral in indirect mode with transmission ongoing */ HAL_ESMC_STATE_BUSY_INDIRECT_RX = 0x22U, /*!< Peripheral in indirect mode with reception ongoing */ HAL_ESMC_STATE_BUSY_AUTO_POLLING = 0x42U, /*!< Peripheral in auto polling mode ongoing */ HAL_ESMC_STATE_BUSY_MEM_MAPPED = 0x82U, /*!< Peripheral in memory mapped mode ongoing */ HAL_ESMC_STATE_ABORT = 0x08U, /*!< Peripheral with abort request ongoing */ HAL_ESMC_STATE_ERROR = 0x04U /*!< Peripheral in error */ } HAL_ESMC_StateTypeDef; /** * @brief ESMC Handle Structure definition */ #if (USE_HAL_ESMC_REGISTER_CALLBACKS == 1) typedef struct __ESMC_HandleTypeDef #else typedef struct #endif { ESMC_TypeDef *Instance; /* ESMC registers base address */ ESMC_InitTypeDef Init; /* ESMC communication parameters */ uint8_t *pTxBuffPtr; /* Pointer to ESMC Tx transfer Buffer */ __IO uint32_t TxXferSize; /* ESMC Tx Transfer size */ __IO uint32_t TxXferCount; /* ESMC Tx Transfer Counter */ uint8_t *pRxBuffPtr; /* Pointer to ESMC Rx transfer Buffer */ __IO uint32_t RxXferSize; /* ESMC Rx Transfer size */ __IO uint32_t RxXferCount; /* ESMC Rx Transfer Counter */ DMA_HandleTypeDef *hdmarx; /* ESMC Rx DMA Handle parameters */ DMA_HandleTypeDef *hdmatx; /* ESMC Tx DMA Handle parameters */ __IO HAL_LockTypeDef Lock; /* Locking object */ __IO HAL_ESMC_StateTypeDef State; /* ESMC communication state */ __IO uint32_t ErrorCode; /* ESMC Error code */ uint32_t Timeout; /* Timeout for the ESMC memory access */ uint32_t Contex; /* ESMC transfer context */ uint32_t ContexAddr24; /* Temporarily store the value of register ADDR24 */ #if (USE_HAL_ESMC_REGISTER_CALLBACKS == 1) void (* ErrorCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* AbortCpltCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* CmdCpltCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* RxCpltCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* TxCpltCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* RxHalfCpltCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* TxHalfCpltCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* MspInitCallback) (struct __ESMC_HandleTypeDef *hesmc); void (* MspDeInitCallback) (struct __ESMC_HandleTypeDef *hesmc); #endif } ESMC_HandleTypeDef; /** * @brief ESMC Command structure definition */ typedef struct { uint32_t TransferFormat; /* Specifies the Transfer Format This parameter can be a value of @ref ESMC_TransferFormat */ uint32_t Instruction; /* Specifies the Instruction to be sent This parameter can be a value (8-bit) between 0x00 and 0xFF */ uint32_t InstructionMode; /* Specifies the Instruction Mode This parameter can be a value of @ref ESMC_InstructionMode */ uint32_t Address; /* Specifies the Address to be sent (Size from 1 to 4 bytes according AddressSize) This parameter can be a value (32-bits) between 0x0 and 0xFFFFFFFF */ uint32_t AddressMode; /* Specifies the Address Mode This parameter can be a value of @ref ESMC_AddressMode */ uint32_t AddressSize; /* Specifies the Address Size This parameter can be a value of @ref ESMC_AddressSize */ uint32_t AlternateByte; /* Specifies the Alternate Byte to be sent This parameter can be a value (8-bits) between 0x0 and 0xFF */ uint32_t AlternateByteMode; /* Specifies the Alternate Bytes Mode This parameter can be a value of @ref ESMC_AlternateBytesMode */ uint32_t DataMode; /* Specifies the Data Mode (used for dummy cycles and data phases) This parameter can be a value of @ref ESMC_DataMode */ uint32_t NbData; /* Specifies the number of data to transfer. This parameter can be any value between 1 and 0xFFFFFFFF */ uint32_t DdrMode; /* Specifies the double data rate mode for address, and data phase This parameter can be a value of @ref ESMC_DdrMode */ uint32_t DummyCycles; /* Specifies the Number of Dummy Cycles. This parameter can be a number between 0 and 31 */ uint32_t CSPinSel; /* Specifies the activated SSxO pin This parameter can be a value of @ref ESMC_CS_PIN_SEL */ } ESMC_CommandTypeDef; #if (USE_HAL_ESMC_REGISTER_CALLBACKS == 1) /** * @brief HAL ESMC Callback ID enumeration definition */ typedef enum { HAL_ESMC_ERROR_CB_ID = 0x00U, /*!< ESMC Error Callback ID */ HAL_ESMC_ABORT_CB_ID = 0x01U, /*!< ESMC Abort Callback ID */ HAL_ESMC_CMD_CPLT_CB_ID = 0x02U, /*!< ESMC Command Complete Callback ID */ HAL_ESMC_RX_CPLT_CB_ID = 0x03U, /*!< ESMC Rx Complete Callback ID */ HAL_ESMC_TX_CPLT_CB_ID = 0x04U, /*!< ESMC Tx Complete Callback ID */ HAL_ESMC_RX_HALF_CPLT_CB_ID = 0x05U, /*!< ESMC Rx Half Complete Callback ID */ HAL_ESMC_TX_HALF_CPLT_CB_ID = 0x06U, /*!< ESMC Tx Half Complete Callback ID */ HAL_ESMC_MSP_INIT_CB_ID = 0x07U, /*!< ESMC MspInit Callback ID */ HAL_ESMC_MSP_DEINIT_CB_ID = 0x08U /*!< ESMC MspDeInit Callback ID */ } HAL_ESMC_CallbackIDTypeDef; /** * @brief HAL ESMC Callback pointer definition */ typedef void (*pESMC_CallbackTypeDef)(ESMC_HandleTypeDef *hesmc); #endif /** * @} */ /* Exported constants --------------------------------------------------------*/ /** @defgroup ESMC_Exported_Constants ESMC Exported Constants * @{ */ /** @defgroup ESMC_FIFO_SIZE ESMC FIFO SIZE * @{ */ #define HAL_ESMC_TCR_MAX_LENGTH 0xFF #define HAL_ESMC_FIFO_SIZE 0x80 /** * @} */ /** @defgroup ESMC_ErrorCode ESMC Error Code * @{ */ #define HAL_ESMC_ERROR_NONE ((uint32_t)0x00000000U) /*!< No error */ #define HAL_ESMC_ERROR_TIMEOUT ((uint32_t)0x00000001U) /*!< Timeout error */ #define HAL_ESMC_ERROR_TRANSFER ((uint32_t)0x00000002U) /*!< Transfer error */ #define HAL_ESMC_ERROR_DMA ((uint32_t)0x00000004U) /*!< DMA transfer error */ #define HAL_ESMC_ERROR_INVALID_PARAM ((uint32_t)0x00000008U) /*!< Invalid parameters error */ #if (USE_HAL_ESMC_REGISTER_CALLBACKS == 1) #define HAL_ESMC_ERROR_INVALID_CALLBACK 0x00000010U /*!< Invalid callback error */ #endif /** * @} */ /** @defgroup ESMC_CONTEXT ESMC CONTEXT * @{ */ #define ESMC_CONTEXT_NONE ((uint32_t)0x00000000U) /*!< None */ #define ESMC_CONTEXT_READ_FIXED_LENGTH ((uint32_t)0x00000001U) /*!< Read single block operation */ #define ESMC_CONTEXT_READ_VARIABLE_LENGTH ((uint32_t)0x00000002U) /*!< Read multiple blocks operation */ #define ESMC_CONTEXT_WRITE_FIXED_LENGTH ((uint32_t)0x00000010U) /*!< Write single block operation */ #define ESMC_CONTEXT_WRITE_VARIABLE_LENGTH ((uint32_t)0x00000020U) /*!< Write multiple blocks operation */ /** * @} */ //#define ESMC_FUNCTIONAL_MODE_INDIRECT_WRITE ((uint32_t)0x0) /*!State = HAL_ESMC_STATE_RESET; \ (__HANDLE__)->MspInitCallback = NULL; \ (__HANDLE__)->MspDeInitCallback = NULL; \ } while(0) #else #define __HAL_ESMC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_ESMC_STATE_RESET) #endif /** @brief Enable ESMC * @param __HANDLE__ specifies the ESMC Handle. * @retval None */ #define __HAL_ESMC_ENABLE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR, ESMC_CR_SPIEN) /** @brief Disable ESMC * @param __HANDLE__ specifies the ESMC Handle. * @retval None */ #define __HAL_ESMC_DISABLE(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR, ESMC_CR_SPIEN) /** @brief Enable ESMC Global interrupt * @param __HANDLE__ specifies the ESMC Handle. * @retval None */ #define __HAL_ESMC_ENABLE_GLOBAL_IT(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR, ESMC_CR_GIE) /** @brief Disable ESMC Global interrupt * @param __HANDLE__ specifies the ESMC Handle. * @retval None */ #define __HAL_ESMC_DISABLE_GLOBAL_IT(__HANDLE__) CLEAR_BIT((__HANDLE__)->Instance->CR, ESMC_CR_GIE) /** @brief Soft reset ESMC * @param __HANDLE__ specifies the ESMC Handle. * @retval None */ #define __HAL_ESMC_SOFT_RESET(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR, ESMC_CR_SOFTRST) /** @brief Enables the specified ESMC interrupt. * @param __HANDLE__ specifies the ESMC Handle. * @param __INTERRUPT__ specifies the ESMC interrupt source to enable. * This parameter can be one of the following values: * @arg ESMC_IT_CMD : ESMC Command Done interrupt * @arg ESMC_IT_FIFOE : ESMC FIFO empty interrupt * @arg ESMC_IT_FIFOH : ESMC FIFO half full interrupt * @arg ESMC_IT_FIFOF : ESMC FIFO full interrupt * @arg ESMC_IT_IDLE : ESMC Idle interrupt * @arg ESMC_IT_DATAWAIT: ESMC Datawait interrupt * @arg ESMC_IT_FIFOO : ESMC FIFO OverFlow interrupt * @arg ESMC_IT_ADDRDONE: ESMC Address Done interrupt * @retval None */ #define __HAL_ESMC_ENABLE_IT(__HANDLE__, __INTERRUPT__) SET_BIT((__HANDLE__)->Instance->IER, (__INTERRUPT__)) /** @brief Disables the specified ESMC interrupt. * @param __HANDLE__ specifies the ESMC Handle. * @param __INTERRUPT__ specifies the ESMC interrupt source to disable. * This parameter can be one of the following values: * @arg ESMC_IT_CMD : ESMC Command Done interrupt * @arg ESMC_IT_FIFOE : ESMC FIFO empty interrupt * @arg ESMC_IT_FIFOH : ESMC FIFO half full interrupt * @arg ESMC_IT_FIFOF : ESMC FIFO full interrupt * @arg ESMC_IT_IDLE : ESMC Idle interrupt * @arg ESMC_IT_DATAWAIT: ESMC Datawait interrupt * @arg ESMC_IT_FIFOO : ESMC FIFO OverFlow interrupt * @arg ESMC_IT_ADDRDONE: ESMC Address Done interrupt * @retval None */ #define __HAL_ESMC_DISABLE_IT(__HANDLE__, __INTERRUPT__) CLEAR_BIT((__HANDLE__)->Instance->IER, (__INTERRUPT__)) /** @brief Checks whether the specified ESMC interrupt source is enabled. * @param __HANDLE__ specifies the ESMC Handle. * @param __INTERRUPT__ specifies the ESMC interrupt source to check. * This parameter can be one of the following values: * @arg ESMC_IT_CMD : ESMC Command Done interrupt * @arg ESMC_IT_FIFOE : ESMC FIFO empty interrupt * @arg ESMC_IT_FIFOH : ESMC FIFO half full interrupt * @arg ESMC_IT_FIFOF : ESMC FIFO full interrupt * @arg ESMC_IT_IDLE : ESMC Idle interrupt * @arg ESMC_IT_DATAWAIT: ESMC Datawait interrupt * @arg ESMC_IT_FIFOO : ESMC FIFO OverFlow interrupt * @arg ESMC_IT_ADDRDONE: ESMC Address Done interrupt * @retval The new state of __INTERRUPT__ (TRUE or FALSE). */ #define __HAL_ESMC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (READ_BIT((__HANDLE__)->Instance->IER, (__INTERRUPT__)) == (__INTERRUPT__)) /** * @brief Get the selected ESMC's flag status. * @param __HANDLE__ specifies the ESMC Handle. * @param __FLAG__ specifies the ESMC flag to check. * This parameter can be one of the following values: * @arg ESMC_FLAG_CMDIF : COMMAND Done flag * @arg ESMC_FLAG_FIFOEIF : FIFO Empty flag * @arg ESMC_FLAG_FIFOHIF : FIFO HALF Full flag * @arg ESMC_FLAG_FIFOFIF : FIFO Full flag * @arg ESMC_FLAG_IDLEIF : IDLE flag * @arg ESMC_FLAG_DATAWAITIF : DATA WAIT flag * @arg ESMC_FLAG_FIFOOIF : FIFO Overflow flag * @arg ESMC_FLAG_ADDRDONEIF : ADDRESS Done flag * @arg ESMC_FLAG_SSACTIVE : SS outputs Active flag * @arg ESMC_FLAG_RXBUSY : RX In progress flag * @arg ESMC_FLAG_TXBUSY : TX In progress flag * @arg ESMC_FLAG_IDLE : ESMC is in IDLE state * @arg ESMC_FLAG_FIFIOOVERFOLOW: FIFO has operflown flag * @arg ESMC_FLAG_IT : Interrupt request flag: * @retval None */ #define __HAL_ESMC_GET_FLAG(__HANDLE__, __FLAG__) (((*(__IO uint16_t *)(&(__HANDLE__)->Instance->SR) & (__FLAG__)) != 0) ? SET : RESET) /** @brief Clears the specified ESMC's flag status. * @param __HANDLE__ specifies the ESMC Handle. * @param __FLAG__ specifies the ESMC clear register flag that needs to be set * This parameter can be one of the following values: * @arg ESMC_FLAG_CMDIF : COMMAND Done flag * @arg ESMC_FLAG_IDLEIF : IDLE flag * @arg ESMC_FLAG_ADDRDONEIF : ADDRESS Done flag * @retval None */ #define __HAL_ESMC_CLEAR_FLAG(__HANDLE__, __FLAG__) (*(__IO uint16_t *)(&(__HANDLE__)->Instance->SR) = (__FLAG__)) /** @brief configure which slave select output should be driven during no xip mode. * @param __HANDLE__ specifies the ESMC Handle. * @param __SSX__ specifies the CS pin * The parameter can take the following values: * @arg ESMC_SELECT_PIN_CS0 * @arg ESMC_SELECT_PIN_CS1 * @arg ESMC_SELECT_PIN_CS2 * @arg ESMC_SELECT_PIN_CS3 * @retval None */ #define __HAL_ESMC_SET_SSXO(__HANDLE__, __SSX__) SET_BIT((__HANDLE__)->Instance->ADDR32, (__SSX__)<Instance->ADDR32, (__SSX__)<Instance->CR3, ESMC_CR3_FIFOCLR) /** @brief Enable the slave select. * @param __HANDLE__ specifies the ESMC Handle. * @retval None */ #define __HAL_ESMC_ENABLE_SLAVE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR3, ESMC_CR3_SSSETRQ) /** @brief Disable the slave select. * @param __HANDLE__ specifies the ESMC Handle. * @retval None */ #define __HAL_ESMC_DISABLE_SLAVE(__HANDLE__) SET_BIT((__HANDLE__)->Instance->CR3, ESMC_CR3_SSCLRRQ) /** * @} */ /* Exported functions --------------------------------------------------------*/ /** @addtogroup ESMC_Exported_Functions * @{ */ /** @addtogroup ESMC_Exported_Functions_Group1 * @{ */ /* Initialization/de-initialization functions ********************************/ HAL_StatusTypeDef HAL_ESMC_Init (ESMC_HandleTypeDef *hesmc); HAL_StatusTypeDef HAL_ESMC_DeInit (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_MspInit (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_MspDeInit(ESMC_HandleTypeDef *hesmc); /** * @} */ /** @addtogroup ESMC_Exported_Functions_Group2 * @{ */ /* IO operation functions *****************************************************/ /* ESMC IRQ handler method */ void HAL_ESMC_IRQHandler(ESMC_HandleTypeDef *hesmc); /* ESMC indirect mode */ HAL_StatusTypeDef HAL_ESMC_Command (ESMC_HandleTypeDef *hesmc, ESMC_CommandTypeDef *cmd, uint32_t Timeout); HAL_StatusTypeDef HAL_ESMC_Transmit (ESMC_HandleTypeDef *hesmc, uint8_t *pData, uint32_t Timeout); HAL_StatusTypeDef HAL_ESMC_Receive (ESMC_HandleTypeDef *hesmc, uint8_t *pData, uint32_t Timeout); HAL_StatusTypeDef HAL_ESMC_Command_IT (ESMC_HandleTypeDef *hesmc, ESMC_CommandTypeDef *cmd); HAL_StatusTypeDef HAL_ESMC_Transmit_IT (ESMC_HandleTypeDef *hesmc, uint8_t *pData); HAL_StatusTypeDef HAL_ESMC_Receive_IT (ESMC_HandleTypeDef *hesmc, uint8_t *pData); HAL_StatusTypeDef HAL_ESMC_Transmit_DMA (ESMC_HandleTypeDef *hesmc, uint8_t *pData); HAL_StatusTypeDef HAL_ESMC_Receive_DMA (ESMC_HandleTypeDef *hesmc, uint8_t *pData); /* QSPI memory-mapped mode */ HAL_StatusTypeDef HAL_ESMC_MemoryMapped(ESMC_HandleTypeDef *hesmc, ESMC_CommandTypeDef *cmd); /* Callback functions in non-blocking modes ***********************************/ void HAL_ESMC_ErrorCallback (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_AbortCpltCallback (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_SetSSxO(ESMC_HandleTypeDef *hesmc, uint32_t SSxO); /* ESMC indirect mode */ void HAL_ESMC_CmdCpltCallback (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_RxCpltCallback (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_TxCpltCallback (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_RxHalfCpltCallback (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_TxHalfCpltCallback (ESMC_HandleTypeDef *hesmc); #if (USE_HAL_ESMC_REGISTER_CALLBACKS == 1) /* ESMC callback registering/unregistering */ HAL_StatusTypeDef HAL_ESMC_RegisterCallback (ESMC_HandleTypeDef *hesmc, HAL_ESMC_CallbackIDTypeDef CallbackId, pESMC_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_ESMC_UnRegisterCallback (ESMC_HandleTypeDef *hesmc, HAL_ESMC_CallbackIDTypeDef CallbackId); #endif /** * @} */ /** @addtogroup ESMC_Exported_Functions_Group3 * @{ */ /* Peripheral Control and State functions ************************************/ HAL_ESMC_StateTypeDef HAL_ESMC_GetState (ESMC_HandleTypeDef *hesmc); uint32_t HAL_ESMC_GetError (ESMC_HandleTypeDef *hesmc); HAL_StatusTypeDef HAL_ESMC_Abort (ESMC_HandleTypeDef *hesmc); HAL_StatusTypeDef HAL_ESMC_Abort_IT (ESMC_HandleTypeDef *hesmc); void HAL_ESMC_SetTimeout (ESMC_HandleTypeDef *hesmc, uint32_t Timeout); /** * @} */ /** * @} */ /* Private macros ------------------------------------------------------------*/ /** @defgroup ESMC_Private_Macros ESMC Private Macros * @{ */ #define IS_ESMC_CLOCK_PRESCALER(PRESCALER) ((PRESCALER) <= 0xFF && (PRESCALER) >= 0x2) #define IS_ESMC_CLOCK_MODE(CLKMODE) (((CLKMODE) == ESMC_CLOCK_MODE_0) || \ ((CLKMODE) == ESMC_CLOCK_MODE_1) || \ ((CLKMODE) == ESMC_CLOCK_MODE_2) || \ ((CLKMODE) == ESMC_CLOCK_MODE_3)) #define IS_ESMC_DUAL_FLASH_MODE(MODE) (((MODE) == ESMC_DUALFLASH_ENABLE) || \ ((MODE) == ESMC_DUALFLASH_DISABLE)) #define IS_ESMC_INSTRUCTION(INSTRUCTION) ((INSTRUCTION) <= 0xFF) #define IS_ESMC_ADDRESS_SIZE(ADDR_SIZE) (((ADDR_SIZE) == ESMC_ADDRESS_8_BITS) || \ ((ADDR_SIZE) == ESMC_ADDRESS_16_BITS) || \ ((ADDR_SIZE) == ESMC_ADDRESS_24_BITS) || \ ((ADDR_SIZE) == ESMC_ADDRESS_32_BITS)) #define IS_ESMC_DUMMY_CYCLES(DCY) ((DCY) <= 31) #define IS_ESMC_INSTRUCTION_MODE(MODE) (((MODE) == ESMC_INSTRUCTION_NONE) || \ ((MODE) == ESMC_INSTRUCTION_SINGLE_LINE) || \ ((MODE) == ESMC_INSTRUCTION_MULTI_LINES)) #define IS_ESMC_ADDRESS_MODE(MODE) (((MODE) == ESMC_ADDRESS_NONE) || \ ((MODE) == ESMC_ADDRESS_SINGLE_LINE) || \ ((MODE) == ESMC_ADDRESS_MULTI_LINES)) #define IS_ESMC_ALTERNATE_BYTES_MODE(MODE) (((MODE) == ESMC_ALTERNATE_BYTES_DISABLE) || \ ((MODE) == ESMC_ALTERNATE_BYTES_ENABLE)) #define IS_ESMC_ALTERNATE_BYTE(ALT) ((ALT) <= 0xFF) #define IS_ESMC_DATA_MODE(MODE) (((MODE) == ESMC_DATA_NONE) || \ ((MODE) == ESMC_DATA_WRITE) || \ ((MODE) == ESMC_DATA_READ)) #define IS_ESMC_DDR_MODE(DDR_MODE) (((DDR_MODE) == ESMC_DDR_DISABLE) || \ ((DDR_MODE) == ESMC_DDR_DATA) || \ ((DDR_MODE) == ESMC_DDR_ADDR_DATA) || \ ((DDR_MODE) == ESMC_DDR_CMD_ADDR_DATA)) /** * @} */ /* Private functions ---------------------------------------------------------*/ /** @defgroup ESMC_Private_Functions ESMC Private Functions * @{ */ /** * @} */ /** * @} */ /** * @} */ #ifdef __cplusplus } #endif #endif /* __PY32F403_HAL_ESMC_H */ /************************ (C) COPYRIGHT Puya *****END OF FILE******************/