DMA+DAC+TIMER输出正弦波 自己验证
2018-03-09 10:58
197 查看
#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);
}
下面是实际项目代码:
![](https://img-blog.csdn.net/20180308210716536?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem4yMDE2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180308210819387?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvem4yMDE2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
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);
}
下面是实际项目代码:
相关文章推荐
- STM32 使用DMA+DAC+TIMER输出正弦波
- stm32 DAC+DMA 输出100K正弦波杠杠的!!!
- STM32 双DAC DMA TIM6输出正弦波例子
- STM32 —— 多路DAC(输出电压和正弦波)
- EFM32外设--DMA之Timer+DMA+DAC
- STM32F0系列用timer控制ADC采样,然后DMA传输到Memory或者DAC
- STM32 —— 多路DAC(输出电压和正弦波)
- 如何搭建一个自己的网络验证系统?
- 教程:RSS全文输出,自己动手做。(一)
- 自己写的一个定时器 timer
- actionInvocation.invoke()是什么意思,配置自己的验证拦截器
- 编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推
- Bus System 我对自己无语了。。wa了n次原来输出格式搞错了。唉。
- 运行结果是输出自己输入的数组,求解
- 在自己写的formatName基础上,写个,将时间转化为自定义的输出字符串格式信息
- 自己翻译的一篇stripes验证的官方文档(概述以及错误验证类),有错误的地方大家指出
- PWM输出:神舟IV验证
- n=5时,输出一下 第一行规律是5的平方,4的平方……其中n由用户自己输入
- Delphi - 闲来无事,自己写个Timer玩玩
- File.Copy是Copy完再执行下一句的,自己验证过了。