【转载】STM32的一些认识
1、打开DMA和ADC1的时钟。
在RCC_Configuration()中添加:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
2、配置模拟IO输入口
在GPIO_Configuration()中配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //ADC0 -light GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //ADC9-sound GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOB, &GPIO_InitStructure);
3、配置DMA初始化和ADC初始化
void DMA_Configuration(void) void ADC1_Configuration(void)
4、启动和读值处理ADC数据
启动:ADC_SoftwareStartConvCmd(ADC1, ENABLE);
等待DMA处理完成标志位:if(DMA_GetFlagStatus(DMA_FLAG_TC1)==1)
处理:
5、ADC硬件参考电压的选择:
/*************************************************************************** DMA_InitStructure.DMA_Mode = DMA_Mode_Circular /DMA_Mode_Normal的理解: **************************************************************************/ void DMA_Configuration(void) { DMA_DeInit(DMA_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义DMA外设基地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; // 定义DMA内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据传输的来源(外设传到内存) DMA_DIR_PeripheralDST——内存传到外设 DMA_InitStructure.DMA_BufferSize = 3; //连续转化3个AD通道值 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设寄存器地址不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存寄存器地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //外设数据宽度32bit DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //内存数据宽度32bit DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA模式是循环 DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA没有设置内存到内存传输 DMA_Init(DMA_Channel1, &DMA_InitStructure); DMA_Cmd(DMA_Channel1, ENABLE); }
1 /********************************************************************** 2 3 当SCAN=0时,不管是单次模式还是连续模式都只转换ADC_SQR的第一通道;而当SCAN=1时,不管是单次模式还是连续模式都转换ADC_SQR的所有通道 4 5 如果是单次模式,调用一次ADC_SoftwareStartConvCmd(ADC1, ENABLE);执行一次。如果是连续模式,则会连续转换。 6 7 ***********************************************************************/ 8 9 void ADC1_Configuration(void) 10 { 11 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;// ADC1 ADC2 在独立模式 12 ADC_InitStructure.ADC_ScanConvMode = ENABLE; //ENABLE-ADC多通道扫描, DISABLE-ADC单通道扫描 13 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // ENABLE–ADC连续转化模式 DISABLE–ADC单次转化模式 14 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //由软件触发 15 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据向右对齐 16 ADC_InitStructure.ADC_NbrOfChannel = 3; //连续转化3个AD通道值 17 ADC_Init(ADC1, &ADC_InitStructure); 18 19 //Enable Vrefint channel17 20 ADC_TempSensorVrefintCmd(ENABLE); //channel17 21 22 // ADC1 regular channel17 configuration 23 ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_28Cycles5); //Vref 24 // ADC1 regular channel0 configuration 25 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 2, ADC_SampleTime_28Cycles5); //light 26 // ADC1 regular channel9 configuration 27 ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 3, ADC_SampleTime_28Cycles5); //sound 28 29 // ADC_RegularChannelConfig(ADC1, ADC_Channel_1,4, ADC_SampleTime_55Cycles5); //voltage 30 31 // Enable ADC1 DMA ); 32 ADC_DMACmd(ADC1, ENABLE); 33 34 // Enable ADC1 35 ADC_Cmd(ADC1, ENABLE); 36 37 // Enable ADC1 reset calibaration register 38 ADC_ResetCalibration(ADC1); 39 // Check the end of ADC1 reset calibration register 40 while(ADC_GetResetCalibrationStatus(ADC1)); 41 42 // Start ADC1 calibaration 43 ADC_StartCalibration(ADC1); 44 // Check the end of ADC1 calibration 45 while(ADC_GetCalibrationStatus(ADC1)); 46 } 47 48 /*********************************************************************** 49 50 51 52 53 54 **********************************************************************/ 55 56 void ADC_process_Voltage_Light_Voice(void) 57 { 58 ADC_Cmd(ADC1, ENABLE); 59 DMA_Cmd(DMA_Channel1, ENABLE); 60 61 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 62 // Delay(20); 63 while(1) 64 { 65 if(DMA_GetFlagStatus(DMA_FLAG_TC1)==1) 66 { 67 DMA_ClearFlag(DMA_FLAG_TC1); // Clear Channel 1 DMA_FLAG_TC flag 68 break; 69 } 70 if((DMA_GetFlagStatus(DMA_FLAG_HT1)==1)||(DMA_GetFlagStatus(DMA_FLAG_TE1)==1)) 71 { 72 DMA_ClearFlag(DMA_FLAG_HT1); 73 DMA_ClearFlag(DMA_FLAG_TE1); 74 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 75 } 76 77 } 78 // voltage 79 adv[0] = (float)1.2*4096/(ADC_ConvertedValue[0]&0x0fff); //放大50倍 80 // light 81 adv[1] = (float)(ADC_ConvertedValue[1]&0x0fff)*1.2/(ADC_ConvertedValue[0]&0X0FFF); //放大100倍 82 // sound 83 adv[2] = (float)(ADC_ConvertedValue[2]&0x0fff)*1.2/(ADC_ConvertedValue[0]&0X0FFF); //放大100倍 84 85 ADC_Cmd(ADC1, DISABLE); 86 DMA_Cmd(DMA_Channel1, DISABLE); 87 88 Voltage = adv[0]*50; 89 Light = adv[1]*100; 90 Voice = adv[2]*100; 91 }