STM32 DAC+DMA实现正弦波输出,频率不可调

yyang0514 2015-10-20 05:47:29
现象:
无论如何修改TIM6的配置,通过示波器测量输出的波形始终为50Hz的正弦波。请问哪里出问题了。
关键代码如下:


#define DAC_DHR12R2_Address 0x40007414
const uint16_t Sine12bit[32] = { //数据源用来产生波形
2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
uint32_t DualSine12bit[32];
uint32_t Idx = 0;
​int main(void)
{
RCC_Configuration(); //系统时钟初始化
GPIO_Configuration();//端口初始化
USART_Configuration();
for (Idx = 0; Idx < 32; Idx++)
{
//双通道输出正弦波
DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
}
DMA_Configuration();
DAC_Configuration();
/* Enable DMA for DAC Channel1 */
DAC_DMACmd(DAC_Channel_1, ENABLE);
/* TIM6 enable counter */
TIM_Cmd(TIM6, ENABLE);
while (1)
{
}
}
​void TIM_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 预计频率为2K
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 1000;
TIM_TimeBaseStructure.TIM_Prescaler = 35;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
// TIM6 TRGO selection */
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
}
​void DAC_Configuration(void)
{
DAC_InitTypeDef DAC_InitStructure;
// DAC channel1 Configuration
//DAC触发 TIM6触发
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None; //不使用内部波形发生器
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //关闭外部输出缓存
//用DAC输出波形,传输的数据比较多,所以采用DMA传输可以节省CPU的开支
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
// Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is automatically connected to the DAC converter
DAC_Cmd(DAC_Channel_1, ENABLE);
DAC_Cmd(DAC_Channel_2, ENABLE);
}
​void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
//将dma的通道寄存器设为默认值
DMA_DeInit(DMA2_Channel4);
//定义dma外设基地址
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;
//外设作为数据传输的目的地
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 32; //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;
//工作在循环缓存模式,数据传输数目为0时,自动恢复配置初值
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//通道未被设置成内存到内存模式,与循环模式相对
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
//将DMA_InitStructure中指定的参数初始化dma的通道寄存器
DMA_Init(DMA2_Channel4, &DMA_InitStructure);
// Enable DMA2 Channel4
DMA_Cmd(DMA2_Channel4, ENABLE);
}
...全文
628 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rzhpq 2019-05-17
  • 打赏
  • 举报
回复
我怀疑你是定时器分频参数设置错误
yyang0514 2015-10-21
  • 打赏
  • 举报
回复
麻烦大神帮忙看一下。
yyang0514 2015-10-21
  • 打赏
  • 举报
回复
问题已经找到了。 首先DAC的寄存器地址配置错误。 PA4对应DAC通道1,宏定义中DAC寄存器地址为DAC2的地址。导致输出错误。 第二个 问题找到但是不太明白: DAC和DMA结构体必须定义为全局变量才能正常输出波形,如果定义为局部变量就不能正常输出。 请问这是什么原因。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧