ADC的模擬看門狗用於檢查電壓是否越界。他又上下兩個邊界,可分別在寄存器ADC_HTR和ADC_LTR中設置。庫函數是使用ADC_AnalogWatchdogThresholdsConfig設置的,無論是常規通道還是注入通道,都非常簡單。
當模擬看門狗檢測到電壓高於上限或者低於下限時將會產生看門狗中斷。捕獲這個中斷,可以做出一些應對措施。
數據手冊上特別之處的一個東西:模擬看門狗說使用的比較數據與ADC_CR2寄存器中設置的數據對齊方式無關。看門狗比較是在數據對齊之前完成的。先進行看門狗比較,再將數據放入ADC_DR數據寄存器。
在ST的庫中,只有簡單的三個與看門狗相關的函數:
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設置觸發看門狗的上下限
使用ADC_AnalogWatchdogSingleChannelConfig配置要使用模擬看門狗的通道
配置完成后使用ADC_AnalogWatchdogCmd啟動模擬看門狗。
我寫的函數很簡單,就這么三行。將模擬看門狗加在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); //設置中斷優先級分組
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.\r\n");
}
ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);
}
當然,最后別忘了打開ADC的中斷:
ADC_ITConfig(ADC1,ADC_IT_AWD,ENABLE);