本帖最后由 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_Disable DMA_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);
}
}
|