STM32 ADC DMA,UART利用DMA传送ADC数据

来源:互联网 发布:网络不给力是什么意思 编辑:程序博客网 时间:2024/05/16 01:33
写此文章目的:
1、记录如何用DMA获取ADC数据,及利用DMA进行uart数据传输
2、注意点:ADC使用的是软件触发,由于启用DMA功能,所以ADC只用利用 ADC_SoftwareStartConvCmd(ADC1, ENABLE)”来启动初次转换,后续自动进行,至于原因暂未搞清,待研究。
本想利用定时器触发转换的,后来看到人家的博文只要软件触发一次就好。
3、望他人指教,谢谢
void DMA_ADC_Init(void){RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel1);ADC_DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_BASE + ADC_DR_OFFSET;//外设地址 ADC_DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC1ConvertedValue;//AD转换数据存储地址 ADC_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA方向,外设到内存 ADC_DMA_InitStructure.DMA_BufferSize = ADC_DMA_BufferSize;//深度 ADC_DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;ADC_DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//目标内存自增 ADC_DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//数据模式半字 ADC_DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//数据模式半字//ADC_DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;ADC_DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//内存写入循环模式 ADC_DMA_InitStructure.DMA_Priority = DMA_Priority_High;ADC_DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel1, &ADC_DMA_InitStructure);  //DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);DMA_Cmd(DMA1_Channel1, ENABLE);}  void ADC1_INIT(void){ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);ADC1_GPIO_Configuration();ADC_DeInit(ADC1);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//单通道 ADC_InitStructure.ADC_ScanConvMode = DISABLE;//多通道扫描关闭 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//单通道连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//无外部转换触发,软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1;ADC_Init(ADC1, &ADC_InitStructure);ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_28Cycles5);    ADC_Cmd(ADC1, ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));ADC_DMACmd(ADC1, ENABLE);}
<pre name="code" class="objc">void USART_Configuration(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);USART1_GPIO_Configuration();USART_DeInit(USART1);USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);DMA_Cmd(DMA1_Channel4, ENABLE);USART_Cmd(USART1, ENABLE);}void DMA_USART_Init(void){RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel4);DMA_DeInit(DMA1_Channel4);  USART_DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_BASE + USART_DR_BASE;USART_DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC1ConvertedValue;USART_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;USART_DMA_InitStructure.DMA_BufferSize = 1;USART_DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;USART_DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;USART_DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;USART_DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;USART_DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;USART_DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;USART_DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel4, &USART_DMA_InitStructure);}
int main(void){   NVIC_Configuration();SysTick_Init();DMA_USART_Init();USART_Configuration();DMA_ADC_Init();ADC1_INIT();ADC_SoftwareStartConvCmd(ADC1, ENABLE);while(1){}//return 0;}


                                             
0 0