我用L053的例程ADC-MDA方式,DMA中断程序, void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma),为什么 if ((0U != (flag_it & (DMA_FLAG_HT1 << (hdma->ChannelIndex & 0x1cU)))) && (0U != (source_it & DMA_IT_HT))) { /* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */ if((hdma->Instance->CCR & DMA_CCR_CIRC) == 0U) { /* Disable the half transfer interrupt */ __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT); } /* Clear the half transfer complete flag */ hdma->DmaBaseAddress->IFCR = DMA_ISR_HTIF1 << (hdma->ChannelIndex & 0x1cU); /* DMA peripheral state is not updated in Half Transfer */ /* but in Transfer Complete case */ if(hdma->XferHalfCpltCallback != NULL) { /* Half transfer callback */ hdma->XferHalfCpltCallback(hdma); } 为什么 hdma->XferHalfCpltCallback(hdma);这一句仿真不了,提示不能设置断点。仿真时运行到 这一句 hdma->XferErrorCallback(hdma); |
这个程序还有一个问题请问一下:DMA中断有几个选项,半传输中断,全传输中端,但为啥只能进入半传输中断。
这个传输一半的断点是可以仿真的,只要回调函数注册了都是可以的。从你的问上看,已经可以进入了半传输中断了~~ 只能进入半传输中断我猜是因为函数只传输了一个字节,而且是循环模式。再中断的判断中是先判断是否半传输中断标志,所以它占据了C位,只能执行它啦,哈哈~~~ /* ### - 4 - Start conversion in DMA mode ################################# */ if (HAL_ADC_Start_DMA(&AdcHandle, &aResultDMA, 1) != HAL_OK) { Error_Handler();
像这类情况,一般情形我们会关注下优化等级,再就是参数或变量的有效性。具体到这里,你看看你的相关DMA启动函数里有没有定义相应的回调函数,否则为NULL,自然这里就不会得到执行。你自己确认下。
mark,签到+1
这个传输一半的断点是可以仿真的,只要回调函数注册了都是可以的。从你的问上看,已经可以进入了半传输中断 ...
一语道破啊,谢谢!
像这类情况,一般情形我们会关注下优化等级,再就是参数或变量的有效性。具体到这里,你看看你的相关DMA启 ...
是优化等级的问题,谢谢!
是优化等级的问题,谢谢!
谢谢反馈!