新手上路
- 积分
- 37
- 金钱
- 37
- 注册时间
- 2020-10-2
- 在线时间
- 7 小时
|
本帖最后由 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);
}
|
|