想得过程时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_Streamx
MA数据流,DMA1_Stream0~7/DMA2_Stream0~7
//chx
MA通道选择,@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_Streamx
MA数据流,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]
---------------------------------
原子哥帮忙看一下呗。。。。
改成这个 不知道是不是这个原因~~~我的DMA中断也进不去 楼主搞整好了么?如果楼主成功的话,能否给我分享一下
一周热门 更多>