/** ****************************************************************************** * @file fm33a0xxev_dma.c * @author FM33A0XXEV Application Team * @version V1.0.0 * @date 16-April-2020 * @brief This file provides firmware functions to manage the following * functionalities of....: * */ /* Includes ------------------------------------------------------------------*/ #include "fm33a0xxev_dma.h" #include "fm33a0xxev_rmu.h" /** @addtogroup fm33a0xxev_StdPeriph_Driver * @{ */ /** @defgroup DMA * @brief DMA driver modules * @{ */ /* DMA´íÎóµØÖ·ÖжÏʹÄÜ 1£ºÔÊÐí´íÎóµØÖ·ÖÐ¶Ï 0£º½ûÖ¹´íÎóµØÖ·ÖÐ¶Ï Ïà¹Øº¯Êý */ void DMA_GCR_DMA_ADDRERR_EN_Setable(FunState NewState) { if (NewState == ENABLE) { DMA->GCR |= (DMA_GCR_DMA_ADDRERR_EN_Msk); } else { DMA->GCR &= ~(DMA_GCR_DMA_ADDRERR_EN_Msk); } } FunState DMA_GCR_DMA_ADDRERR_EN_Getable(void) { if (DMA->GCR & (DMA_GCR_DMA_ADDRERR_EN_Msk)) { return ENABLE; } else { return DISABLE; } } /* DMAÈ«¾ÖʹÄÜ 1£ºDMAʹÄÜ 0£ºDMA¹Ø±Õ Ïà¹Øº¯Êý */ void DMA_GCR_DMAEN_Setable(FunState NewState) { if (NewState == ENABLE) { DMA->GCR |= (DMA_GCR_DMAEN_Msk); } else { DMA->GCR &= ~(DMA_GCR_DMAEN_Msk); } } FunState DMA_GCR_DMAEN_Getable(void) { if (DMA->GCR & (DMA_GCR_DMAEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* Channelx´«Ê䳤¶È£¬1-8192´Î´«Êä Ïà¹Øº¯Êý */ void DMA_CHxCR_CHxTSIZE_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);//DMA->CH0CTRL; SetValue <<= DMA_CHxCR_CHxTSIZE_Pos;//ÊÖ¹¤Ìí¼Ó tmpreg = *pREG; tmpreg &= ~(DMA_CHxCR_CHxTSIZE_Msk); tmpreg |= (SetValue&DMA_CHxCR_CHxTSIZE_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCR_CHxTSIZE_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); return (uint32_t)((*pREG & DMA_CHxCR_CHxTSIZE_Msk) >> DMA_CHxCR_CHxTSIZE_Pos); } /* ChannelxÓÅÏȼ¶ 00£ºLow 01£ºMedium 10£ºHigh 11£ºVery High Ïà¹Øº¯Êý */ void DMA_CHxCR_CHxPRI_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);//DMA->CH0CTRL; tmpreg = *pREG; tmpreg &= ~(DMA_CHxCR_CHxPRI_Msk); tmpreg |= (SetValue&DMA_CHxCR_CHxPRI_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCR_CHxPRI_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); return (*pREG & DMA_CHxCR_CHxPRI_Msk); } /* RAMµØÖ·Ôö¼õÉèÖà 1£ºRAMµØÖ·µÝÔö 0£ºRAMµØÖ·µÝ¼õ Ïà¹Øº¯Êý */ void DMA_CHxCR_CHxINC_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);//DMA->CH0CTRL; tmpreg = *pREG; tmpreg &= ~(DMA_CHxCR_CHxINC_Msk); tmpreg |= (SetValue&DMA_CHxCR_CHxINC_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCR_CHxINC_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); return (*pREG & DMA_CHxCR_CHxINC_Msk); } /* ChannelxÍâÉèÇëÇóÓ³Éä ÿ¸öͨµÀ¿ÉÒÔ½ÓÊÜ8¸öÍâÉèÇëÇó£¬ÍâÉèÇëÇóµÄÓ³Éä²Î¼û23.6.1DMAÇëÇóÓ³Éä Ïà¹Øº¯Êý */ void DMA_CHxCR_CHxSSEL_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);//DMA->CH0CTRL; tmpreg = *pREG; tmpreg &= ~(DMA_CHxCR_CHxSSEL_Msk); tmpreg |= (SetValue&DMA_CHxCR_CHxSSEL_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCR_CHxSSEL_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); return (*pREG & DMA_CHxCR_CHxSSEL_Msk); } /* Ñ­»·»º³åģʽÏÂ×Ô¶¯¸üд«Êä²ÎÊý£¬±¾ÂÖ´«ÊäÍê³Éºó½«shadow¼Ä´æÆ÷ÄÚÈݸ´ÖƵ½¿ØÖƼĴæÆ÷ 0£º½ûÖ¹×Ô¶¯¸üР1£ºÊ¹ÄÜ×Ô¶¯¸üРעÒ⣺½öͨµÀ0~6Ö§³Ö´Ë¹¦ÄÜ£¬Í¨µÀ7~10Î޴˼ĴæÆ÷ Ïà¹Øº¯Êý */ void DMA_CHxCR_CIRC_UPD_Setable(DMA_CH_Type CHx, FunState NewState) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); if (NewState == ENABLE) { *pREG |= (DMA_CHxCR_CIRC_UPD_Msk); } else { *pREG &= ~(DMA_CHxCR_CIRC_UPD_Msk); } } FunState DMA_CHxCR_CIRC_UPD_Getable(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);; if (*pREG & (DMA_CHxCR_CIRC_UPD_Msk)) { return ENABLE; } else { return DISABLE; } } /* ͨµÀ´«Êä·½Ïò 0£º´ÓÍâÉè¶ÁÈ¡Êý¾ÝдÈëRAM 1£º´ÓRAM¶ÁÈ¡Êý¾ÝдÈëÍâÉè Ïà¹Øº¯Êý */ void DMA_CHxCR_DIR_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);//DMA->CH0CTRL; tmpreg = *pREG; tmpreg &= ~(DMA_CHxCR_DIR_Msk); tmpreg |= (SetValue&DMA_CHxCR_DIR_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCR_DIR_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); return (*pREG & DMA_CHxCR_DIR_Msk); } /* ´«Êä´ø¿íÉèÖà 00£º×Ö½Ú£¬8bit 01£º°ë×Ö£¬16bit 10£º×Ö£¬32bit 11£ºRFU Ïà¹Øº¯Êý */ void DMA_CHxCR_BDW_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);//DMA->CH0CTRL; tmpreg = *pREG; tmpreg &= ~(DMA_CHxCR_BDW_Msk); tmpreg |= (SetValue&DMA_CHxCR_BDW_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCR_BDW_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); return (*pREG & DMA_CHxCR_BDW_Msk); } /* Ñ­»·»º³åģʽ 0£º¹Ø±ÕÑ­»·Ä£Ê½ 1£ºÊ¹ÄÜÑ­»·Ä£Ê½ Ïà¹Øº¯Êý */ void DMA_CHxCR_CIRC_Setable(DMA_CH_Type CHx, FunState NewState) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); if (NewState == ENABLE) { *pREG |= (DMA_CHxCR_CIRC_Msk); } else { *pREG &= ~(DMA_CHxCR_CIRC_Msk); } } FunState DMA_CHxCR_CIRC_Getable(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);; if (*pREG & (DMA_CHxCR_CIRC_Msk)) { return ENABLE; } else { return DISABLE; } } /* Channelx´«ÊäÍê³ÉÖжÏʹÄÜ 1£ºÊ¹ÄÜ´«ÊäÍê³ÉÖÐ¶Ï 0£º¹Ø±Õ´«ÊäÍê³ÉÖÐ¶Ï Ïà¹Øº¯Êý */ void DMA_CHxCR_CHxFTIE_Setable(DMA_CH_Type CHx, FunState NewState) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); if (NewState == ENABLE) { *pREG |= (DMA_CHxCR_CHxFTIE_Msk); } else { *pREG &= ~(DMA_CHxCR_CHxFTIE_Msk); } } FunState DMA_CHxCR_CHxFTIE_Getable(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);; if (*pREG & (DMA_CHxCR_CHxFTIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* Channelx°ë³Ì´«ÊäÍê³ÉÖжÏʹÄÜ 1£ºÊ¹Äܰë³ÌÖÐ¶Ï 0£º¹Ø±Õ°ë³ÌÖÐ¶Ï Ïà¹Øº¯Êý */ void DMA_CHxCR_CHxHTIE_Setable(DMA_CH_Type CHx, FunState NewState) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); if (NewState == ENABLE) { *pREG |= (DMA_CHxCR_CHxHTIE_Msk); } else { *pREG &= ~(DMA_CHxCR_CHxHTIE_Msk); } } FunState DMA_CHxCR_CHxHTIE_Getable(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);; if (*pREG & (DMA_CHxCR_CHxHTIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* ChannelxʹÄÜ 1£ºÆô¶¯Í¨µÀ0 0£º¹Ø±ÕͨµÀ0 Ïà¹Øº¯Êý */ void DMA_CHxCR_ChxEN_Setable(DMA_CH_Type CHx, FunState NewState) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8); if (NewState == ENABLE) { *pREG |= (DMA_CHxCR_ChxEN_Msk); } else { *pREG &= ~(DMA_CHxCR_ChxEN_Msk); } } FunState DMA_CHxCR_ChxEN_Getable(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x04 + CHx*8);; if (*pREG & (DMA_CHxCR_ChxEN_Msk)) { return ENABLE; } else { return DISABLE; } } /* Channelx´æ´¢Æ÷Ö¸ÕëµØÖ·£¬DMA´«ÊäÆô¶¯Ç°Èí¼þÏò´Ë¼Ä´æÆ÷дÈë´æ´¢Æ÷Ä¿±êµØÖ·¡£ µ±Ö¸ÕëÖ¸Ïò¿ÕµØÖ·Ê±£¬DMA·ÃÎʽ«´¥·¢hardfault µ±Ö¸ÕëÖ¸ÏòFlashʱ£¬½ûÖ¹ÏòFlashдÈëÊý¾Ý¡£ Èí¼þ¿ÉÒÔ²éѯµ±Ç°DMA´«ÊäµÄÄ¿±ê´æ´¢Æ÷µØÖ·¡£ ×¢Ò⣺´ËÖ¸Õë½ûÖ¹Ö¸Ïò0x00080000~0x1FFFFFFFµØÖ·£¬Õâ¶ÎµØÖ·Îªflash±£ÁôÐÅÏ¢Çø£¬Ö¸ÏòÕâ¶ÎµØÖ·¿ÉÄÜÔÚDMA·ÃÎÊÖе¼Ö²»¿ÉÔ¤¼ÆµÄ½á¹û Ïà¹Øº¯Êý */ void DMA_CHxMAR_Write(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 8 + CHx*8); *pREG = SetValue; } uint32_t DMA_CHxMAR_Read(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 8 + CHx*8); return (*pREG); } /* Channel11´«Ê䳤¶È£¬1-8192´Î´«Ê䣬½öÔÚFlash->RAM´«ÊäʱÓÐЧ£¬RAM->Flash´«ÊäΪ¹Ì¶¨³¤¶È64´Î´«Êä Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11TSIZE_Set(uint32_t SetValue) { uint32_t tmpreg; SetValue <<= DMA_CH11CR_CH11TSIZE_Pos; tmpreg = DMA->CH11CR; tmpreg &= ~(DMA_CH11CR_CH11TSIZE_Msk); tmpreg |= (SetValue & DMA_CH11CR_CH11TSIZE_Msk); DMA->CH11CR = tmpreg; } uint32_t DMA_CH11CR_CH11TSIZE_Get(void) { return (uint32_t)((DMA->CH11CR & DMA_CH11CR_CH11TSIZE_Msk) >> DMA_CH11CR_CH11TSIZE_Pos); } /* Channel11ÓÅÏȼ¶ 00£ºLow 01£ºMedium 10£ºHigh 11£ºVery High Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11PRI_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = DMA->CH11CR; tmpreg &= ~(DMA_CH11CR_CH11PRI_Msk); tmpreg |= (SetValue & DMA_CH11CR_CH11PRI_Msk); DMA->CH11CR = tmpreg; } uint32_t DMA_CH11CR_CH11PRI_Get(void) { return (DMA->CH11CR & DMA_CH11CR_CH11PRI_Msk); } /* Channel11´«Êä·½Ïò 1£ºFlash->RAM´«Êä 0£ºRAM->Flash´«Êä Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11DIR_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = DMA->CH11CR; tmpreg &= ~(DMA_CH11CR_CH11DIR_Msk); tmpreg |= (SetValue & DMA_CH11CR_CH11DIR_Msk); DMA->CH11CR = tmpreg; } uint32_t DMA_CH11CR_CH11DIR_Get(void) { return (DMA->CH11CR & DMA_CH11CR_CH11DIR_Msk); } /* Channel11 RAMµØÖ·Ôö¼õÉèÖ㬽öÔÚFlash->RAM´«ÊäÖÐÓÐЧ 1£ºRAMµØÖ·µÝÔö 0£ºRAMµØÖ·µÝ¼õ Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11RI_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = DMA->CH11CR; tmpreg &= ~(DMA_CH11CR_CH11RI_Msk); tmpreg |= (SetValue & DMA_CH11CR_CH11RI_Msk); DMA->CH11CR = tmpreg; } uint32_t DMA_CH11CR_CH11RI_Get(void) { return (DMA->CH11CR & DMA_CH11CR_CH11RI_Msk); } /* Channel11 FlashµØÖ·Ôö¼õÉèÖ㬽öÔÚFlash->RAM´«ÊäÖÐÓÐЧ 1£ºFlashµØÖ·µÝÔö 0£ºFlashµØÖ·µÝ¼õ Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11FI_Set(uint32_t SetValue) { uint32_t tmpreg; tmpreg = DMA->CH11CR; tmpreg &= ~(DMA_CH11CR_CH11FI_Msk); tmpreg |= (SetValue & DMA_CH11CR_CH11FI_Msk); DMA->CH11CR = tmpreg; } uint32_t DMA_CH11CR_CH11FI_Get(void) { return (DMA->CH11CR & DMA_CH11CR_CH11FI_Msk); } /* Channel11´«ÊäÍê³ÉÖжÏʹÄÜ 1£ºÊ¹ÄÜ´«ÊäÍê³ÉÖÐ¶Ï 0£º¹Ø±Õ´«ÊäÍê³ÉÖÐ¶Ï Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11FTIE_Setable(FunState NewState) { if (NewState == ENABLE) { DMA->CH11CR |= (DMA_CH11CR_CH11FTIE_Msk); } else { DMA->CH11CR &= ~(DMA_CH11CR_CH11FTIE_Msk); } } FunState DMA_CH11CR_CH11FTIE_Getable(void) { if (DMA->CH11CR & (DMA_CH11CR_CH11FTIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* Channel11°ë³Ì´«ÊäÍê³ÉÖжÏʹÄÜ 1£ºÊ¹Äܰë³ÌÖÐ¶Ï 0£º¹Ø±Õ°ë³ÌÖÐ¶Ï Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11HTIE_Setable(FunState NewState) { if (NewState == ENABLE) { DMA->CH11CR |= (DMA_CH11CR_CH11HTIE_Msk); } else { DMA->CH11CR &= ~(DMA_CH11CR_CH11HTIE_Msk); } } FunState DMA_CH11CR_CH11HTIE_Getable(void) { if (DMA->CH11CR & (DMA_CH11CR_CH11HTIE_Msk)) { return ENABLE; } else { return DISABLE; } } /* Channel11ʹÄÜ 1£ºÆô¶¯Í¨µÀ0 0£º¹Ø±ÕͨµÀ0 Ïà¹Øº¯Êý */ void DMA_CH11CR_CH11EN_Setable(FunState NewState) { if (NewState == ENABLE) { DMA->CH11CR |= (DMA_CH11CR_CH11EN_Msk); } else { DMA->CH11CR &= ~(DMA_CH11CR_CH11EN_Msk); } } FunState DMA_CH11CR_CH11EN_Getable(void) { if (DMA->CH11CR & (DMA_CH11CR_CH11EN_Msk)) { return ENABLE; } else { return DISABLE; } } /* Channel11 FlashÖ¸ÕëµØÖ·£¬DMA´«ÊäÆô¶¯Ç°Èí¼þÏò´Ë¼Ä´æÆ÷дÈëFlashÄ¿±êµØÖ·£¬DMAÆô¶¯ºó´Ë¼Ä´æÆ÷ËæDMA´«Êä×ÔÔö»ò×Ô¼õ Èí¼þ¿ÉÒÔ²éѯµ±Ç°DMA´«ÊäµÄÄ¿±êFlashµØÖ· ´Ë¼Ä´æÆ÷µÍ루bit5-0£©½öÔÚFlash->RAM´«ÊäÖÐÓÐЧ£¬RAM->Flash´«ÊäÖÐĬÈÏ¶ÔÆëFlashµÄhalf-sectorÆðʼµØÖ· Ïà¹Øº¯Êý */ void DMA_CH11FAR_Write(uint32_t SetValue) { DMA->CH11FAR = ((SetValue >> 2) & DMA_CH11FAR_CH11FLSAD_Msk); } uint32_t DMA_CH11FAR_Read(void) { return (DMA->CH11FAR & DMA_CH11FAR_CH11FLSAD_Msk); } /* Channel7 RAM×ÖÖ¸ÕëµØÖ·£¬DMA´«ÊäÆô¶¯Ç°Èí¼þÏò´Ë¼Ä´æÆ÷дÈëRAMÄ¿±êµØÖ·£¨wordµØÖ·£©£¬DMAÆô¶¯ºó´Ë¼Ä´æÆ÷ËæDMA´«Êä×ÔÔö»ò×Ô¼õ Èí¼þ¿ÉÒÔ²éѯµ±Ç°DMA´«ÊäµÄÄ¿±êRAMµØÖ· Ïà¹Øº¯Êý */ void DMA_CH11RAR_Write(uint32_t SetValue) { DMA->CH11RAR = ((SetValue >> 2) & DMA_CH11RAR_CH7RAMAD_Msk); } uint32_t DMA_CH11RAR_Read(void) { return (DMA->CH11RAR & DMA_CH11RAR_CH7RAMAD_Msk); } /* DMA´«Ê䵨ַ´íÎó±êÖ¾£¬µ±´æ´¢Æ÷Ö¸Õ볬¹ýRAMºÍFlashºÏ·¨µØÖ··¶Î§Ê±ÖÃλ Ïà¹Øº¯Êý */ void DMA_ISR_DMA_ADDRERR_Clr(void) { DMA->ISR = DMA_ISR_DMA_ADDRERR_Msk; } FlagStatus DMA_ISR_DMA_ADDRERR_Chk(void) { if (DMA->ISR & DMA_ISR_DMA_ADDRERR_Msk) { return SET; } else { return RESET; } } /* DMAͨµÀx´«ÊäÍê³É±êÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã 1£º¶ÔӦͨµÀ´«ÊäÍê³É 0£º¶ÔӦͨµÀ´«ÊäδÍê³É Ïà¹Øº¯Êý */ void DMA_ISR_DMACHFT_Clr(DMA_CH_Type CHx) { DMA->ISR = ((1 << DMA_ISR_DMACHFT_Pos) << CHx); } FlagStatus DMA_ISR_DMACHFT_Chk(DMA_CH_Type CHx) { if (DMA->ISR & ((1 << DMA_ISR_DMACHFT_Pos) << CHx)) { return SET; } else { return RESET; } } /* DMAͨµÀx´«Êä°ë³Ì±êÖ¾£¬Ó²¼þÖÃ룬Èí¼þд1ÇåÁã Ïà¹Øº¯Êý */ void DMA_ISR_DMACHHT_Clr(DMA_CH_Type CHx) { DMA->ISR = (1 << DMA_ISR_DMACHHT_Pos) << CHx; } FlagStatus DMA_ISR_DMACHHT_Chk(DMA_CH_Type CHx) { if (DMA->ISR & ((1 << DMA_ISR_DMACHHT_Pos) << CHx)) { return SET; } else { return RESET; } } /* Channelx´«Ê䳤¶Èshadow¼Ä´æÆ÷£»Ñ­»·Ä£Ê½ÏÂÈç¹ûʹÄÜÁËCIRC_UPD¼Ä´æÆ÷£¬ÔòÔÚ±¾ÂÖ´«ÊäÍê³Éºó½«shadow¼Ä´æÆ÷Öµ¸´ÖƵ½CHxTSIZEÖС£ Ïà¹Øº¯Êý */ void DMA_CHxCSR_CHxTSIZE_SDW_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x100 + CHx*8);//DMA->CH0CTRL; SetValue <<= DMA_CHxCSR_CHxTSIZE_SDW_Pos;//ÊÖ¹¤Ìí¼Ó tmpreg = *pREG; tmpreg &= ~(DMA_CHxCSR_CHxTSIZE_SDW_Msk); tmpreg |= (SetValue&DMA_CHxCSR_CHxTSIZE_SDW_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCSR_CHxTSIZE_SDW_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x100 + CHx*8); return (uint32_t)((*pREG & DMA_CHxCSR_CHxTSIZE_SDW_Msk) >> DMA_CHxCSR_CHxTSIZE_SDW_Pos); } /* RAMµØÖ·Ôö¼õÉèÖÃshadow¼Ä´æÆ÷£¬Ñ­»·Ä£Ê½ÏÂÈç¹ûʹÄÜÁËCIRC_UPD¼Ä´æÆ÷£¬ÔòÔÚ±¾ÂÖ´«ÊäÍê³Éºó½«shadow¼Ä´æÆ÷Öµ¸´ÖƵ½CHxTSIZEÖС£ Ïà¹Øº¯Êý */ void DMA_CHxCSR_CHxINC_SDW_Set(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; uint32_t tmpreg; pREG = (uint32_t *)(DMA_BASE + 0x100 + CHx*8);//DMA->CH0CTRL; tmpreg = *pREG; tmpreg &= ~(DMA_CHxCSR_CHxINC_SDW_Msk); tmpreg |= (SetValue&DMA_CHxCSR_CHxINC_SDW_Msk); *pREG = tmpreg; } uint32_t DMA_CHxCSR_CHxINC_SDW_Get(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x100 + CHx*8); return (*pREG & DMA_CHxCSR_CHxINC_SDW_Msk); } /* Channelx´æ´¢Æ÷Ö¸ÕëµØÖ·Ó°×ӼĴæÆ÷¡£ Ñ­»·Ä£Ê½ÏÂÈç¹ûʹÄÜÁËCIRC_UPD¼Ä´æÆ÷£¬ÔòÔÚ±¾ÂÖ´«ÊäÍê³Éºó½«shadow¼Ä´æÆ÷Öµ¸´ÖƵ½CHxMEMADÖС£ Ïà¹Øº¯Êý */ void DMA_CHxMASR_Write(DMA_CH_Type CHx, uint32_t SetValue) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x104 + CHx*8); *pREG = SetValue; } uint32_t DMA_CHxMASR_Read(DMA_CH_Type CHx) { uint32_t *pREG; pREG = (uint32_t *)(DMA_BASE + 0x104 + CHx*8); return (*pREG); } void DMA_DeInit(void) { RMU_PRSTEN_Write(0x13579BDF); RMU_AHBRST_DMARST_Setable(ENABLE); RMU_AHBRST_DMARST_Setable(DISABLE); RMU_PRSTEN_Write(0x00000000); } void DMA_Init(DMA_InitTypeDef *para) { if (DMA_CH11 == para->CHx) { DMA_CHxCR_ChxEN_Setable(para->CHx, DISABLE); // ͨµÀ¹Ø±ÕʹÄÜ DMA_CH11CR_CH11TSIZE_Set(para->CHxTSIZE); // ͨµÀ´«Ê䳤¶È DMA_CH11CR_CH11PRI_Set(para->CHxPRI); // ͨµÀÓÅÏȼ¶ DMA_CH11CR_CH11DIR_Set(para->CHxDIR); // Êý¾Ý´«Êä·½Ïò DMA_CH11CR_CH11RI_Set(para->CH11RI); // RAMÔö³¤·½Ïò DMA_CH11CR_CH11FI_Set(para->CH11FI); // FLSÔö³¤·½Ïò DMA_CH11CR_CH11FTIE_Setable(para->CHxFTIE); // ´«ÊäÍê³ÉÖÐ¶Ï DMA_CH11CR_CH11HTIE_Setable(para->CHxHTIE); // ´«Êä°ëÂúÖÐ¶Ï DMA_CHxMAR_Write(para->CHx, para->CHxRAMAD); // DMA´«ÊäRAMµØÖ· DMA_CH11FAR_Write(para->CH11FLSAD); // DMA´«ÊäFlashµØÖ· DMA_CH11CR_CH11EN_Setable(para->CHxEN); // ͨµÀʹÄÜ } else { DMA_CHxCR_ChxEN_Setable(para->CHx, DISABLE); // ͨµÀ¹Ø±ÕʹÄÜ DMA_CHxCR_CHxTSIZE_Set(para->CHx, para->CHxTSIZE); // ͨµÀ´«Ê䳤¶È DMA_CHxCR_CHxPRI_Set(para->CHx, para->CHxPRI); // ͨµÀÓÅÏȼ¶ DMA_CHxCR_CHxINC_Set(para->CHx, para->CHxINC); // ͨµÀµØÖ·Ôö³¤·½Ïò DMA_CHxCR_CHxSSEL_Set(para->CHx, para->CHxSSEL); // ͨµÀÍâÉèÑ¡Ôñ DMA_CHxCR_DIR_Set(para->CHx, para->CHxDIR); // ͨµÀ´«Êä·½Ïò DMA_CHxCR_BDW_Set(para->CHx, para->CHxBDW); // ͨµÀ´«Êä´ø¿í DMA_CHxCR_CIRC_Setable(para->CHx, para->CHxCICR); // Ñ­»·»º³åģʽ DMA_CHxCR_CHxFTIE_Setable(para->CHx, para->CHxFTIE); // ´«ÊäÍê³ÉÖÐ¶Ï DMA_CHxCR_CHxHTIE_Setable(para->CHx, para->CHxHTIE); // ´«Êä°ëÂúÖÐ¶Ï DMA_CHxMAR_Write(para->CHx, para->CHxRAMAD); // DMA´«ÊäRAMµØÖ· DMA_CHxCR_ChxEN_Setable(para->CHx, para->CHxEN); // ͨµÀʹÄÜ } } /******END OF FILE****/