关于DAC+DMA+Timer显示正弦波的问题

2019-07-20 08:57发布

小弟弄这个很久了,下面我是参考别人库函数版本写的寄存器版本的代码,我真的不知道哪里错了,求指教!!

#define DAC_DHR12R1    (uint32_t)&(DAC->DHR12R1)   //DAC通道1输出寄存器地址

//正弦波单个周期的点数
#define POINT_NUM 32

/* 波形数据 ---------------------------------------------------------*/
const uint16_t Sine12bit[POINT_NUM] = {
        2048        , 2460        , 2856        , 3218        , 3532        , 3786        , 3969        , 4072        ,
        4093        , 4031        , 3887        , 3668        , 3382        , 3042        ,        2661        , 2255        ,
        1841        , 1435        , 1054        , 714                , 428                , 209                , 65                , 3                        ,
        24                , 127                , 310                , 564                , 878                , 1240        , 1636        , 2048
};

uint32_t DualSine12bit[POINT_NUM];


/*
备注:DAC的配置个人感觉是完全没有问题的
*/
static void DAC_Config(void)
{
        RCC->APB2ENR |= (0x1 << 2);                //开启GPIOA时钟
        RCC->APB1ENR |= (0x1 << 29);        //开启DAC时钟
       
       
        GPIOA->CRL &= ~(0x3 << 18);                //模拟模式   PA4
//GPIOA->CRL &= ~(0x3 << 22);                //模拟模式   PA5
       
       
        DAC->CR |= (0x1 << 0);                                //使能DAC通道1
        DAC->CR |= (0x1 << 1);                                //关闭DAC通道1输出缓存
        DAC->CR |= (0x1 << 2);                                //使能DAC通道1触发
        DAC->CR &= ~(0x7 << 3);                                //TIM6 TRGO事件
        DAC->CR &= ~(0x3 << 6);                                //关闭波形
        DAC->CR |= (0x1 << 12);                                //使能DAC通道1DMA模式
       
//        DAC->CR |= (0x1 << 16);                                //使能DAC通道2
//        DAC->CR |= (0x1 << 17);                                //关闭DAC通道2输出缓存
//        DAC->CR |= (0x1 << 18);                                //使能DAC通道2触发
//        DAC->CR &= ~(0x7 << 19);                                //TIM6 TRGO事件
//        DAC->CR &= ~(0x3 << 22);                                //关闭波形
//        DAC->CR |= (0x1 << 28);                                //使能DAC通道2DMA模式
}


/*
备注:APB1的定时器为72M
*/
static void DAC_TIM_Config(void)
{
        RCC->APB1ENR |= (0x1 << 4);                //TIM6
        TIM6->CR2 |= (0x2 << 4);
        TIM6->DIER &= ~(0x1 << 0);                //禁止更新中断
        TIM6->PSC = 7200-1;
        TIM6->ARR = 10000-1;
        TIM6->CR1 |= (0x1 << 0);                        //使能计数器
}

static void DAC_DMA_Config(void)
{
        RCC->AHBENR |= (0x1 << 1);                //使能DMA2
        delay_ms(5);                                //等待DMA时钟稳定
        DMA2_Channel3->CPAR = DAC_DHR12R1;
        DMA2_Channel3->CMAR = (uint32_t)&DualSine12bit;
        DMA2_Channel3->CNDTR = 32;
        DMA2_Channel3->CCR = 0;
        DMA2_Channel3->CCR |=1<<4;                  //从存储器读
        DMA2_Channel3->CCR |=0<<6;                 //外设地址非增量模式
        DMA2_Channel3->CCR |=1<<7;                  //存储器增量模式
        DMA2_Channel3->CCR |=1<<8;                  //外设数据宽度为16位
        DMA2_Channel3->CCR |=1<<10;                 //存储器数据宽度16位
       
        DMA2_Channel3->CCR |=1<<12;                 //最高优先级
        DMA2_Channel3->CCR |=1<<13;                 //最高优先级
               
        DMA2_Channel3->CCR &= ~(0x1 << 14);                 //非存储器到存储器模式       
        DMA2_Channel3->CCR |=1<<5;                                          //循环发送模式
        DMA2_Channel3->CCR |=1<<0;                                             //开启DMA传输
}

void DAC_Mode_Init(void)
{
        uint32_t Idx = 0;  

        DAC_Config();
        DAC_TIM_Config();       
       
        /* 填充正弦波形数据,双通道右对齐*/
  for (Idx = 0; Idx < POINT_NUM; Idx++)
  {
    DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
  }
       
        DAC_DMA_Config();

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。