[STM32H743] DMA中断服务函数编写流程

[STM32H743] 一次DMA中断事件进入n次中断


1:首先->配置中断
/* 开启DMA1 Stream0的中断 */

    HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);//抢占优先级0,子优先级0
    HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);//使能DAC中断通道

2:编写中断服务函数->判断中断服务函数dma传输是否已经传完-> 然后清除中断
:(建议在中断完成后进行 清中断操作)
(1)如果没有清除中断的操作,则会出现每传输一个数据就进入一次中断,一次DMA中断事件进入n次中断
(2)如果加上清除中断的操作,则是一个周期传输完成后才进入一次中断,这样便能达到自己想要的效果。

void DMA1_Stream0_IRQHandler(void)
{
	 if(__HAL_DMA_GET_FLAG(&hdma_dac1,DMA_FLAG_TCIF0_4))//等待DMA1_Steam0传输完成
	 {
	 //此处编写中断程序
	 //清除中断
	 __HAL_DMA_CLEAR_FLAG(&hdma_dac1,DMA_FLAG_TCIF0_4);//清除DMA1_Steam0传输完成标志 
	}
}

3:注意,要根据自己配置的 DMAx_Streamx 来选择传输完成标志

/* Interrupt & Flag management */

/**
  * @brief  Return the current DMA Stream transfer complete flag.
  * @param  __HANDLE__: DMA handle
  * @retval The specified transfer complete flag index.
  */
#define __HAL_DMA_GET_TC_FLAG_INDEX(__HANDLE__) \
(((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream0))? DMA_FLAG_TCIF0_4 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream0))? DMA_FLAG_TCIF0_4 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream4))? DMA_FLAG_TCIF0_4 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream4))? DMA_FLAG_TCIF0_4 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream1))? DMA_FLAG_TCIF1_5 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream1))? DMA_FLAG_TCIF1_5 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream5))? DMA_FLAG_TCIF1_5 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream5))? DMA_FLAG_TCIF1_5 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream2))? DMA_FLAG_TCIF2_6 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream2))? DMA_FLAG_TCIF2_6 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream6))? DMA_FLAG_TCIF2_6 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream6))? DMA_FLAG_TCIF2_6 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream3))? DMA_FLAG_TCIF3_7 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream3))? DMA_FLAG_TCIF3_7 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA1_Stream7))? DMA_FLAG_TCIF3_7 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)DMA2_Stream7))? DMA_FLAG_TCIF3_7 :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel0))? BDMA_FLAG_TC0    :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel1))? BDMA_FLAG_TC1    :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel2))? BDMA_FLAG_TC2    :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel3))? BDMA_FLAG_TC3    :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel4))? BDMA_FLAG_TC4    :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel5))? BDMA_FLAG_TC5    :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel6))? BDMA_FLAG_TC6    :\
 ((uint32_t)((__HANDLE__)->Instance) == ((uint32_t)BDMA_Channel7))? BDMA_FLAG_TC7    :\
 (uint32_t)0x00000000)
  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
STM32H723的DMA空闲中断是指当DMA传输完成后,触发的中断。在STM32H723系列微控制器中,DMA(Direct Memory Access,直接内存访问)是一种用于高效地进行数据传输的机制。DMA空闲中断可以用于通知主处理器,DMA传输已经完成,可以进行后续的处理。 在配置DMA传输时,可以设置DMA空闲中断使能位,当DMA传输完成后,会触发相应的中断。通过配置中断优先级和中断服务函数,可以在中断发生时执行特定的操作。 要使用DMA空闲中断,需要按照以下步骤进行配置: 1. 初始化DMA控制器和相关外设。 2. 配置DMA传输的源地址、目的地址和传输长度等参数。 3. 使能DMA空闲中断,并设置相应的中断优先级。 4. 编写中断服务函数,在中断服务函数中处理DMA传输完成后的操作。 以下是使用STM32Cube HAL库进行配置的示例代码: ```c // 初始化DMA控制器和相关外设 HAL_DMA_Init(&hdma); // 配置DMA传输参数 hdma.Instance = DMA1_Stream0; hdma.Init.Request = DMA_REQUEST_USART1_RX; hdma.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma.Init.PeriphInc = DMA_PINC_DISABLE; hdma.Init.MemInc = DMA_MINC_ENABLE; hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma.Init.Mode = DMA_NORMAL; hdma.Init.Priority = DMA_PRIORITY_LOW; // 使能DMA空闲中断 __HAL_DMA_ENABLE_IT(&hdma, DMA_IT_TC); // 设置DMA空闲中断的优先级 HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); // 编写DMA空闲中断中断服务函数 void DMA1_Stream0_IRQHandler(void) { if (__HAL_DMA_GET_FLAG(&hdma, DMA_FLAG_TCIF0_4)) { // DMA传输完成后的操作 // ... // 清除中断标志位 __HAL_DMA_CLEAR_FLAG(&hdma, DMA_FLAG_TCIF0_4); } } ``` 以上代码中,通过`__HAL_DMA_ENABLE_IT`函数使能DMA空闲中断,并通过`HAL_NVIC_SetPriority`和`HAL_NVIC_EnableIRQ`函数设置中断优先级和使能中断。在中断服务函数`DMA1_Stream0_IRQHandler`中,可以编写处理DMA传输完成后的操作,并通过`__HAL_DMA_CLEAR_FLAG`函数清除中断标志位。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值