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轉換完成中斷標誌位
}