|
本帖最后由 sasmike 于 2015-1-8 16:00 编辑 最近学习了STM32F0芯片,写了一个DMA控制ADC采样程序,给大家分享一下。还是新手,希望大家多提宝贵意见 ![]() 程序在STM32F051上面测试的 基本内容是: 1、使用ADC1的11通道每1us采集一次ADC数值 2、使用DMA1的1通道对采集数据自动存储,共采集1000个数据 3、每次采集1000次数据后,在主函数中对1000次数据进行求平均值 4、由串口1发送到电脑串口上显示 具体程序如下: #include "main.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define ADC_DR_Address 0x40012440 #define ADC_BUFFER_SIZE 1000 /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ __IO uint16_t ADC_Buffer[ADC_BUFFER_SIZE]; __IO uint32_t ADC_ConvertedData_Sum; __IO uint16_t ADC_ConvertedData; __IO uint16_t ADC_ConvertedVoltage; /* Private functions ---------------------------------------------------------*/ void Delay(__IO uint32_t nCount); int main(void) { __IO uint16_t index; USART1_GPIO_Init(); printf("This is a ADC DMA Demo...\n"); ADC_DMA_Config(); /* Infinite loop */ while (1) { ADC_StartOfConversion(ADC1); while ((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET) { } ADC_StopOfConversion(ADC1); DMA_ClearFlag(DMA1_FLAG_TC1); ADC_ConvertedData_Sum = 0; for (index = 0; index < ADC_BUFFER_SIZE; index ++) { ADC_ConvertedData_Sum += ADC_Buffer[index]; } ADC_ConvertedData = ADC_ConvertedData_Sum / ADC_BUFFER_SIZE; ADC_ConvertedVoltage = (float)(ADC_ConvertedData * 2980) / 0xFFF + 0.5; printf("------------------------------------\n"); printf("ADC_ConvertedData = %d\n", ADC_ConvertedData); printf("ADC_ConvertedVoltage = %d\n", ADC_ConvertedVoltage); Delay(5000000); } } void ADC_DMA_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; ADC_DeInit(ADC1); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); GPIO_DeInit(GPIOC); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStructure); DMA_DeInit(DMA1_Channel1); DMA_StructInit(&DMA_InitStructure); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); ADC_DMACmd(ADC1, ENABLE); ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_Init(ADC1,&ADC_InitStructure); ADC_ChannelConfig(ADC1, ADC_Channel_11, ADC_SampleTime_239_5Cycles); ADC_GetCalibrationFactor(ADC1); ADC_Cmd(ADC1, ENABLE); while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)) { } } 最后附上源程序:
STM32F0xx-ADC1000_DMA.rar
(2.26 MB, 下载次数: 270)
|
微信公众号
手机版
楼主能否解释一下DMA配置的部分,刚学,总是整不好。
DMA_DeInit(DMA1_Channel1);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Buffer;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = ADC_BUFFER_SIZE;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
能用上就好,多交流啊
以前用的标准库用多了,这个还没有仔细研究
共同学习