LL方式,G0系列,DMA功能配置
DMA功能除了DMA控制器外,加入了DMAMUX功能.DMAMUX相当于在外设(但不仅限于外设)和DMA控制器之间的路由器.可以灵活的配置输入信号到DMA通道的组合.
DAM通道编号从1开始,例如G071为LL_DMA_CHANNEL_1到LL_DMA_CHANNEL_7
DMAMUX通道编号从0开始,通道0对应DMA通道1,例如G071为LL_DMAMUX_CHANNEL_0到LL_DMAMUX_CHANNEL_6
即DMAMUX_CHANNELn对应DMA_CHANNELn-1
配置外设DMA请求和DMA通道映射关系的函数有2个
__STATIC_INLINE void LL_DMAMUX_SetRequestID(DMAMUX_Channel_TypeDef *DMAMUXx, uint32_t Channel, uint32_t Request)
{
(void)(DMAMUXx);
MODIFY_REG((DMAMUX1_Channel0 + Channel)->CCR, DMAMUX_CxCR_DMAREQ_ID, Request);
}
和
__STATIC_INLINE void LL_DMA_SetPeriphRequest(DMA_TypeDef *DMAx, uint32_t Channel, uint32_t Request)
{
(void)(DMAx);
MODIFY_REG(((DMAMUX_Channel_TypeDef *)((uint32_t)DMAMUX1_Channel0 + (DMAMUX_CCR_SIZE * (Channel - 1UL))))->CCR, DMAMUX_CxCR_DMAREQ_ID, Request);
}
两者是等效的,都是对32位DMAMUX_CxCR寄存器的bit5:0(DMAREQ_ID[5:0])进行操作,对于G071,x为0到6,对应7个DMAMUX通道.
DMAMUX.jpg
注意CxCR寄存器的偏移量为4(32位).
观察代码实现,两者对DMAMUX1_Channel0
的地址偏移操作不同.
第一个函数DMAMUX1_Channel0
类型为DMAMUX_Channel_TypeDef *
,即指向DMAMUX_Channel_TypeDef
类型的指针,观察定义可知
typedef struct
{
__IO uint32_t CCR; /*!< DMA Multiplexer Channel x Control Register Address offset: 0x0004 * (channel x) */
}DMAMUX_Channel_TypeDef;
对该指针进行+1操作地址移动4字节.
第二个函数首先是DMAMUX1_Channel0
进行操作,这是一个32位宏定义
#define DMAMUX1_Channel0 ((DMAMUX_Channel_TypeDef *) DMAMUX1_Channel0_BASE)
#define DMAMUX1_BASE (AHBPERIPH_BASE + 0x00000800UL)
#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000UL)
#define PERIPH_BASE (0x40000000UL) /*!< Peripheral base address */
为保证偏移量为4,使用DMAMUX_CCR_SIZE
乘以 通道号-1 ,因为DMA通道号和DMAMUX通道号的对应关系.
#define DMAMUX_CCR_SIZE 0x00000004UL
两个函数的第二个参数Channel
含义不同,可以根据函数名推断,前者为DMAMUX通道号,后者为DMA通道号.
(uint32_t)DMAMUX1_Channel0 + (DMAMUX_CCR_SIZE * (Channel - 1UL)
得到了对应DMAMUX通道的DMAMUX_CxCR寄存器地址,然后将其强制转换为DMAMUX_Channel_TypeDef *
指针.
网友评论