OpenEdv-开源电子网

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

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

[复制链接]

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
发表于 2018-3-25 09:13:52 | 显示全部楼层 |阅读模式
1金钱
小弟弄这个很久了,下面我是参考别人库函数版本写的寄存器版本的代码,我真的不知道哪里错了,求指教!!

#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();

}

最佳答案

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

参考这个:http://www.openedv.com/forum.php?mod=viewthread&tid=109411&extra=page%3D1
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-25 09:13:53 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2018-3-25 09:14:27 | 显示全部楼层
这个是103RCT6的板子
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2018-3-25 16:00:52 | 显示全部楼层
不用了,我已经找到问题了 谢谢
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-3-25 17:05:30 | 显示全部楼层
我也在做这个实验,你这个错哪里了,我应该和你错的一样,指导一下啊!1
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-3-25 17:56:59 | 显示全部楼层
找到问题了没有设置,tim6的触发输出。哎!!
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2018-3-26 15:33:37 | 显示全部楼层
jinfeihan57 发表于 2018-3-25 17:56
找到问题了没有设置,tim6的触发输出。哎!!

你是和i寄存器的吗。我上面的代码格式弄错了而且其他也有点错误。可以加我qq:124579202了了,一起解决问题
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2018-3-26 15:48:52 | 显示全部楼层
正点原子 发表于 2018-3-25 09:13
参考这个:http://www.openedv.com/forum.php?mod=viewthread&tid=109411&extra=page%3D1

原子哥你这个是没有用上DMA的。虽然也差不多
回复

使用道具 举报

52

主题

247

帖子

0

精华

高级会员

Rank: 4

积分
997
金钱
997
注册时间
2017-8-19
在线时间
160 小时
 楼主| 发表于 2018-3-26 15:49:30 | 显示全部楼层
正点原子 发表于 2018-3-25 09:13
参考这个:http://www.openedv.com/forum.php?mod=viewthread&tid=109411&extra=page%3D1

不对,看错工程了
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-3-26 20:17:04 | 显示全部楼层
bbq 发表于 2018-3-26 15:33
你是和i寄存器的吗。我上面的代码格式弄错了而且其他也有点错误。可以加我qq:124579202了了,一起解决问 ...

没有看原子哥的例程。我是用的库函数写的(比较快捷),已经实现了相关功能。
回复

使用道具 举报

31

主题

265

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
413
金钱
413
注册时间
2018-1-9
在线时间
65 小时
发表于 2018-3-26 20:22:54 | 显示全部楼层
bbq 发表于 2018-3-26 15:33
你是和i寄存器的吗。我上面的代码格式弄错了而且其他也有点错误。可以加我qq:124579202了了,一起解决问 ...

你这个QQ是不是错了??
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 20:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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