#define PI
3.1415
// 函数名称: void Sine_WaveData(u16 cycle ,u16 *D)
// 函数功能:正弦波形数据产生
***********************************************************/
void Sine_WaveData(u16 num, u16 *D)
{
u16 i;
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)); // 把负值转换为正值
}
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 */
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
{
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
{
Sine_WaveData(256, DAC_Channel1WaveValue); // 生成输出正弦波的波形表
DAC_Channel1Init();
DAC_DMAInit();
DAC_TrigTimConfig(1000);
u16 DAC_Channel1WaveValue[256]; // 用函数封装
/**********************************************************// 函数名称: void Sine_WaveData(u16 cycle ,u16 *D)
// 函数功能:正弦波形数据产生
***********************************************************/
void Sine_WaveData(u16 num, u16 *D)
{
u16 i;
float Cnt = 0.0;
{
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);
}
下面是实际项目代码: