历史上的今天
今天是:2025年04月27日(星期日)
2019年04月27日 | 谈谈STM32F051的 ADC DMA用法
2019-04-27 来源:eefocus
首先谈谈引脚 STM32F051R8T6 多达16个 12bit外部AD通道。同时还有片内温度。电压基准,VBAT三个通道。对一般的AD使用来说是完全够用了。16个AD通道分别分布在
AD0 -AD7 对应引脚 是PA0-PA7 AD8-AD9对应引脚PB0-PB1 AD10-AD11对应引脚是PC0-PC5。 在这里我们就以PA0作为一个输入在写个例子。
//#include #include #include #include #include #include "systick.h" #include "LCD32.h" #include "font.h" #define ADC1_DR_Address 0x40012440 volatile uint16_t RegularConvData_Tab; //ÓÃÓÚ´¢´æ´ÓADC¶Áµ½µÄÖµ void LedInit() { GPIO_InitTypeDef gpiostudy; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB ,ENABLE);//ʹÄÜAHBÍâÉèGPIOBʱÖÓ gpiostudy.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 |GPIO_Pin_7; gpiostudy.GPIO_Mode=GPIO_Mode_OUT; gpiostudy.GPIO_Speed=GPIO_Speed_50MHz; gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL; gpiostudy.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOB,&gpiostudy); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC ,ENABLE);//ʹÄÜAHBÍâÉèGPIOCʱÖÓ gpiostudy.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6 |GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14; gpiostudy.GPIO_Mode=GPIO_Mode_OUT; gpiostudy.GPIO_Speed=GPIO_Speed_50MHz; gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL; gpiostudy.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOC,&gpiostudy); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE);//ʹÄÜAHBÍâÉèGPIOAʱÖÓ gpiostudy.GPIO_Pin=GPIO_Pin_11; gpiostudy.GPIO_Mode=GPIO_Mode_OUT; gpiostudy.GPIO_Speed=GPIO_Speed_50MHz; gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL; gpiostudy.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOA,&gpiostudy); } /******************************************************************************** º¯ÊýÃû£ºADC_DMA_Config ¹¦ÄÜ£ºADC DMA³õʼ»¯£¬ADCͨµÀÑ¡Ôñ *******************************************************************************/ void ADC_DMA_Config() { ADC_InitTypeDef ADC_InitStruct; DMA_InitTypeDef DMA_InitStruct; GPIO_InitTypeDef GPIO_InitStruct; ADC_DeInit(ADC1); /* Enable GPIOA clock */ // RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* ADC1 Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* DMA1 clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE); /* Configure PA.0 as analog input */ /*GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOA, &GPIO_InitStruct); */ // PA1,ÊäÈëʱ²»ÓÃÉèÖÃËÙÂÊ /* DMA1 Channel1 Config */ DMA_DeInit(DMA1_Channel1); DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; //ÉèÖÃÍâÉè»ùµØÖ· DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab; DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStruct.DMA_BufferSize =4; DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStruct.DMA_Mode = DMA_Mode_Circular; DMA_InitStruct.DMA_Priority = DMA_Priority_High; DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStruct); // /* ADC DMA request in circular mode */ ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* DMA1 Channel1 enable */ DMA_Cmd(DMA1_Channel1, ENABLE); // /* ADC DMA request in circular mode */ ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* Initialize ADC structure */ ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ContinuousConvMode = ENABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Backward; ADC_StructInit(&ADC_InitStruct); ADC_Init(ADC1, &ADC_InitStruct); // /* Convert the ADC1 temperature sensor with 55.5 Cycles as sampling time */ // ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles); // ADC_TempSensorCmd(ENABLE); /* Convert the ADC1 Vref with 55.5 Cycles as sampling time */ ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_55_5Cycles); // ADC_VrefintCmd(ENABLE); /* ADC Calibration */ ADC_GetCalibrationFactor(ADC1); ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Wait the ADCEN falg */ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); /* ADC1 regular Software Start Conv */ ADC_StartOfConversion(ADC1); //¼ÓÉÏÕâ¸öº¯Êý£¬LCDÏÔʾ³öÎÊÌâ¡£²»¼ÓÕâ¸öº¯Êý£¬LCDÏÔʾÕý³£ } /** * @brief ADC1 channel with DMA configuration * @param None * @retval None */ void ADC1_CH_DMA_Config(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; /* ADC1 DeInit */ ADC_DeInit(ADC1); /* ADC1 Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); /* DMA1 clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE); /* DMA1 Channel1 Config */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 2; 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(DMA1_Channel1, &DMA_InitStructure); /* DMA1 Channel1 enable */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC DMA request in circular mode */ ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular); /* Enable ADC_DMA */ ADC_DMACmd(ADC1, ENABLE); /* Initialize ADC structure */ ADC_StructInit(&ADC_InitStructure); /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits */ ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward; ADC_Init(ADC1, &ADC_InitStructure); /* Convert the ADC1 temperature sensor with 55.5 Cycles as sampling time */ // ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles); // ADC_TempSensorCmd(ENABLE); /* Convert the ADC1 Vref with 55.5 Cycles as sampling time */ ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_55_5Cycles); // ADC_VrefintCmd(ENABLE); /* ADC Calibration */ ADC_GetCalibrationFactor(ADC1); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Wait the ADCEN falg */ while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); /* ADC1 regular Software Start Conv */ ADC_StartOfConversion(ADC1); } int main() { SystemInit(); //GPIO_DeInit(GPIOB); // GPIO_DeInit(GPIOC); LedInit(); // Uart_NVICInit(); // SysTick_Config(SysTick_CLKSource_HCLK); //sistickʱÖÓԴΪAHB ʱÖÓ GPIO_ResetBits(GPIOA,GPIO_Pin_11);//µÆÁÁ Systick_NVICInit(); // Delay(2000); BACK_COLOR=BLACK; POINT_COLOR=WHITE; Lcd_Init(); // /* GPIO_SetBits(GPIOA,GPIO_Pin_11);//µÆÃðÁ Delay(2000); LCD_Clear(RED); GPIO_ResetBits(GPIOA,GPIO_Pin_11);//µÆÁÁ Delay(3000); LCD_Clear(GREEN); Delay(3000); LCD_WR_DATA8(0x0f,0x0f); */ // // // LCD_DrawPoint_big(100,100); // LCD_DrawPoint(100,100); //LCD_Fill(0,0,120,120,BLUE); //LCD_DrawLine(0,0,150,150); // LCD_DrawRectangle(100,100,200,200); //Draw_Circle(100,100,100); //LCD_ShowNum(100,100,102,3);//ʧ°Ü // LCD_ShowChar(10,10,'a',0);//ʧ°Ü LCD_Clear(BLACK); LCD_ShowString(55,30,"ADC-DMA TEST"); ADC1_CH_DMA_Config(); // showhanzi(100,100,0); // showhanzi(135,100,1); //showhanzi(170,100,2); //showimage(); while(1) { // GPIO_ResetBits(GPIOA,GPIO_Pin_11); // Delay(1000); //1s // GPIO_SetBits(GPIOA,GPIO_Pin_11); // Delay(2000); //1s¡ // ADC_ConvertedValueLocal= RegularConvData_Tab; // Delay(1000); //1s /* Test DMA1 TC flag */ while((DMA_GetFlagStatus(DMA1_FLAG_TC1)) == RESET ); /* Clear DMA TC flag */ DMA_ClearFlag(DMA1_FLAG_TC1); LCD_ShowString(20,60,"adc value:"); LCD_ShowNum(120,60,RegularConvData_Tab,4); // ADC1->CR&=(~(1<<2))|(~(1<<0)); // ADC1->CR|=(1<<2); } } DMA方式,最主要的就是配置。配置完了,就什么就不用管了。
史海拾趣
|
第1讲:电容的特性(隔直通交) 电容器是一种能储存电荷的容器.它是由两片靠得较近的金属片,中间再隔以绝缘物质而组成的.按绝缘材料不同,可制成各种各样的电容器.如:云母.瓷介.纸介,电解电容器等.在构造上,又分 ...… 查看全部问答> |
|
电解电容的筛选问题 一剑封喉电解电容是电子镇流器和开关电源产品的一个重要元件,它的质量问题直接影响到整机的质量,大家在各自的公司里是怎样筛选和检验的,希望在此交流一下,可以共同提高各自的技术水平,也可提高整个行业的产品质量,增 ...… 查看全部问答> |
|
在实际工程中,选用何种传输方式需要结合工程的具体情况和工程预算来综合考虑。对于传输距离超过2Km的监控网络,应该考虑选用光纤和光端机。如果传输距离达到数公里或者几十公里,就只有使用光纤了。另外,在一些干扰很强的场合,比如受到工业干扰 ...… 查看全部问答> |
|
CE printf不能用咋办啊??CE 提示建议使用StringCchVPrintfA函数?? 最近移植个库,库以前是在PC上编译的,都是用多字节的printf,在CE下报错, 情况如下: error C2065: \'sprintf_instead_use_StringCbPrintfA_or_StringCchPrintfA\' : undeclared identifier 然后我就按它的提示使用StringCchPrintfA; 定义了 ...… 查看全部问答> |
|
高分征解:初学者学FPGA应该遵循什么样的路线,注意些什么? 在这方面是个文盲,买了块Altera Cyclone II 的开发板,想由简单的开始学习一些模块,但我对开发SOC很感兴趣,未来也有这种需求。需要的模块至少有:简单的CPU,中断控制器(2个中断就行了),定时器/计数器,PWM输出,简单的URAT,简 ...… 查看全部问答> |
|
按开机电源启动不了,要再按重启或者再按几次电源键才能启动 机子去年十一配的,原来也有类似问题,后来换了一个电源就没这种情况了,现在又出现这种情况,难道又是电源问题?哪位达人帮解决一下~… 查看全部问答> |
|
这个问题非常基础但是有几个地方不是很明白: 在画原理图时,大部分需要自己画芯片,一些主要的芯片,库里面总是没有 在画芯片时,关于芯片引脚习惯上都是定义成什么? 我看芯片引脚有:3 state、Bidirectional 、 Input 、Open Collector &nbs ...… 查看全部问答> |
|
在FPGA中遇到的一个奇怪的问题!我在Stratix II GX 中要实现这样一个功能:用20M时钟采集120路数据,然后将这些数据组成每字节10bit,每11字节一帧的数据,其中包括一个帧头。这帧数据每字节速率是260M(因为加了10位的帧头),通过一个GXB将这帧数据 ...… 查看全部问答> |
|
如果我给串口调试助手发送一个字符串“zhangkai”,如果勾上16进制显示,是不是就是串口调试助手把字符串转换为7A 68 61 6E 67 6B 61 69这个了? 在串口调试助手给单片机发数据时,如果选上16进制发送和不选16进制发送有啥区别?发送区填 ...… 查看全部问答> |




