407里adc+dma传输完成进不去中断

2019-07-20 22:12发布

想得过程时adc采样然后把采样值发给dma然后设了一个定长度数组做储存器,每当传输完成时进dma中断,在中断里处理这一批接收到的数据,简单的说就是想abcd处理一次,efgh处理一次,现在就是进不去中断,然后就只能不进中断处理,就成了循环处理,abcd,bcde,cdef这样的处理过程了,求帮助看一看什么原因进不去中断。我在论坛搜了原来f1里有这样问题的是因为和.s文件里函数名不一致导致的,但是我看了一下现在函数名都是一样的还是没办法,程序如下 [mw_shl_code=c,true]#include "dma.h" #include "delay.h" #include "sys.h" #include "led.h" #include "lcd.h" //DMAx的各通道配置 //这里的传输形式是固定的,这点要根据不同的情况来修改 //从存储器->外设模式/8位数据宽度/存储器增量模式 //DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7 //chxMA通道选择,@ref DMA_channel DMA_Channel_0~DMA_Channel_7 //par:外设地址 //mar:存储器地址 //ndtr:数据传输量 void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr) { DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1 { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能 }else { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能 } DMA_DeInit(DMA_Streamx); while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置 /* 配置 DMA Stream */ DMA_InitStructure.DMA_Channel = chx; //通道选择 DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址 DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设(AD)到储存器模式 DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式 DMA_InitStructure.DMA_MemoryInc = 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_Circular;// 使用循环模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//中等优先级 DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输 DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输 DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ITConfig(DMA2_Stream0,DMA_IT_TCIF0,ENABLE);//DMA传输完成中断 DMA_Cmd(DMA2_Stream0, ENABLE); } //开启一次DMA传输 //DMA_StreamxMA数据流,DMA1_Stream0~7/DMA2_Stream0~7 //ndtr:数据传输量 //void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr) //DMA_Cmd(DMA_Streamx, DISABLE); //关闭DMA传输 //while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){} //确保DMA可以被设置 //DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //数据传输量 //DMA_Cmd(DMA_Streamx, ENABLE); //开启DMA传输 void DMA2_Stream0_IRQHandler() { if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0)) //传输完成中断 { DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0); //清除中断标志位 LED0=!LED0;//DS0翻转 delay_ms(200); } }[/mw_shl_code] 主函数里一部分关于dma的 [mw_shl_code=c,true]int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); //初始化延时函数 uart_init(115200); //初始化串口波特率为115200 LED_Init(); //初始化LED LCD_Init(); //初始化LCD接口 POINT_COLOR=RED; LCD_ShowString(30,50,200,16,16,"STM32F4 Core"); LCD_ShowString(30,70,200,16,16,"ADC TEST"); LCD_ShowString(30,90,200,16,16,"QiYue@HIT-PEED"); LCD_ShowString(30,110,200,16,16,"2015/1"); POINT_COLOR=BLUE;//设置字体为蓝 {MOD} LCD_ShowString(30,130,200,16,16,"ADC1_CH5_VAL:"); LCD_ShowString(30,150,200,16,16,"ADC1_CH5_VOL:0.000V"); //先在固定位置显示小数点 MYDMA_Config(DMA2_Stream0,DMA_Channel_0,(u32)&ADC1->DR,(u32)&value,N);//DMA2,STEAM0,CH0,外设为ADC1 //存储器为value,长度为:M*N. Adc_Init(); //初始化ADC TIM3_Int_Init(5000-1,8400-1); //定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计数1000次为0.5s ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);//使得MDA可以循环读取,关键 ADC_DMACmd(ADC1,ENABLE);//ADC1进行DMA使能 while(1) { 。。。。。。。[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。