OpenEdv-开源电子网

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

DMA传输完成中断无法进入

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-5-8
在线时间
2 小时
发表于 2013-5-19 12:16:52 | 显示全部楼层 |阅读模式
      兄弟通过DMA传送ADC的采样数据到了一个数组ADC_BUF[], 现在想进入DMA传送完成中断,在中断中把ADC_BUF[]中的数据读出来处理。但是不知道为啥,只要使能DMA传输完成中断,即: DMA_CHx->CCR|=1<<1;  //允许传输完成中断   ,就出现死机的问题。 
      在原正常程序中只增加以下语句,其他地方都没有变化;
1、DMA初始化程序中,增加
    DMA_CHx->CCR|=1<<1;  //允许传输完成中断  
    MY_NVIC_Init(1,2,DMA1_Channel1_IRQChannel,2);   
2、增加DMA中断服务程序:
void DMA1_Channel1_IRQHandler(void)
{
 if((DMA1->ISR)&(1<<1))        //判断传输完成中断位是否置位
 {
  DMA1->IFCR |= 1<<1 ; //清除完成传输中断
  LED0=!LED0;
 }
}

使能DMA中断后,出现的问题:
1、无法进入其他中断,如定时器4的中断,定时器4的中断初始化:    MY_NVIC_Init(1,1,TIM4_IRQChannel,2);//抢占1,子优先级1,组2     
2、通过硬件仿真,发现没有进入 DMA1_Channel1_IRQHandler,一次都没有;
3、每次停止硬件仿真,就停留在下面这个地方:

看了以下坛里相关的帖子,
void DMA1_Channel1_IRQHandler(void);       在stm32f10x_it.h 中有定义;
DMA1_Channel1_IRQChannel     在 stm32f10x_nvic.H 中有定义:#define DMA1_Channel1_IRQChannel     ((u8)0x0B)  /* DMA1 Channel 1 global Interrupt */

为什么允许DMA中断会导致无法进入其他中断的问题,而且,DMA中断也无法进入? 各位兄弟请多指教,谢谢!


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-19 14:20:38 | 显示全部楼层
我测试了下我们的战舰板DMA例程,没问题。
你看看你是不是通道数搞错了?

实验21 DMA实验_中断版本.rar

137.76 KB, 下载次数: 4221

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-5-8
在线时间
2 小时
 楼主| 发表于 2013-5-19 22:08:34 | 显示全部楼层
DMA配置如下:

void DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 masteraddr,u32 slaveaddr,u16 number) 

dma_m = number;
RCC->AHBENR|=1<<0;//开启DMA1时钟 
delay_ms(5);

DMA_CHx->CPAR=(u32)slaveaddr;    //DMA1 外设地址 ADC1_DR_Address 
DMA_CHx->CMAR=(u32)masteraddr;   //DMA1,ADC 存储器地址 
DMA_CHx->CNDTR= number ;  //DMA1,传输数据量 

DMA_CHx->CCR=0X00000000;//复位 
DMA_CHx->CCR|=1<<7;  //存储器增量模式 
DMA_CHx->CCR|=1<<8;  //外设数据宽度为16位 
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位 
DMA_CHx->CCR|=2<<12; //高优先级 
DMA_CHx->CCR|=1<<5;  //循环模式 

DMA_CHx->CCR|=1<<1;  //允许传输完成中断   
MY_NVIC_Init(3,2,DMA1_Channel1_IRQChannel,2);     



主程序中调用:
DMA_Config(DMA1_Channel1,(u32)&ADC_Buf,(u32)&ADC1->DR,sizeof(ADC_Buf));   //DMA1通道配置


注释掉: DMA_CHx->CCR|=1<<1;  //允许传输完成中断      就没有问题,可以正常传送采样数据,但是使能这个中断,就出问题,郁闷了,硬件仿真看,寄存器中的中断使能都有了 啊
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-5-8
在线时间
2 小时
 楼主| 发表于 2013-5-19 23:55:17 | 显示全部楼层
照着原子哥的程序,把MINI版也做成 中断, 但还是没有办法进中断,啥原因,各位大侠指教,谢谢!

ALIENTEK MINISTM32 实验15 DMA实验_mini版中断,测试,无法进中断.rar

524.54 KB, 下载次数: 1091

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-20 00:25:04 | 显示全部楼层
回复【4楼】junjunyu:
---------------------------------
检查中断名字是否和.s文件里面的一致!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-5-8
在线时间
2 小时
 楼主| 发表于 2013-5-20 10:14:11 | 显示全部楼层
问题解决了,确实和.s文件里面的中断名不一致,这个老帖子说过,没注意是.S文件。搜了一下,.h文件中有相同声明
就觉得是一致的,再提醒一下像我这样的新手,是.S文件,我这里.S是:DMAChannel1_IRQHandler, 不要用void DMA1_Channel1_IRQHandler(void)。

感谢原子提醒,谢谢! 
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-3-25
在线时间
0 小时
发表于 2013-10-31 16:35:55 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
请问,我的程序也出现了相同的原因,DMA传送进不了中断,我检查了我的启动文件.s和中断函数名,启动文件里是DMA1_Channel6_IRQHandler,中断函数名用的是void DMA1_Channel6_IRQHandler(void),但是还是进不了中断,不知道是什么原因呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-31 21:03:57 | 显示全部楼层
回复【7楼】alyssala:
---------------------------------
那就是你中断配置有问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2012-12-27
在线时间
0 小时
发表于 2013-11-26 10:48:00 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
原子哥,我这问题一样,也是不了DMA中断。.s文件查过了,一样;DMA初始化也没有   DMA_CHx->CCR|=1<<1;  //允许传输完成中断  ;程序如下。
void  MYADC_Init(void)
{    
RCC->APB2ENR|=1<<9;     // ADC1时钟使能
__nop();
    __nop();    
RCC->APB2RSTR|=1<<9;    // ADC1复位
RCC->APB2RSTR&=~(1<<9); // 复位结束     
RCC->CFGR|=2<<14; // 72M/6=12M
ADC1->CR2=0x00160100; // [1]=0,单次转换模式;[8]=1,允许DMA访问;[11]=0,右对齐;[19:17]=3,TIM2_CC2触发,[20]=1,使用外部触发
ADC1->SQR1=0;      // 规则通道中只有一个转换,
ADC1->SQR3=0; // 是通道0, ADC_CH0;        
ADC1->SMPR2=0; // 采样时间1.5周期, (1.5+12.5)*1/12=1.17uS
//校准
ADC1->CR2|=1<<0;     // 开启AD转换器  
ADC1->CR2|=1<<3;        // 使能复位校准  
while(ADC1->CR2&1<<3);  // 等待校准结束       
while(ADC1->CR2&1<<2);  // 等待校准结束
ADC1->CR2&=~(1<<0);     // 禁用AD
MYDMA_Init(); // DMA1_Channel1
}
void MYDMA_Init(void)
{
  RCC->AHBENR|=1<<0; // 开启DMA1时钟
  __nop();
__nop();
__nop();
  DMA1_Channel1->CPAR=(u32)(&(ADC1->DR));   // DMA1 外设地址 
DMA1_Channel1->CMAR=(u32)ADC; // DMA1,存储器地址
DMA1_MEM_LEN=(u32)sizeof(ADC);
DMA1_Channel1->CNDTR=DMA1_MEM_LEN; // DMA1,传输数据量
DMA1_Channel1->CCR=0x00002580; // [0]=1,通道开启; [1]TCIE=1,允许传输完成中断;[4]=0,从外设读取数据;[5]=0,普通模式,单次模式;[6]=0,外设地址非增量模式;[7]=1,存储器增量模式;[9:8]=1,[11,10]=1,外设及存储器数据宽度为16位;[13:12]=2,通道高优先级;[14]=0,非存储器到存储器模式
MY_NVIC_Init(2,2,DMA1_Channel1_IRQChannel,2); // 抢占2,子优先级2,组2 
}
//开启一次DMA传输
void DMA_Once(void)
{
DMA1_Channel1->CCR&=~(1<<0);        // 关闭DMA传输, 否则不能修改CNDTR 
DMA1_Channel1->CNDTR=DMA1_MEM_LEN;  // DMA1,传输数据量 
DMA1_Channel1->CCR|=1<<0;           // 开启DMA传输
}

void DMA1_Channel1_IRQHandler  (void)  //DMA1_Channel1_IRQHandler
{
    Bout(8)=1;//标记没有执行到这里

usart_2_usb_send();
Finish_Flag=1;
DMA1->IFCR|=0x0F;   // 清DMA中断标志
}
PB8是标记位,经检测,DMA中断进入不了,求解答。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-27 11:00:49 | 显示全部楼层
你确定DMA已经在运行了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2013-8-29
在线时间
30 小时
发表于 2014-4-3 23:25:11 | 显示全部楼层
不知道楼上诸位怎么解决这个问题的,我也遇到了
回复 支持 反对

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-5-17
在线时间
11 小时
发表于 2015-8-11 18:14:43 | 显示全部楼层
回复【9楼】BULELJ:
---------------------------------
MY_NVIC_Init(2,2,DMA1_Channel1_IRQChannel,2); // 抢占2,子优先级2,组2 这一句是不是有问题,DMA1_Channel1_IRQChannel应该是DMA1_Channel2_IRQn
固步自封于FLASH,只能机械性的运作,人应像翱翔天际的雄鹰,装载高速变化的CPU及强大的存储能力,摆脱老旧的结构束缚,翱翔在智能化信息的海洋。
回复 支持 反对

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2015-5-17
在线时间
11 小时
发表于 2015-8-11 18:19:35 | 显示全部楼层
回复【9楼】BULELJ:
---------------------------------
或者是DMA1_Channel1->CCR中的TCIE位没置1使能
固步自封于FLASH,只能机械性的运作,人应像翱翔天际的雄鹰,装载高速变化的CPU及强大的存储能力,摆脱老旧的结构束缚,翱翔在智能化信息的海洋。
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-3-6
在线时间
11 小时
发表于 2016-3-12 07:07:46 | 显示全部楼层
太给力了,竟然也遇到了同样的问题,
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
99
金钱
99
注册时间
2017-3-28
在线时间
19 小时
发表于 2017-4-10 11:47:50 | 显示全部楼层
正点原子 发表于 2013-5-19 14:20
我测试了下我们的战舰板DMA例程,没问题。
你看看你是不是通道数搞错了?

DMA试验-中断版本,有没有寄存器版本的, 如果有,麻烦发我邮箱一份 2284089712@qq.com
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-8-22
在线时间
11 小时
发表于 2019-8-30 18:31:30 | 显示全部楼层
fylongyin 发表于 2017-4-10 11:47
DMA试验-中断版本,有没有寄存器版本的, 如果有,麻烦发我邮箱一份

我也在搞寄存器的,遇到了点问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 03:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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