打印
[STM32F1]

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

[复制链接]
490|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
loreng08|  楼主 | 2022-6-4 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
                }

}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

0

帖子

0

粉丝