/** ****************************************************************************** * @file xl_dma.h * @author software group * @brief This file contains all the functions prototypes for the DMA * firmware library. ****************************************************************************** * @attention * * 2019 by Chipways Communications,Inc. All Rights Reserved. * This software is supplied under the terms of a license * agreement or non-disclosure agreement with Chipways. * Passing on and copying of this document,and communication * of its contents is not permitted without prior written * authorization. * *

© COPYRIGHT 2019 Chipways

****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef XL_DMA_H_ #define XL_DMA_H_ #ifdef __cplusplus extern "C" { #endif /* Includes ---------------------------------------------------------------*/ #include "XL6600.h" /* Register define ------------------------------------------------------------*/ #define DMA_DMACTRLC_DBURSTC_MASK 0xE0000000u #define DMA_DMACTRLC_DBURSTC_SHIFT 29u #define DMA_DMACTRLC_SBURSTC_MASK 0x1C000000u #define DMA_DMACTRLC_SBURSTC_SHIFT 26u #define DMA_DMACTRLC_DWIDTHC_MASK 0x03000000u #define DMA_DMACTRLC_DWIDTHC_SHIFT 24u #define DMA_DMACTRLC_SWIDTHC_MASK 0x00C00000u #define DMA_DMACTRLC_SWIDTHC_SHIFT 22u #define DMA_DMACTRLC_TRANSIZEC_MASK 0x003FE000u #define DMA_DMACTRLC_TRANSIZEC_SHIFT 13u #define DMA_DMACTRLC_FLOWCTRLC_MASK 0x00001800u #define DMA_DMACTRLC_FLOWCTRLC_SHIFT 11u #define DMA_DMACTRLC_DSTPERC_MASK 0x00000780u #define DMA_DMACTRLC_DSTPERC_SHIFT 7u #define DMA_DMACTRLC_SRCPERC_MASK 0x00000078u #define DMA_DMACTRLC_SRCPERC_SHIFT 3u #define DMA_DMACTRLC_DSTINCC_MASK 0x00000004u #define DMA_DMACTRLC_DSTINCC_SHIFT 2u #define DMA_DMACTRLC_SRCINCC_MASK 0x00000002u #define DMA_DMACTRLC_SRCINCC_SHIFT 1u #define DMA_DMACTRLC_CHENC_MASK 0x00000001u #define DMA_DMACTRLC_CHENC_SHIFT 0u #define DMA_DMASTATUSC_TRANSLENGTH_MASK 0x0000007FEu #define DMA_DMASTATUSC_TRANSLENGTH_SHIFT 1u #define DMA_DMASTATUSC_BUSY_MASK 0x00000001u #define DMA_DMASTATUSC_BUSY_SHIFT 0u #define DMA_DMAEN_DMAEN_MASK 0x00000001u #define DMA_DMAEN_DMAEN_SHIFT 0u #define DMA_DMASRST_DMASRST_MASK 0x00000001u #define DMA_DMASRST_DMASRST_SHIFT 0u #define DMA_DMAINTSTATUS_INTCC3_MASK 0x00000080u #define DMA_DMAINTSTATUS_INTCC3_SHIFT 7u #define DMA_DMAINTSTATUS_INTCC2_MASK 0x00000040u #define DMA_DMAINTSTATUS_INTCC2_SHIFT 6u #define DMA_DMAINTSTATUS_INTCC1_MASK 0x00000020u #define DMA_DMAINTSTATUS_INTCC1_SHIFT 5u #define DMA_DMAINTSTATUS_INTCC0_MASK 0x00000010u #define DMA_DMAINTSTATUS_INTCC0_SHIFT 4u #define DMA_DMAINTSTATUS_INTERRC3_MASK 0x00000008u #define DMA_DMAINTSTATUS_INTERRC3_SHIFT 3u #define DMA_DMAINTSTATUS_INTERRC2_MASK 0x00000004u #define DMA_DMAINTSTATUS_INTERRC2_SHIFT 2u #define DMA_DMAINTSTATUS_INTERRC1_MASK 0x00000002u #define DMA_DMAINTSTATUS_INTERRC1_SHIFT 1u #define DMA_DMAINTSTATUS_INTERRC0_MASK 0x00000001u #define DMA_DMAINTSTATUS_INTERRC0_SHIFT 0u #define DMA_DMAINTMASK_MASKTCC3_MASK 0x00000080u #define DMA_DMAINTMASK_MASKTCC3_SHIFT 7u #define DMA_DMAINTMASK_MASKTCC2_MASK 0x00000040u #define DMA_DMAINTMASK_MASKTCC2_SHIFT 6u #define DMA_DMAINTMASK_MASKTCC1_MASK 0x00000020u #define DMA_DMAINTMASK_MASKTCC1_SHIFT 5u #define DMA_DMAINTMASK_MASKTCC0_MASK 0x00000010u #define DMA_DMAINTMASK_MASKTCC0_SHIFT 4u #define DMA_DMAINTMASK_MASKERRC3_MASK 0x00000008u #define DMA_DMAINTMASK_MASKERRC3_SHIFT 3u #define DMA_DMAINTMASK_MASKERRC2_MASK 0x00000004u #define DMA_DMAINTMASK_MASKERRC2_SHIFT 2u #define DMA_DMAINTMASK_MASKERRC1_MASK 0x00000002u #define DMA_DMAINTMASK_MASKERRC1_SHIFT 1u #define DMA_DMAINTMASK_MASKERRC0_MASK 0x00000001u #define DMA_DMAINTMASK_MASKERRC0_SHIFT 0u #define DMA_DMAPERREQ_ADCRXREQ_MASK 0x00000800u #define DMA_DMAPERREQ_ADCRXREQ_SHIFT 11u #define DMA_DMAPERREQ_ADCTXREQ_MASK 0x00000400u #define DMA_DMAPERREQ_ADCTXREQ_SHIFT 10u #define DMA_DMAPERREQ_UART2RXREQ_MASK 0x00000200u #define DMA_DMAPERREQ_UART2RXREQ_SHIFT 9u #define DMA_DMAPERREQ_UART2TXREQ_MASK 0x00000100u #define DMA_DMAPERREQ_UART2TXREQ_SHIFT 8u #define DMA_DMAPERREQ_UART1RXREQ_MASK 0x00000080u #define DMA_DMAPERREQ_UART1RXREQ_SHIFT 7u #define DMA_DMAPERREQ_UART1TXREQ_MASK 0x00000040u #define DMA_DMAPERREQ_UART1TXREQ_SHIFT 6u #define DMA_DMAPERREQ_UART0RXREQ_MASK 0x00000020u #define DMA_DMAPERREQ_UART0RXREQ_SHIFT 5u #define DMA_DMAPERREQ_UART0TXREQ_MASK 0x00000010u #define DMA_DMAPERREQ_UART0TXREQ_SHIFT 4u #define DMA_DMAPERREQ_SPI0RXREQ_MASK 0x00000008u #define DMA_DMAPERREQ_SPI0RXREQ_SHIFT 3u #define DMA_DMAPERREQ_SPI0TXREQ_MASK 0x00000004u #define DMA_DMAPERREQ_SPI0TXREQ_SHIFT 2u #define DMA_DMAPERREQ_SPI1RXREQ_MASK 0x00000002u #define DMA_DMAPERREQ_SPI1RXREQ_SHIFT 1u #define DMA_DMAPERREQ_SPI1TXREQ_MASK 0x00000001u #define DMA_DMAPERREQ_SPI1TXREQ_SHIFT 0u /** DMA - Register Layout Typedef */ typedef struct{ struct { __IO uint32_t DMASRCADDRC; /*!< ÐŵÀÔ´µØÖ·¼Ä´æÆ÷ */ __IO uint32_t DMADSTADDRC; /*!< ͨµÀÄ¿µÄµØÖ·¼Ä´æÆ÷ */ __IO uint32_t DMACTRLC; /*!< ͨµÀ¿ØÖƼĴæÆ÷ */ __IO uint32_t DMASTATUSC; /*!< ͨµÀ״̬¼Ä´æÆ÷ */ }DMACHANREG[4]; __IO uint32_t DMAEN; /*!< DMA ʹÄܼĴæÆ÷ */ __IO uint32_t DMASRST; /*!< DMA Èí¸´Î»¼Ä´æÆ÷ */ __IO uint32_t DMAINTSTATUS; /*!< ÖжÏ״̬/ÖжÏÇå³ý¼Ä´æÆ÷ */ __IO uint32_t DMAINTMASK; /*!< ÖÐ¶ÏÆÁ±Î¼Ä´æÆ÷ */ __I uint32_t DMAPERREQ; /*!< ÍâÉèÇëÇó״̬¼Ä´æÆ÷ */ } DMA_Type; extern DMA_Type *DMA; /** @addtogroup XL6600_StdPeriph_Driver * @{ */ /** @addtogroup DMA * @{ */ /* Exported types ------------------------------------------------------------*/ /** * @brief DMA³õʼ»¯½á¹¹Ì嶨Òå */ typedef struct { uint8_t chan; /*!< ÐŵÀ */ uint8_t TargetBurst; /*!< ÉêÇëÒ»´Î×ÜÏߣ¬ÊÕµ½µÄÊý¾Ý */ uint8_t SourceBurst; /*!< ÉêÇëÒ»´Î×ÜÏߣ¬·¢Ë͵ÄÊý¾Ý */ uint8_t TargetWidth; /*!< Ä¿±êÒ»¸öÊý¾ÝµÄbit */ uint8_t SourceWidth; /*!< Ô´Ò»¸öÊý¾ÝµÄbit */ uint16_t TransferSize; /*!< ´«ÊäÊý¾ÝµÄ´óС */ uint8_t FlowControl; /*!< Ä¿±êÉ豸ID */ uint8_t TargetPerID; /*!< Ä¿±êÉ豸ID */ uint8_t SourcePerID; /*!< Ô´É豸ID */ uint8_t TargetAddrInc; /*!< Ä¿µÄµØÖ·µÝÔöʹÄÜλ */ uint8_t SourceAddrInc; /*!< Ô´µØÖ·µÝÔöʹÄÜλ */ }DMA_InitTypeDef; extern DMA_Type *DMA; /* Exported constants --------------------------------------------------------*/ /** @defgroup DMA_Exported_Constants DMAÄ£¿éʹÓòÎÊý¶¨Òå * @{ */ /** @defgroup DMA_Channel_Num DMAͨµÀ * @{ */ typedef enum { DMA_Channel_0 = 0, /*!< DMAͨµÀ0 */ DMA_Channel_1 , /*!< DMAͨµÀ1 */ DMA_Channel_2 , /*!< DMAͨµÀ2 */ DMA_Channel_3 , /*!< DMAͨµÀ3 */ }DMA_Channel_Num; /** * @} */ /** @defgroup DMA_TargetData_Burst DMAÄ¿µÄ²Ù×÷Êý¾ÝBurstÑ¡Ôñ * @{ */ typedef enum { DMA_TargetBurst1 = 0, /*!< Ä¿µÄ²Ù×÷Êý¾ÝBurstΪ1 */ DMA_TargetBurst2, /*!< Ä¿µÄ²Ù×÷Êý¾ÝBurstΪ2 */ DMA_TargetBurst4, /*!< Ä¿µÄ²Ù×÷Êý¾ÝBurstΪ4 */ DMA_TargetBurst8, /*!< Ä¿µÄ²Ù×÷Êý¾ÝBurstΪ8 */ DMA_TargetBurst16, /*!< Ä¿µÄ²Ù×÷Êý¾ÝBurstΪ16 */ DMA_TargetBurst32 /*!< Ä¿µÄ²Ù×÷Êý¾ÝBurstΪ32 */ }DMA_TargetBurstDef; /** * @} */ /** @defgroup DMA_SourceData_Burst DMAÔ´²Ù×÷Êý¾ÝBurstÑ¡Ôñ * @{ */ typedef enum { DMA_SourceBurst1 = 0, /*!< Ô´²Ù×÷Êý¾ÝBurstΪ1 */ DMA_SourceBurst2, /*!< Ô´²Ù×÷Êý¾ÝBurstΪ2 */ DMA_SourceBurst4, /*!< Ô´²Ù×÷Êý¾ÝBurstΪ4 */ DMA_SourceBurst8, /*!< Ô´²Ù×÷Êý¾ÝBurstΪ8 */ DMA_SourceBurst16, /*!< Ô´²Ù×÷Êý¾ÝBurstΪ16 */ DMA_SourceBurst32 /*!< Ô´²Ù×÷Êý¾ÝBurstΪ32 */ }DMA_SourceBurstDef; /** * @} */ /** @defgroup DMA_TargetData_Width DMAÄ¿µÄ²Ù×÷Êý¾Ýλ¿íÑ¡Ôñ * @{ */ typedef enum { DMA_TargetWidth8 = 0, /*!< Ä¿±ê²Ù×÷Êý¾Ýλ¿í8λ */ DMA_TargetWidth16, /*!< Ä¿±ê²Ù×÷Êý¾Ýλ¿í16λ */ DMA_TargetWidth32, /*!< Ä¿±ê²Ù×÷Êý¾Ýλ¿í32λ */ DMA_TargetWidth32_1, /*!< Ä¿±ê²Ù×÷Êý¾Ýλ¿í32λ */ }DMA_TargetWidthDef; /** * @} */ /** @defgroup DMA_SourceData_Width DMAÔ´²Ù×÷Êý¾Ýλ¿íÑ¡Ôñ * @{ */ typedef enum { DMA_SourceWidth8 = 0, /*!< Ô´²Ù×÷Êý¾Ýλ¿í8λ */ DMA_SourceWidth16, /*!< Ô´²Ù×÷Êý¾Ýλ¿í16λ */ DMA_SourceWidth32, /*!< Ô´²Ù×÷Êý¾Ýλ¿í32λ */ DMA_SourceWidth32_1, /*!< Ô´²Ù×÷Êý¾Ýλ¿í32λ */ }DMA_SourceWidthDef; /** * @} */ /** @defgroup DMA_Flow_Control DMA´«Ê䷽ʽѡÔñ * @{ */ typedef enum { DMA_MemoryToMemory = 0, /*!< ´æ´¢Æ÷µ½´æ´¢Æ÷ */ DMA_MemoryToPeripheral , /*!< ´æ´¢Æ÷µ½ÍâÉè */ DMA_PeripheralToMemory , /*!< ÍâÉèµ½´æ´¢Æ÷ */ DMA_PeripheralToPeripheral , /*!< ÍâÉèµ½ÍâÉè */ }DMA_FlowControlDef; /** * @} */ /** @defgroup DMA_Peripheral_ID DMAÄ¿µÄÍâÉèIDÑ¡Ôñ * @{ */ typedef enum { DMA_SPI1_Tx = 0, DMA_SPI1_Rx, DMA_SPI0_Tx, DMA_SPI0_Rx, DMA_UART0_Tx, DMA_UART0_Rx, DMA_UART1_Tx, DMA_UART1_Rx, DMA_UART2_Tx, DMA_UART2_Rx, DMA_ADC_Tx, DMA_ADC_Rx, DMA_Reserver0, DMA_Reserver1, DMA_Reserver2, DMA_Reserver3, }DMA_Peripheral_IDDef; /** * @} */ /** @defgroup DMA_Address_Add DMAµØÖ·×ÔÔö * @{ */ typedef enum { DMA_AddressNoAdd = 0, /*!< µØÖ·±£³Ö²»±ä */ DMA_AddressAdd , /*!< µØÖ·µÝÔö */ }DMA_AddrIncDef; /** * @} */ /** @defgroup DMA_Interrupt_Status DMAÖжÏ״̬¼°Çå³ý * @{ */ typedef enum { DMA_Channel0_Err = 0, /*!< DMAͨµÀ0´íÎóÖÐ¶Ï */ DMA_Channel1_Err, /*!< DMAͨµÀ0´íÎóÖÐ¶Ï */ DMA_Channel2_Err, /*!< DMAͨµÀ0´íÎóÖÐ¶Ï */ DMA_Channel3_Err, /*!< DMAͨµÀ0´íÎóÖÐ¶Ï */ DMA_Channel0_TransferFinish, /*!< DMAͨµÀ0´«ÊäÍê³ÉÖÐ¶Ï */ DMA_Channel1_TransferFinish, /*!< DMAͨµÀ0´«ÊäÍê³ÉÖÐ¶Ï */ DMA_Channel2_TransferFinish, /*!< DMAͨµÀ0´«ÊäÍê³ÉÖÐ¶Ï */ DMA_Channel3_TransferFinish, /*!< DMAͨµÀ0´«ÊäÍê³ÉÖÐ¶Ï */ DMA_ClearALL_Status = 0xFF /*!< Çå³ýËùÓÐDMAÖжÏ״̬ */ }DMA_InterruptStatusDef; /** * @} */ /** @defgroup DMA_Interrupt_Mask DMAÖÐ¶ÏÆÁ±Î * @{ */ typedef enum { DMA_Channel0_Err_Mask = 0, /*!< DMAͨµÀ0´íÎóÖÐ¶ÏÆÁ±Î */ DMA_Channel1_Err_Mask, /*!< DMAͨµÀ1´íÎóÖÐ¶ÏÆÁ±Î */ DMA_Channel2_Err_Mask, /*!< DMAͨµÀ2´íÎóÖÐ¶ÏÆÁ±Î */ DMA_Channel3_Err_Mask, /*!< DMAͨµÀ3´íÎóÖÐ¶ÏÆÁ±Î */ DMA_Channel0_TransferFinish_Mask, /*!< DMAͨµÀ0´«ÊäÍê³ÉÖÐ¶ÏÆÁ±Î */ DMA_Channel1_TransferFinish_Mask, /*!< DMAͨµÀ1´«ÊäÍê³ÉÖÐ¶ÏÆÁ±Î */ DMA_Channel2_TransferFinish_Mask, /*!< DMAͨµÀ2´«ÊäÍê³ÉÖÐ¶ÏÆÁ±Î */ DMA_Channel3_TransferFinish_Mask, /*!< DMAͨµÀ3´«ÊäÍê³ÉÖÐ¶ÏÆÁ±Î */ }DMA_InterruptMaskDef; /** * @} */ /** @defgroup DMA_Peripheral_ResquestDef DMAÍâÉèÇëÇó״̬ * @{ */ typedef enum { DMA_SPI1_Tx_Req = 0, DMA_SPI1_Rx_Req, DMA_SPI0_Tx_Req, DMA_SPI0_Rx_Req, DMA_UART0_Tx_Req, DMA_UART0_Rx_Req, DMA_UART1_Tx_Req, DMA_UART1_Rx_Req, DMA_UART2_Tx_Req, DMA_UART2_Rx_Req, DMA_ADC_Tx_Req, DMA_ADC_Rx_Req, }DMA_Peripheral_ResquestDef; /** * @} */ /** @defgroup DMA_Chan_Status DMAͨµÀ״̬ * @{ */ typedef enum { DMA_Chan_Idle = 0, /*!< DMAͨµÀ¿ÕÏÐ */ DMA_Chan_Busy /*!< DMAͨµÀæ */ }DMA_Chan_Status; /** * @} */ /** * @} */ /* Exported macro ------------------------------------------------------------*/ /* Exported functions --------------------------------------------------------*/ void DMA_ChannelInit(const DMA_InitTypeDef *DMA_InitStruct); void DMA_Enable(FunctionalState NewState); void DMA_ChannelEnableCmd(uint8_t Channel,FunctionalState NewState); void DMA_SetSourceAddress(uint8_t Channel,uint32_t address); void DMA_SetTargetAddress(uint8_t Channel,uint32_t address); void DMA_SetTransferSize(uint8_t channel,uint16_t len); uint8_t DMA_GetChannelStatus(uint8_t Channel); uint16_t DMA_GetChanTransferDataLen(uint8_t Channel); uint8_t DMA_GetInterruptStatus(uint8_t DMA_InterruptStatusType); void DMA_ClearInterruptStatus(const uint8_t DMA_InterruptStatusType); void DMA_InterruptEnable(uint8_t DMA_InterruptMaskType,FunctionalState NewState); uint32_t DMA_GetPeripheralResquestStatus(const uint8_t DMA_Peripheral_ResquestType); #ifdef __cplusplus } #endif #endif /** * @} */ /** * @} */