OpenEdv-开源电子网

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

关于定时器+DMA+DAC双通道输出正弦波求助

[复制链接]

0

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-10-2
在线时间
7 小时
发表于 2021-4-23 14:59:45 | 显示全部楼层 |阅读模式
本帖最后由 FWJ1907851247 于 2021-4-23 15:02 编辑

用定时器+DMA+DAC输出俩个不同频率的正弦波,结果只出了一路,另一个通道没有波形输出,这是我的代码,球球各位大神帮忙看看程序,救救孩子一命。
#include "dac.h"

void Gpio_Init(void)//引脚配置
{
        GPIO_InitTypeDef Dac_gpio_struct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        Dac_gpio_struct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
        Dac_gpio_struct.GPIO_Mode=GPIO_Mode_AIN;
        GPIO_Init(GPIOA,&Dac_gpio_struct);
       
}
void Dac_Init(void)
{
        DAC_InitTypeDef  DAC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
        DAC_InitStructure.DAC_Trigger=DAC_Trigger_T2_TRGO;
        DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;
        DAC_InitStructure.DAC_OutputBuffer=DAC_OutputBuffer_Disable;
        DAC_Init(DAC_Channel_1,&DAC_InitStructure);
        DAC_InitStructure.DAC_Trigger=DAC_Trigger_T6_TRGO;
        DAC_Init(DAC_Channel_2,&DAC_InitStructure);
        DAC_Cmd(DAC_Channel_1,ENABLE);
        DAC_Cmd(DAC_Channel_2,ENABLE);
       
       
}
void Time_Init(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM6,ENABLE);//初始化2宇6的时钟
        TIM_TimeBaseStructure.TIM_Period=1406;//正弦波1频率设置
        TIM_TimeBaseStructure.TIM_ClockDivision=0x0;
        TIM_TimeBaseStructure.TIM_Prescaler=0x0;
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period=469;//600hz
        TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);//正弦波2频率设置
        TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);//更新TIM2输出触发
        TIM_SelectOutputTrigger(TIM6,TIM_TRGOSource_Update);//更新TIM6输出触发
        }
#include "dma.h"
#include <math.h>
#include "dac.h"
uint16_t  DAC1_SIN_BUF[256];  //发送数据缓冲区={0};

void Dma_Init(void)
{
        DMA_InitTypeDef DMA_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);//DMA时钟
        DMA_DeInit(DMA2_Channel3);
        DMA_InitStructure.DMA_BufferSize=256;
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//从内存到外设基地址
        DMA_InitStructure.DMA_PeripheralBaseAddr=DAC_DHR12R1;//指定DMA2的通道3的外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&DAC1_SIN_BUF;//指定内存基地址
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//内存地址需要递增
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//内存的数据长度半字传输
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设的数据长度半字
        DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//DMA循环采集
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
        DMA_Init(DMA2_Channel3, &DMA_InitStructure);
        DMA_Cmd(DMA2_Channel3,ENABLE);
        DAC_DMACmd(DAC_Channel_1,ENABLE);
DMA_DeInit(DMA2_Channel4);
        DMA_InitStructure.DMA_BufferSize=256;
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_PeripheralBaseAddr=DAC_DHR12R2;//指定DMA2的通道3的外设基地址
        DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&DAC1_SIN_BUF;
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
        DMA_Init(DMA2_Channel4, &DMA_InitStructure);
        DMA_Cmd(DMA2_Channel4,ENABLE);
        DAC_DMACmd(DAC_Channel_2,ENABLE);//使能DAC通道的DMA
}

void sine_wave_data(unsigned short cycle)
{

        uint16_t i = 0;

        for (i = 0; i < cycle; i++) {
                DAC1_SIN_BUF = 2048 * sin(1.0 * i / (cycle - 1) * 2 * PI) + 2048;
        }
}
#include "sys.h"
#include "dma.h"
#include "dac.h"

int main(void)
{               
         sine_wave_data(256);
         Gpio_Init();
         Dac_Init();
         Time_Init();
         Dma_Init();
         TIM_Cmd(TIM2,ENABLE);
        TIM_Cmd(TIM6,ENABLE);
         while(1);
}

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

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-3-11
在线时间
15 小时
发表于 2021-5-18 19:56:04 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 21:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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