STM32F4 ADC1 模擬看門狗【庫函數(shù)操作】
ADC的模擬看門狗用于檢查電壓是否越界。他又上下兩個邊界,可分別在寄存器ADC_HTR和ADC_LTR中設(shè)置。庫函數(shù)是使用ADC_AnalogWatchdogThresholdsConfig設(shè)置的,無論是常規(guī)通道還是注入通道,都非常簡單。
當(dāng)模擬看門狗檢測到電壓高于上限或者低于下限時將會產(chǎn)生看門狗中斷。捕獲這個中斷,可以做出一些應(yīng)對措施。
數(shù)據(jù)手冊上特別之處的一個東西:模擬看門狗說使用的比較數(shù)據(jù)與ADC_CR2寄存器中設(shè)置的數(shù)據(jù)對齊方式無關(guān)。看門狗比較是在數(shù)據(jù)對齊之前完成的。先進(jìn)行看門狗比較,再將數(shù)據(jù)放入ADC_DR數(shù)據(jù)寄存器。
在ST的庫中,只有簡單的三個與看門狗相關(guān)的函數(shù):
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold,uint16_t LowThreshold);
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);
使用ADC_AnalogWatchdogThresholdsConfig設(shè)置觸發(fā)看門狗的上下限
使用ADC_AnalogWatchdogSingleChannelConfig配置要使用模擬看門狗的通道
配置完成后使用ADC_AnalogWatchdogCmd啟動模擬看門狗。
我寫的函數(shù)很簡單,就這么三行。將模擬看門狗加在ADC1的CH1上。代碼如下:
void ADC_WatchdogConfig(void)
{
ADC_AnalogWatchdogSingleChannelConfig(ADC1,ADC_Channel_0);
ADC_AnalogWatchdogThresholdsConfig(ADC1,1500,0xFFF);
ADC_AnalogWatchdogCmd(ADC1,ADC_AnalogWatchdog_SingleRegEnable);
}
NVIC中初始化模擬看門狗:
void NVIC_Config(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置中斷優(yōu)先級分組
NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_Init(&NVIC_InitStructure);
}
捕獲看門狗中斷:
void ADC_IRQHandler(void)
{
ADC_ITConfig(ADC1,ADC_IT_AWD,DISABLE);
if(SET == ADC_GetFlagStatus(ADC1,ADC_FLAG_AWD))
{
ADC_ClearFlag(ADC1,ADC_FLAG_AWD);
ADC_ClearITPendingBit(ADC1,ADC_IT_AWD);
printf("ADC AWD is happened.rn");
}
ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);
}
當(dāng)然,最后別忘了打開ADC的中斷:
ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);