STM32ADC單通道轉換

T7H發表於2024-03-01

STM32ADC單通道轉換

1. 初始化

ADC功能初始化主要分三部分,GPIO初始化、ADC模式初始化與NVIC初始化。

1.1初始化GPIO

void ADC_GPIO_Config(void)                                  // 配置ADC通道引腳
{
	GPIO_InitTypeDef GPIO_InitStructure;                    // 定義GPIO結構體
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);    // 使能GPIOC時鐘
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;               // 選擇ADC通道引腳
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;           // 設定引腳模式為模擬輸入
	
	GPIO_Init(GPIOC,&GPIO_InitStructure);                   // 初始化引腳
}

1.2 初始化ADC模式

void ADC_MODE_Config(void)
{
	ADC_InitTypeDef ADC_InitStructure;                      // 定義ADC結構體
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE);     // 使能ADC2時鐘
	
	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;      // 設定ADC工作模式為獨立模式
	ADC_InitStructure.ADC_ScanConvMode = DISABLE;           // 設定ADC掃描模式為單通道模式
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;      // 設定ADC連續轉換模式為開啟
	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 設定ADC外部觸發模式為無
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;  // 設定ADC資料對齊模式為右對齊
	ADC_InitStructure.ADC_NbrOfChannel = 1;                 // 設定ADC通道數為1
	ADC_Init(ADC2,&ADC_InitStructure);                      // 初始化ADC2
	
	RCC_ADCCLKConfig(RCC_PCLK2_Div8);                       // 設定ADC時鐘為PCLK2的8分頻
	
	ADC_RegularChannelConfig(ADC2,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);   // 設定ADC通道為11,取樣時間為55.5週期
	
	ADC_ITConfig(ADC2,ADC_IT_EOC,ENABLE);                   // 使能ADC2中斷
	
	ADC_Cmd(ADC2,ENABLE);                                   // 使能ADC2
	
	ADC_ResetCalibration(ADC2);                             // 重置ADC2校準暫存器
	while(ADC_GetResetCalibrationStatus(ADC2));             // 等待ADC2校準暫存器重置完成
	
	ADC_StartCalibration(ADC2);                             // 啟動ADC2校準
	while(ADC_GetCalibrationStatus(ADC2));                  // 等待ADC2校準完成
	
	ADC_SoftwareStartConvCmd(ADC2,ENABLE);                  // 啟動ADC2軟體轉換
}

1.3 初始化NVIC

void ADC_NVIC_Config(void)                                      // ADC2中斷優先順序配置
{
	NVIC_InitTypeDef NVIC_InitStructure;                        // 定義NVIC_InitTypeDef結構體變數
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);             // 設定NVIC中斷分組1
	
	NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;           // 設定中斷通道為ADC1_2_IRQn
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   // 設定中斷優先順序為1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;          // 設定中斷子優先順序為1
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;             // 使能中斷通道
	
	NVIC_Init(&NVIC_InitStructure);                             // 初始化NVIC_InitTypeDef結構體變數
}

2.中斷函式編寫

中斷函式命名為ADC1_2_IRQHandler即可,換ADC通道的話名字也要換。

void ADC1_2_IRQHandler(void)                            // ADC2中斷服務函式
{
	
	if(ADC_GetITStatus(ADC2,ADC_IT_EOC) == SET)         // 判斷是否為ADC2轉換完成中斷
	{
		ADC_Converted = ADC_GetConversionValue(ADC2);   // 讀取ADC2轉換結果
	}
	ADC_ClearITPendingBit(ADC2,ADC_IT_EOC);             // 清除ADC2轉換完成中斷標誌位
}

相關文章