OpenEdv-开源电子网

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

原子大哥和各位大侠 我想让两个波形交替产生,想用DMA的乒乓缓冲效应但是不会啊?红色部分怎么设置啊

[复制链接]

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-11-21
在线时间
0 小时
发表于 2013-3-19 19:57:41 | 显示全部楼层 |阅读模式

#include "include.h"
#include "dac.h"
#include "globals.h"      
 ErrorStatus HSEStartUpStatus;
 u32 Sine12bit[32] = {   2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
                         3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909, 
                         599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647
        };

 u32 square[32]={  0,8,16,24,32,41,49,57,
                   65,74,82,90,98,106,115,123,
                   131,139,148,156,164,172,180,189,
                   197,205,213,222,230,238,246,255
    } ;

  u32 DualSine12bit[32];
  u8 Idx = 0;
 


void TIM_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef    TIM_OCInitStructure;
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 0x19;        
    TIM_TimeBaseStructure.TIM_Prescaler = 0x0;     
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); 
     TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
}

//DMA设置
 void DMA_Config()
 {  
  
   DMA_InitTypeDef    DMA_InitStructure;
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
   /* DMA2 channel3 configuration */
   DMA_DeInit(DMA2_Channel3);  //将dma的通道寄存器设为默认值
   DMA_InitStructure.DMA_PeripheralBaseAddr = DAC1_DHR8R1_Address;  //定义dma外设基地址
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)□
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //外设作为数据传输的目的地
   DMA_InitStructure.DMA_BufferSize =32;   //dma缓存大小   
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;     //内存地址寄存器 递增
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;  //外设数据宽度
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   //工作在循环缓存模式,数据传输数目为0时,自动恢复配置初值
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;   //通道未被设置成内存到内存模式,与循环模式相对
   DMA_Init(DMA2_Channel3, &DMA_InitStructure);  //将DMA_InitStructure中指定的参数初始化dma的通道寄存器
 
   /* Enable DMA2 Channel4 */
   DMA_Cmd(DMA2_Channel3, ENABLE);  //使能通道
     /* Enable DAC Channel1 */
   
   DMA_ITConfig(DMA2_Channel3,DMA_IT_TC,ENABLE);//使能中断   传完中断
   /* Enable DMA for DAC Channel1 */
   TIM_Cmd(TIM6, ENABLE);
     }

 


   //DAC设置
   void DAC_Config()
   {  
  DAC_InitTypeDef  DAC_InitStructure;
  TIM_Configuration();
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  DAC_InitStructure.DAC_Trigger =DAC_Trigger_T6_TRGO;   //DAC_Trigger_Software;//DAC_Trigger_None// TIM6 TRGO选为外部转换触发DAC通道 ; 
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;  //DAC_Trigger_T6_TRGO时禁止
     DAC_Init(DAC_Channel_1, &DAC_InitStructure);
  DAC_Cmd(DAC_Channel_1, ENABLE);    
  DMA_Config();

     }

 void DMA2_Channel3_IRQHandler(void)
{
 
 if(DMA_GetITStatus(DMA2_IT_TC3))
  { 
   DMA_ClearITPendingBit(DMA2_IT_TC3);
     
     d=d*(-1);
  if(d==1)
  { 
//   DMA_Cmd(DMA2_Channel3, DISABLE);  //使能通道 
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)□
   DMA_Init(DMA2_Channel3, &DMA_InitStructure);  //将DMA_InitStructure中指定的参数初始化dma的通道寄存器
//   DMA_Cmd(DMA2_Channel3, ENABLE);  //使能通道
   }
 if(d==-1)
  {
//   DMA_Cmd(DMA2_Channel3, DISABLE);  //使能通道
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Sine12bit;
   DMA_Init(DMA2_Channel3, &DMA_InitStructure);  //将DMA_InitStructure中指定的参数初始化dma的通道寄存器
//   DMA_Cmd(DMA2_Channel3, ENABLE);  //使能通道    
  }

 }

  }


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-19 22:11:37 | 显示全部楼层
貌似没问题啊.你下载进去试试看先.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-11-21
在线时间
0 小时
 楼主| 发表于 2013-3-19 22:18:53 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子大哥还是不行啊,
1.0下进去之后还是一样,不进行波形的变换。
2.0单步运行时,两次进入DMA中断后,他就停在死循环那里了。不知道怎么回事?
3.0如果不加DMA_Init(DMA2_Channel3, &DMA_InitStructure);  这句话的话,他能每次都进中断。但是还是不能进行波形的变换。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-19 23:03:47 | 显示全部楼层
回复【3楼】xiaozi:
---------------------------------
停在哪个死循环那里?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2011-9-24
在线时间
9 小时
发表于 2013-3-20 15:31:03 | 显示全部楼层
回复【楼主位】xiaozi:
---------------------------------
貌似你定义的d是无符号型的。怎么会等-1呢?
回复 支持 反对

使用道具 举报

22

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2012-11-21
在线时间
0 小时
 楼主| 发表于 2013-3-20 19:13:12 | 显示全部楼层
回复【5楼】song19881218:
---------------------------------
跟这个应该没关系吧?他进入d==-1的中断了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-22 19:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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