OpenEdv-开源电子网

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

紧急求助,DMA中断无法进入!

[复制链接]

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
发表于 2014-1-24 16:37:03 | 显示全部楼层 |阅读模式
想采用DAC双通道+DMA+TIM6触发来实现数据传送,但是出现了一个问题:因为两个DAC要分别传送不同内容,所以使用了两个不同的中断函数,因为在之前顺利的使用了一个DAC+DMA2_Channel3中断函数进行音频的播放,所以心想只要再添加一个DMA的中断即可,但是添加中断之后发现不进入DMA中断,于是屏蔽掉所多余的配置只留下先前成功的DAC+DMA2_Channel3中断,任然测试成功后,把中断改为DMA2_Channel2_IRQn等等都不行,中断函数名字与终端也是对应的。下面是我的代码请教一下哪里出错了?

  DAC_InitTypeDef DAC_InitStructure;
  DMA_InitTypeDef DMA_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  //TIM6配制
  TIM_DeInit(TIM6);
  TIM_SetAutoreload(TIM6, TIM6ARRValue);        //此处应该是设置定时器触发DMA的时间,采样率为22.05KHz        
  TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);       //TIM6 选择TRGO触发源为计时器更新时间
  //使能TIM6更新中断
  TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);     //计时溢出时触发中断
  TIM_Cmd(TIM6, ENABLE);         //启动TIM6
 
 
  DMA_DeInit(DMA2_Channel1);
 
  //DMA1通道3配置  
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8RD_Address; // 单通道8位右对齐     数据的来源
  DMA_InitStructure.DMA_BufferSize = BUFF_SIZE; // 缓冲大小    
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 8位数据宽度
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 8位数据宽度
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&SquareWave; // 内存基址     数据要写到哪里去
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 外设作为数据传输的目的地
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址寄存器不变
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址寄存器递增
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 工作在循环缓存模式
  DMA_InitStructure.DMA_Priority = DMA_Priority_High; // DMA通道x拥有高优先级
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // DMA通道x没有设置为内存到内存传输
  DMA_Init(DMA2_Channel1, &DMA_InitStructure);
  DMA_Cmd(DMA2_Channel1, ENABLE);
  DMA_ITConfig(DMA2_Channel1, DMA_IT_TC | DMA_IT_HT, ENABLE);
 
  //DAC取消初始化设置
  DAC_DeInit();
  DAC_StructInit(&DAC_InitStructure);
  //DAC配制
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO; //选择定时器6做外部触发源
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; // 无波形产生
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; // 禁止输出缓冲

  DAC_Init(DAC_Channel_1, &DAC_InitStructure);         //DAC通道1初始化
  DAC_Cmd(DAC_Channel_1, ENABLE);            //使能DAC通道1:一旦使能了DAC通道1,PA.04将自动连接到DAC转换器
  DAC_DMACmd(DAC_Channel_1, ENABLE);       //使能DMA用于DAC通道1

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel1_IRQn;    //这里尝试过多个中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
下面是中断函数
void DMA2_Channel1_IRQHandler(void)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-1-24 17:38:05 | 显示全部楼层

参考手册第149页,DMA2各个通道一览

 

看看是不是通道选错了

回复 支持 反对

使用道具 举报

60

主题

153

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
369
金钱
369
注册时间
2013-12-23
在线时间
32 小时
 楼主| 发表于 2014-1-25 08:31:14 | 显示全部楼层
真实非常感谢ricefat老师,一语点醒我,确实是通道问题,现在可以正常进中断了,以前都没有看过手册,现在要重视起来,还有一个问题我看到DAC2是由TIM7触发的,我现在需要用到双DAC,DAC1已经设置了TIM6触发了,DAC的配置还需要重新设置一次,设置成TIM7触发吗?还有就是我想把它们设置成异步传输,应该如何设置呢?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 12:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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