OpenEdv-开源电子网

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

STM32F407ZGT6 寄存器版 使用双通道DAC+TIM2+DMA输出一路正弦波和三角波,频率与计算值相差100倍

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-20
在线时间
15 小时
发表于 2022-3-13 13:00:49 | 显示全部楼层 |阅读模式
13金钱


计算出的输出频率应该为84M/84/500=2Khz,实际输出为20hz。
求救,代码如下为寄存器版本




#include "DAC.h"
const uint32_t  sinwave[100]={2000,2116,2233,2348,2462,2575,2685,2792,2896,2997,3093,3186,3273,3356,3433,3505,3571,3630,3683,3730,3769,3802,3828,3846,3857,3861,3857,3846,3828,3802,3769,3730,3683,3630,3571,3505,3433,3356,3273,3186,3093,2997,2896,2792,2685,2575,2462,2348,2233,2116,2000,1883,1766,1651,1537,1424,1314,1207,1103,1002,906,813,726,643,566,494,428,369,316,269,230,197,171,153,142,139,142,153,171,197,230,269,316,369,428,494,566,643,726,813,906,1002,1103,1207,1314,1424,1537,1651,1766,1883
};
const uint32_t  dertawave[100]={148,223,297,372,446,521,595,669,744,818,893,967,1042,1116,1191,1265,1339,1414,1488,1563,1637,1712,1786,1861,1935,2009,2084,2158,2233,2307,2382,2456,2530,2605,2679,2754,2828,2903,2977,3052,3126,3200,3275,3349,3424,3498,3573,3647,3722,3796, 3870,3796,3722,3647,3573,3498,3424,3349,3275,3200,3126,3052,2977,2903,2828,2754,2679,2605,2530,2456,2382,2307,2233,2158,2084,2009,1935,1861,1786,1712,1637,1563,1488,1414,1339,1265,1191,1116,1042,967,893,818,744,669,595,521,446,372,297,223
};

uint32_t finalwave[100];       
        int Idx;



void DAC_init(){
    RCC->APB1ENR|=1<<29;

                DAC->CR|=1<<1;                                  //输出缓存不使能
    DAC->CR|=1<<2;          //DAC1通道触发 TEN位 置1才能配置下面的东西
                DAC->CR&=~(7<<3);
    DAC->CR|=4<<3;          //定时器TIM2触发DAC1
    DAC->CR|=0<<6;                //不使用波形发生
                DAC->CR|=0<<8;                //屏蔽幅值设置
    DAC->CR|=1<<12;         //DAC1通道DMA使能
                DAC->CR|=1<<0;          //使能DAC1
    //看数据手册可知在双通道模式下DAC2的DMA不需要开启也可以由DAC1的DMA顺带工作
               
                DAC->CR|=1<<(1+16);     //输出缓存不使能
    DAC->CR|=1<<18;         //DAC2通道触发 TEN位 置1才能配置下面的东西
                DAC->CR&=~(7<<19);
                DAC->CR|=4<<19;         //定时器TIM2触发DAC2
    DAC->CR|=0<<(6+16);            //不使用波形发生
                DAC->CR|=0<<(8+16);            //屏蔽幅值设置
    DAC->DHR12RD=0;
    DAC->CR|=1<<16;         //使能DAC2
///////////////////////////////////////
}

void DAC_TIM2_Init(u16 arr,u16 psc){
  RCC->APB1ENR|=1<<0;  //TIM2时钟使能
  TIM2->ARR=arr;     //重装载值
  TIM2->PSC=psc;     //输入时钟分频值

  TIM2->CR2&=~(7<<4);
  TIM2->CR2|=2<<4;    //更新事件触发输出TRGO到DAC
        TIM2->DIER|=1<<8;   //允许更新DMA请求
  TIM2->CR1|=1<<0;    //TIM2使能

}
void DAC_GPIO_Init(){
  RCC->AHB1ENR|=1<<0; //端口A时钟使能
  GPIO_Set(
    GPIOA,             //GPIO端口
    PIN4,          //GPIO引脚
    GPIO_MODE_AIN,      //GPIO模拟输入
    GPIO_OTYPE_PP,      //GPIO推挽输出
    GPIO_SPEED_100M,    //端口速度100M
    GPIO_PUPD_PU);      //上拉
               
        GPIO_Set(
    GPIOA,             //GPIO端口
    PIN5,          //GPIO引脚
    GPIO_MODE_AIN,      //GPIO模拟输入
    GPIO_OTYPE_PP,      //GPIO推挽输出
    GPIO_SPEED_100M,    //端口速度100M
    GPIO_PUPD_PU);      //上拉

}

void DAC_DMA_Init(){
        RCC->AHB1ENR|=1<<21;
  while (DMA1_Stream5->CR&0x01);
  DMA1->HIFCR=0;
  DMA1->LIFCR=0;
  DMA1_Stream5->NDTR=100;         //传输数据量大小
  DMA1_Stream5->M0AR=(u32)finalwave;     //数据存储器地址
  DMA1_Stream5->PAR=(u32)&(DAC->DHR12RD);    //外设地址:DAC存储器地址
        DMA1_Stream5->CR=0;
        DMA1_Stream5->CR&=~(3<<13);
        DMA1_Stream5->CR&=~(3<<11);
        DMA1_Stream5->CR&=~(1<<9);
        DMA1_Stream5->CR&=~(3<<16);
        DMA1_Stream5->CR&=~(3<<6);

        DMA1_Stream5->CR|=1<<6;     //数据传输方向:存储器到外设
        DMA1_Stream5->CR|=1<<8;     //设置循环模式
        DMA1_Stream5->CR|=0<<9;     //外设地址指针不递增
        DMA1_Stream5->CR|=1<<10;    //存储器地址指针递增
        DMA1_Stream5->CR|=2<<11;    //外设数据大小32位(字)
        DMA1_Stream5->CR|=2<<13;    //存储器数据大小32位(字)
  DMA1_Stream5->CR|=3<<16;    //优先级设置高
        DMA1_Stream5->CR|=7<<25;    //选择通道7
        DMA1_Stream5->CR|=1<<0;     //DMA使能
  for (Idx = 0; Idx < 100; Idx++)
  {
    finalwave[Idx] =(dertawave[Idx] << 16) + (sinwave[Idx]);//
  }
}

void DAC_SINWAVE_Init(){
        DAC_GPIO_Init();
        DAC_DMA_Init();
  DAC_TIM2_Init(500-1,84-1);
  DAC_init();

}






最佳答案

查看完整内容[请看2#楼]

定时器的频率是2k,一共有100个点轮询dac输出,确实是20hz
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2022-3-16
在线时间
9 小时
发表于 2022-3-13 13:00:50 来自手机 | 显示全部楼层
定时器的频率是2k,一共有100个点轮询dac输出,确实是20hz
回复

使用道具 举报

11

主题

2142

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4858
金钱
4858
注册时间
2015-1-10
在线时间
609 小时
发表于 2022-3-14 13:43:03 | 显示全部楼层
有没有可能是定时器设错了呢?正常不用DMA的时候就TIMER+DAC能不能实现2K?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-6 14:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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