stm32的DA采集DMA方式实现
0赞
发表于 1/25/2013 1:30:11 PM
阅读(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);
