zyh_126

stm32的DA采集DMA方式实现

0
阅读(4049)

STM32F103系列的处理器内部带有DMA功能,DMA功能可以应用在其AD采集,spi,DA输出接口上,现在我就来给大家介绍下DA输出的DMA实现。stm32的程序开发比较简单,它已把外围接口操作写成了一个函数库,我们只需要了解相关外设的数据结构和函数功能就可以了。stm32f103有两个DMA通道,分为DMA1和DMA2,可以同时分别控制不同的接口。DA输出也只有两个引脚,第一步:设置DA引脚为输出,启动相关时钟;

  /* Configure DAC channe1 output pin */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4| GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  GPIO_SetBits(GPIOC,GPIO_Pin_5);
  GPIO_ResetBits(GPIOC,GPIO_Pin_7);
  GPIO_SetBits(GPIOC,GPIO_Pin_6);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4|GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
   GPIO_ResetBits(GPIOA,GPIO_Pin_3);
 /* TIM6 Configuration */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
  /* AFIO and GPIOA Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
  /* DAC Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

第二部:DMA的输出是要时钟驱动的,我们把定时器6作为DMA输出脉冲

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
  
  
  TIM_PrescalerConfig(TIM6, 0x2b, TIM_PSCReloadMode_Update);
  TIM_SetAutoreload(TIM6, 0xF9);
  /* TIM6 TRGO selection */
  TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);

第三部:DMA初始化,设置DMA传输方式,传输的字节个数,要传输的数据缓冲地址,一次传输的字节位数等信息,具体的了解DMA_initstruct数据结构。

 DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure); 
  DMA_DeInit(DMA2_Channel3);
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&sine_data[1][0];
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 129;
  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);
  DMA_ITConfig(DMA2_Channel3,DMA_IT_TC,ENABLE);

第四部:启动DMA,和定时器6.

 DMA_Cmd(DMA2_Channel3, ENABLE);
  DAC_Cmd(DAC_Channel_1, ENABLE);
  DAC_DMACmd(DAC_Channel_1, ENABLE);
 // TIM_Cmd(TIM6, DISABLE);
  TIM_Cmd(TIM6, ENABLE);