你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3657|回复: 0

有没有人知道,STM32 DAC 在DMA模式下启动的每次时间是否固定?

[复制链接]

1

主题

1

回帖

0

蝴蝶豆

初级会员

最后登录
2019-9-25
发表于 2012-11-30 10:06:51 | 显示全部楼层 |阅读模式
 我最近用STM32F103VCT6 的DAC产生两路同频正弦波,通过定时器1延时控制两个波形的相位。但是不知道为什么调节的时候,相位间隔并不是以定时器的分辨率步进,要调节好几个值相位才能动一下,而且相位变动值都不固定。
程序是每次步进一下,重新设置DMA 和DAC ,然后先打开第一路DAC的时钟TIMx1,然后打开定时器,定时中断到就打开第二路的时钟TIMx2,不知道是不是我的程序问题,还是STM32本身启动DMA DAC时间就不确定。
可以确定定时器是没问题,我用IO口翻转做个实验,可以实现很精确的步进。
DMA 和DAC 配置程序如下
 NVIC_SETFAULTMASK();  //关闭总中断
  SysTick_ITConfig(DISABLE);
 TIM_Cmd(TIM2, DISABLE);  /* TIM2 enable counter */
  TIM_Cmd(TIM4, DISABLE);  /* TIM4 enable counter */
  
  DMA_Cmd(DMA2_Channel3, DISABLE);  /* Enable DMA1 Channel3 */ 
  DAC_Cmd(DAC_Channel_1, DISABLE);  /* Enable DAC Channel1 */ 
  DAC_DMACmd(DAC_Channel_1,DISABLE);  /* Enable DMA for DAC Channel1 */
  
  DMA_Cmd(DMA2_Channel4, DISABLE);  /* Enable DMA2 Channel3 */ 
  DAC_Cmd(DAC_Channel_2, DISABLE);  /* Enable DAC Channel2 */ 
  DAC_DMACmd(DAC_Channel_2, DISABLE);  /* Enable DMA for DAC Channel2 */
  TIM_DeInit(TIM2);        /* Resets the TIM2 */
  TIM_DeInit(TIM4);  /* Resets the TIM4 */
  
  TIM_PrescalerConfig(TIM2, 0x00, TIM_PSCReloadMode_Update); /* TIM2 Configuration */
  TIM_SetAutoreload(TIM2, T); //设置定时器2自动重装  
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);        /* TIM2 TRGO selection */


  /* DAC channel1 Configuration */
  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); 


  /* DMA2 channel3 configuration */ 
  DMA_DeInit(DMA2_Channel3);
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R1_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit1;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 256;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  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);


 
  DMA_Cmd(DMA2_Channel3, ENABLE);  /* Enable DMA1 Channel3 */ 
  DAC_Cmd(DAC_Channel_1, ENABLE);  /* Enable DAC Channel1 */ 
  DAC_DMACmd(DAC_Channel_1, ENABLE);  /* Enable DMA for DAC Channel1 */
  //TIM_Cmd(TIM2, ENABLE);  /* TIM2 enable counter */




  TIM_PrescalerConfig(TIM4, 0x00, TIM_PSCReloadMode_Update); /* TIM4 Configuration */
  TIM_SetAutoreload(TIM4, T); //设置定时器4自动重装  
  TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);        /* TIM4 TRGO selection */


    /* DAC channel2 Configuration*/ 
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T4_TRGO;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);


  /* DMA2 channel4 configuration */
  DMA_DeInit(DMA2_Channel4);
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR8R2_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Escalator8bit2;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 256;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA2_Channel4, &DMA_InitStructure);         


  DMA_Cmd(DMA2_Channel4, ENABLE);  /* Enable DMA2 Channel3 */ 
  DAC_Cmd(DAC_Channel_2, ENABLE);  /* Enable DAC Channel2 */ 
  DAC_DMACmd(DAC_Channel_2, ENABLE);  /* Enable DMA for DAC Channel2 */


  
  TIM_Cmd(TIM2, ENABLE);  /* TIM2 enable counter */ //  此次打开第一路DAC 
  NVIC_RESETFAULTMASK();//开放总中断
  Time1_Configuration();   //配置定时器1,用来延时产生第二路DAC,在定时器1中断中打开第二路DAC

 
定时器1中断中启动第二路DAC的程序如下
void TIM1_UP_IRQHandler(void)
{
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE );                                          
TIM_Cmd(TIM1, DISABLE);
 TIM_Cmd(TIM4, ENABLE);  /* TIM4 enable counter */  //此处  打开第二路DAC
SysTick_ITConfig(ENABLE); 
}
回复

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版