loreng08 发表于 2022-6-4 11:35

DMA半传输中断后一直进入问题请教。先谢谢各路大佬!

本帖最后由 loreng08 于 2022-6-4 12:13 编辑

问题:DMA传输数据长度为10个,当半传输中断后数据传输到第5个后能正常产生中断,但是后面的6、7   、8、 9、10个数据传输时都会进入中断知道传输完成。不能理解后面怎么一直进入中断? 我只需跟传输完成样进入一次中断。
DMA设置代码如下:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA1时钟      
DMA_DeInit(DMA1_Channel5);                                          //使能DMA1的更新中断
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&TIM2->CCR1); //DMA外设TIM2-CH1对应的基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)LED_BYTE_Buffer;//内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                        //设置传输方向:从内存到外设的传输方向
DMA_InitStructure.DMA_BufferSize = 10;                                                //内存缓存器buffer的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;         //设置传输数据时候外设地址是否递增,这里设置不递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                //设置传输数据时候内存地址是否递增,这里设置递增 DMA_MemoryInc_DisableDMA_MemoryInc_Enable
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设传输数据宽度设置,每次传输16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存传输数据宽度设置,每次传输16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                         //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     //DMA通道拥有低优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                         //失能内存到内存的传输方式,即非内存到内存传输
DMA_Init(DMA1_Channel5, &DMA_InitStructure);                              //初始化DMA1通道5
      
DMA_ClearFlag(DMA1_IT_HT5);
DMA_ITConfig(DMA1_Channel5, DMA_IT_HT, ENABLE);                     //DMA传输一半完成中断开启
DMA_Cmd(DMA1_Channel5, ENABLE);                                             //打开DMA通道5


//中断配置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                          
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;   //DMA中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;         //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                   //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);   


中断函数
void DMA1_Channel5_IRQHandler(void)
{
                //传输一半标志
                if(DMA_GetITStatus(DMA1_IT_HT5))
                {
                        DMA_ClearITPendingBit(DMA1_IT_HT5);
                }

}


页: [1]
查看完整版本: DMA半传输中断后一直进入问题请教。先谢谢各路大佬!