OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 18976|回复: 12

原子哥,请教一下,为什么我的DMA进不了中断

[复制链接]

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
发表于 2011-10-27 10:51:27 | 显示全部楼层 |阅读模式
 我对DMA进行了这样的初始化,但是为什么DMA进不了中断呢?
void DMA_Configuration(void)
{
 DMA_InitTypeDef DMA_InitStructure;
 /*使能DMA时钟*/
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
 /*配置DMA详细参数*/
 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_Value[128][0];
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 DMA_InitStructure.DMA_BufferSize = 5;
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel1 , &DMA_InitStructure);
 /*允许DMA通道1传输*/
 DMA_Cmd(DMA1_Channel1 , ENABLE);
 /*使能DMA通道1中断*/
 DMA_ITConfig(DMA1_Channel1 , DMA_IT_TC , ENABLE);
}

我用了ADC,设置了一个规则组,有五个通道,每个通道AD转换完了之后产生一个DMA请求,将数据读走并存放到一个二维数组中,每产生五个DMA中断的时候说明一个规则组已经转换完了,那么我这个时候要将这个二维数组的一行数据向前平移一行,而这个平移动作我放在DMA中断里面进行的(每五个DMA中断动作一次,但是我在DMA中断里面设置了断点,它就是进不去,而且还有一个怪事,当我开了DMA传输完成中断后,SysTick的中断也进不去了,但是不开DMA传输完成中断的时候SysTick可以正常进入中断,不知道为什么,原子哥帮忙看看哈。。
还要说明一下,我用的是STM32F101C4,DMA传输数据蛮正常,只是进不了中断
下面是NVIC中的设置:
 /*配置DMA的中断通道*/
 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQChannel;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);
 
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-10-28 08:59:20 | 显示全部楼层
TMD终于找到问题了,启动文件和stm32f10x_it.c文件中的函数名不一样,所以进不了中断,累死我了。。。。。。。。。。。。
回复 支持 1 反对 0

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2011-10-27 11:11:22 | 显示全部楼层

我做过串口DMA中断接收
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdio.h"
#include "SysTickDelay.h"

/* Private define ------------------------------------------------------------*/
#define USART1_DR_Base  0x40013804
#define  SRC_USART1_DR (&(USART1->DR))
/* Private variables ---------------------------------------------------------*/
#define SENDBUFF_SIZE   16
vu8 SendBuff[SENDBUFF_SIZE];

 

void DMA_Configuration(void);
void USART1_Configuration(void);
int fputc(int ch, FILE *f);


int main(void)
{

    SystemInit();
 SysTick_Initaize();
 USART1_Configuration();
    DMA_Configuration();               
    while (1)
    {   
    }
 
}


int fputc(int ch, FILE *f)
{
    USART_SendData(USART1, (u8) ch);

    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
    {
    }

    return ch;
}


// Description    : NUSART1设置
void USART1_Configuration(void)
{
    USART_InitTypeDef USART_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
 //USART1_TX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //USART1_RX
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStructure);
    
    USART_Cmd(USART1, ENABLE);
}


void DMA_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输

 DMA_DeInit(DMA1_Channel5);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&(USART1->DR));
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                                      //外设作源头//外设是作为数据传输的目的地还是来源
    DMA_InitStructure.DMA_BufferSize = 16;                                        //DMA缓存的大小 单位在下边设定
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;               //外设地址寄存器不递增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                        //内存地址递增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;        //外设字节为单位
    DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;            //内存字节为单位
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                              //工作在循环缓存模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                            //4优先级之一的(高优先) VeryHigh/High/Medium/Low
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                               //非内存到内存
    DMA_Init(DMA1_Channel5, &DMA_InitStructure);                                    //根据DMA_InitStruct中指定的参数初始化DMA的通道1寄存器  
    DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);                               //DMA5传输完成中断
    USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);                              //使能USART1的接收DMA请求
    DMA_Cmd(DMA1_Channel5, ENABLE);         
  DMA_ClearFlag(DMA1_FLAG_TC5);
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
     NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; 
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority =  3;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);

}

void DMA1_Channel5_IRQHandler(void)
{
 u8 end;
    printf("Start DMA transmission!\r\n");
   if(DMA_GetITStatus(DMA1_IT_TC5))
    {  
  end = DMA_GetCurrDataCounter(DMA1_Channel5);
  DMA_ClearITPendingBit(DMA1_IT_GL5);///* 清中断源
  DMA_ClearFlag(DMA1_FLAG_TC5);   
  //printf("Start DMA transmission!\r\n"); 
  printf("%d\r\n", end);
 printf("%s\r\n", SendBuff);
   }

}

 


 

?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-10-27 12:35:23 | 显示全部楼层
你在DMA初始化的时候为什么进行了一次清除DMA传输完成标志的操作呢,不做这一步不知道有没有影响。
其它的你是用的串口DMA,而我用的是ADC的DMA,别的都一样,设置也基本一样,但为什么我的DMA进不了中断呢?
而且在我后来的调试中发现DMA和传输完成中断、半传输中断、全局中断的标志位都被置位了,但是就是没有进行中断,而且我在后来调试中有意的关闭了其它的中断,只留下了DMA传输完成中断,但是在程序没进行任何中断。呃,搞了一天了,还没找到原因。。。。
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2011-10-27 13:43:47 | 显示全部楼层
我做定时器中断是做过这样的实验,如果不请,它会马上进入中断一次,不是你初始化的值,它会提前进入一次中断,不信你自己做一个定时器中断就明白了。我这么做,本来是定时10S中断的,可是一上电就进入了一次中断,如果加了清标志位它会在10S钟后才中断。这个很明显是让中断进入初始化等待。防止上电进入不稳定的状态。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

19

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2011-9-19
在线时间
8 小时
 楼主| 发表于 2011-10-27 15:27:57 | 显示全部楼层
我试了,但是它就是不进中断,我就奇了怪了,我也开了中断,调试的时候也看到了中断标志一直都是被置位状态,我在中断服务程序中设了断点,它就是不进去,郁闷。。。。。。。
回复 支持 反对

使用道具 举报

9

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2013-2-5
在线时间
18 小时
发表于 2013-3-22 15:16:00 | 显示全部楼层
回复【6楼】baiydcwy:
---------------------------------
不是我要挖坟,我的中断函数名一样为什么也就不去中断,我用的407
话说我有严重的拖延症,怎样才能不做事不拖拖拉拉的呢...
回复 支持 反对

使用道具 举报

2

主题

22

帖子

0

精华

高级会员

Rank: 4

积分
567
金钱
567
注册时间
2010-12-3
在线时间
138 小时
发表于 2013-3-27 15:19:22 | 显示全部楼层
我也是用的407,开的是timer-触发-AD-触发-DMA ,双缓冲循环,同样不进中断,中断标记也都有
为什么?
回复 支持 反对

使用道具 举报

14

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2012-11-18
在线时间
16 小时
发表于 2013-4-21 23:22:01 | 显示全部楼层
回复【8楼】alin:
---------------------------------
我用的407,发现也是进不了中断,不知道你们解决了没有。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2013-7-9
在线时间
0 小时
发表于 2013-7-9 18:23:54 | 显示全部楼层
我用的stm32f103ze DMA中断进不去  函数名void DMAChannel1_IRQHandler(void)  程序是从开发板例程移植的
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2013-7-9
在线时间
0 小时
发表于 2013-7-9 18:24:57 | 显示全部楼层
回复【6楼】baiydcwy:
---------------------------------
你的启动文件里 函数名是什么啊
回复 支持 反对

使用道具 举报

106

主题

418

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2016-7-26
在线时间
123 小时
发表于 2016-11-11 22:02:58 | 显示全部楼层
光合作用 发表于 2013-7-9 18:23
我用的stm32f103ze DMA中断进不去  函数名void DMAChannel1_IRQHandler(void) &n ...

不知道,光和作用是否还在?我也是遇到这样的情况。。。。。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2019-7-2
在线时间
6 小时
发表于 2019-8-27 11:16:04 | 显示全部楼层
baiydcwy 发表于 2011-10-28 08:59
TMD终于找到问题了,启动文件和stm32f10x_it.c文件中的函数名不一样,所以进不了中断,累死我了。。。。。 ...

太感谢了,终于找到原因了,我中断用的 DMA2_Channel3_IRQHandler(),结果怎么都进不了中断,原来是因为我的启动文件用的是 startup_stm32f10x_md.s,它里面只有DMA1的中断,没有DMA2_Channel3_IRQHandler(),之后我把启动文件换成 startup_stm32f10x_hd.s就行了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 23:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表