DMA+DAC+TIMER输出正弦波 自己验证

#define PI 3.1415

u16 DAC_Channel1WaveValue[256]; // 用函数封装

/**********************************************************
// 函数名称:   void  Sine_WaveData(u16 cycle ,u16 *D)
// 函数功能:正弦波形数据产生
***********************************************************/
void Sine_WaveData(u16 num, u16 *D)
{
u16 i;

float Cnt = 0.0;

for(i=0; i<num; i++)
{
Cnt = 2*PI*i/255;  // 0、PI/2、PI、3/2PI、2PI
D[i] = (u16)(2048*(sin(Cnt) + 1));  // 把负值转换为正值
}

}

// DAC通道1输出初始化
void DAC_Channel1Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;

// 开GPIOA、DAC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); // 使能 GPIOA、AFIO 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE); // 使能 DAC 时钟

// PA4初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA

DAC_InitType.DAC_Trigger = DAC_Trigger_T2_TRGO; // 触发功能(TIM2触发)
DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None; // 不适用波形发生
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;// 设置屏蔽/幅值选择器
DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Enable; // DAC输出缓存开
DAC_Init(DAC_Channel_1, &DAC_InitType); // 初始化DAC通道1

DAC_SetChannel1Data(DAC_Align_12b_R, 0); // 12位右对齐,设置DAC初始值

DAC_Cmd(DAC_Channel_1, ENABLE); // 使能DAC1

DAC_DMACmd(DAC_Channel_1, ENABLE); //使能DAC通道1的DMA
}

void DAC_DMAInit(void)
{
DMA_InitTypeDef            DMA_InitStructure;

/* DMA1 clock enable */

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(DAC->DHR12R1); // 外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DAC_Channel1WaveValue; // 内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 外设作为源:内存到外设
DMA_InitStructure.DMA_BufferSize = 256; // DMA要传递的数据个数
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环传输
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);

  /* Enable DMA2 Channel3 */
  DMA_Cmd(DMA2_Channel3, ENABLE); // DMA2_Channel3对应DAC_Channel1

}

// TIMER2触发DAC配置

void DAC_TrigTimConfig(u16 WavePeriod)
{
u16 PrescalerValue;

TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// 开时钟

PrescalerValue = (u16)(48000000 / 1000000) - 1; 

TIM_TimeBaseStructure.TIM_Period = WavePeriod; // 设置输出频率
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; // 不预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update); // 设置TIME输出触发为更新模式

TIM_Cmd( TIM2, ENABLE); // 使能TIM2

}

// DAC波形输出 初始化函数

void DAC_WaveInit(void)
{
Sine_WaveData(256, DAC_Channel1WaveValue); // 生成输出正弦波的波形表
DAC_Channel1Init();
DAC_DMAInit();
DAC_TrigTimConfig(1000);

}

下面是实际项目代码:



猜你喜欢

转载自blog.csdn.net/zn2016/article/details/79489379