看门狗

前言

模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高低阈值,用户可以预先设定个模拟看门狗的上下限电压值,一旦采集到的电压超出该上下限,将会触发模拟看门狗中断。模拟看门狗一般用于检测单个的常规或注入转换通道,或同时检测所有的常规和注入通道。

模块框图

模块框图

模拟看门狗可以预先设置 ADC 转换的高低阈值,ADC_HTR 寄存器来配置 ADC 转换的上限阈值,ADC_LTR 寄存器用来配置ADC 转换的下限阈值。

应用示例

ADC 配置代码

/**
 * @brief ADC configuration
 * @param None
 * @retval None
 */
static void ADC_Config(void)
{
 ADC_ChannelConfTypeDef sConfig;
 ADC_AnalogWDGConfTypeDef AnalogWDGConfig;

 /* Configuration of ADCx init structure: ADC parameters and regular group */
 AdcHandle.Instance = ADCx;
 AdcHandle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; /* Asynchronous
clock mode, input ADC clock not divided */ 
 AdcHandle.Init.Resolution = ADC_RESOLUTION_12B; /* 12-bit
resolution for converted data */
 AdcHandle.Init.DataAlign = ADC_DATAALIGN_RIGHT; /* Rightalignment
for converted data */
 AdcHandle.Init.ScanConvMode = DISABLE; /* Sequencer
disabled (ADC conversion on only 1 channel: channel set on rank 1) */
 AdcHandle.Init.EOCSelection = ADC_EOC_SINGLE_CONV; /* EOC flag
picked-up to indicate conversion end */
 AdcHandle.Init.LowPowerAutoWait = DISABLE; /* Auto-delayed
conversion feature disabled */
 AdcHandle.Init.ContinuousConvMode = DISABLE; /* Continuous
mode disabled to have only 1 conversion at each conversion trig */
 AdcHandle.Init.NbrOfConversion = 1; /* Parameter
discarded because sequencer is disabled */
 AdcHandle.Init.DiscontinuousConvMode = DISABLE; /* Parameter
discarded because sequencer is disabled */
 AdcHandle.Init.NbrOfDiscConversion = 1; /* Parameter
discarded because sequencer is disabled */
 AdcHandle.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T3_TRGO; /* Timer 3
external event triggering the conversion */
 AdcHandle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING; /* Parameter
discarded because software trigger chosen */
 AdcHandle.Init.DMAContinuousRequests = ENABLE; /* DMA circular
mode selected */
 AdcHandle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; /* DR register is
overwritten with the last conversion result in case of overrun */
 AdcHandle.Init.OversamplingMode = DISABLE; /* No
oversampling */
 if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
 {
 /* ADC initialization error */
 Error_Handler();
 }
 /* Configuration of channel on ADCx regular group on sequencer rank 1 */
 /* Note: Considering IT occurring after each ADC conversion if ADC */
 /* conversion is out of the analog watchdog window selected (ADC IT */
 /* enabled), select sampling time and ADC clock with sufficient */
 /* duration to not create an overhead situation in IRQHandler. */
 sConfig.Channel = ADC_CHANNEL_5; /* Sampled channel number */
 sConfig.Rank = ADC_REGULAR_RANK_1; /* Rank of sampled channel number
ADCx_CHANNEL */
 sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5; /* Sampling time (number of clock
cycles unit) */
 sConfig.SingleDiff = ADC_SINGLE_ENDED; /* Single-ended input channel */
 sConfig.OffsetNumber = ADC_OFFSET_NONE; /* No offset subtraction */
 sConfig.Offset = 0; /* Parameter discarded because
offset correction is disabled */
 if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
 {
 /* Channel Configuration Error */
 Error_Handler();
 }

 /* Set analog watchdog thresholds in order to be between steps of DAC */
 /* voltage. */
 /* - High threshold: between DAC steps 1/2 and 3/4 of full range: */
 /* 5/8 of full range (4095 <=> Vdda=3.3V): 2559<=> 2.06V */
 /* - Low threshold: between DAC steps 0 and 1/4 of full range: */
 /* 1/8 of full range (4095 <=> Vdda=3.3V): 512 <=> 0.41V */
 /* Analog watchdog 1 configuration */
 AnalogWDGConfig.WatchdogNumber = ADC_ANALOGWATCHDOG_1;
 AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_ALL_REG;
 AnalogWDGConfig.Channel = ADCx_CHANNELa;
 AnalogWDGConfig.ITMode = ENABLE;
 AnalogWDGConfig.HighThreshold = (RANGE_12BITS * 5/8);
 AnalogWDGConfig.LowThreshold = (RANGE_12BITS * 1/8);
 if (HAL_ADC_AnalogWDGConfig(&AdcHandle, &AnalogWDGConfig) != HAL_OK)
 {
 /* Channel Configuration Error */
 Error_Handler();
 }

}

如上图所示,AnalogWDGConfig 结构体中分别使能了模拟看门狗及中断,设置了电压的上下阈值 HighThreshold 和LowThreshold。模拟参考电压为 3.3V,以上代码设置的下限电压阈值为3.3*1/8=0.41V,上限电压阈值为 3.3*5/8=2.06V。

模拟看门狗中断服务程序

/**
 * @brief Analog watchdog callback in non blocking mode.
 * @param hadc: ADC handle
 * @retval None
 */
 void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
{
 /* Set variable to report analog watchdog out of window status to main */
 /* program. */
 ubAnalogWatchdogStatus = SET;
}

当模拟看门狗检测到电压高于上限或者低于下限时将会产生看门狗中断,中断服务程序触发后,可以做出一些应对措施。这里置了 ubAnalogWatchdogStatus 标志,然后由主程序去根据标志的值去执行相应处理程序。

/* Infinite loop */
 while (1)
 {
 /* Turn-on/off LED1 in function of ADC conversion result */
 /* - Turn-off if voltage is into AWD window */
 /* - Turn-on if voltage is out of AWD window */
 /* Variable of analog watchdog status is set into analog watchdog */
 /* interrupt callback */
 if (ubAnalogWatchdogStatus == RESET)
 {
 BSP_LED_Off(LED1);
 }
 else
 {
 BSP_LED_On(LED1);

 /* Reset analog watchdog status for next loop iteration */
 ubAnalogWatchdogStatus = RESET;
}
}

启动 ADC 转换代码

#define ADCCONVERTEDVALUES_BUFFER_SIZE 256 /* Size of array
aADCxConvertedValues[] */
/* Variable containing ADC conversions results */
__IO uint16_t aADCxConvertedValues[ADCCONVERTEDVALUES_BUFFER_SIZE];
/* Start ADC conversion on regular group with transfer by DMA */
 if (HAL_ADC_Start_DMA(&AdcHandle,
 (uint32_t *)aADCxConvertedValues,
ADCCONVERTEDVALUES_BUFFER_SIZE
 ) != HAL_OK)
 {
 /* Start Error */
 Error_Handler();
 }

使用循环模式 DMA 启动 ADC 转换,DMA 可以降低 CPU 负载。

结论

控制系统中,需要测量严格电压、压力、温度等范围的信号,使用模拟看门狗能够快速地检测到异常状况,并做出相应的应对措施,以确保设备安全。

围观 2608

看门狗电路其实是一个定时器,有一个定时器控制寄存器,可以设定时间(开狗),到达时间后要置位(喂狗),如果没有的话,就认为是程序跑飞,就会发出RESET指令。

看门狗,又叫watchdog timer,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中的输入叫做喂狗,输出一般连接到另外一个部分的复位端,另外一个部分就是所要处理的部分,暂且称之为MCU。

在MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给看门狗电路清零,如果在超过规定的时间不喂狗,WDT定时超时,就会回给一个复位信号到达MCU,使MCU复位,防止MCU死机。总的来说,看门狗电路的作用就是防止程序发生死循环,或者说程序跑飞。

WDT的基本工作原理如下:在整个系统运行以后就启动了看门狗的计数器,此时看门狗就开始自动计时,如果到达了一定的时间还不去给它清零,看门狗计数器就会溢出从而引起看门狗中断,造成系统的复位。

硬件看门狗就是利用了一个定时电路,来监控主程序的运行。在主程序的运行中,我们要在定时时间到达之前对定时器进行复位。

看门狗的作用就是防止程序无限制的运行,造成死循环。它可以用在接收和发送数据时对接受和发送超时的处理,起到保护数据,保护电路的作用。

一般看门狗电路用来监视MCU内部程序运行状态,在程序跑飞或死锁情况下,可以自动复位。不过由于厂家、型号不同可能有些差别。

看门狗电路的工作原理是:当系统工作正常时,CPU将每隔一定时间输出一个脉冲给看门狗,即“喂狗”,若程序运行出现问题或硬件出现故障时而无法按时“喂狗”时,看门狗电路将迫使系统自动复位而重新运行程序。 主要作用是防止程序跑飞或死锁。

看门狗电路图

来源:网络(本文仅供学习参考使用,版权归原作者所有)

围观 1298

天天“喂狗”,还不知道什么姿势能炫出高能?往下看吧!

看门狗功能大家都耳熟能详了,产品在最后量产前为了保证可靠性一般都会将看门狗功能加进去,防止代码在某些意外情况下进入死锁状态从而导致整个系统瘫痪,甚至有些对可靠性要求更高的领域会加入外部看门狗。

通常MCU内部都带有看门狗功能。简单的有软件看门狗(COP),高级一点的叫WDOG。由于COP比较简单,所以这里讲的主要是WDOG。WDOG“喂狗”是很有讲究的,姿势稍有不对可能就会“喂狗”失败,影响系统正常运行。

正确的“喂狗”姿势

1、256个总线周期内初始化看门狗

看门狗配置寄存器需要在解锁看门狗之后的256个总线时钟周期之内完成,也就是说在这256个总线周期之内要快速完成看门狗功能的初始化。所以为了保证安全,在初始化之前最好将全局中断关闭,初始化完后再打开,这样就能确保看门狗初始化不被打扰。

2、“喂狗”不能被打断

喂狗的过程是往看门狗寄存器连续写入0xA602和0xB480两个数,且这个操作必须在20个总线周期内完成。所以在“喂狗”前同样需要将全局中断关闭,“喂狗”完毕后再打开全局中断。

3、“喂狗”间隔大于4个看门狗时钟

对MCU来说,每次“喂狗”的间隔至少4个看门狗时钟以上。在一些系统中,很多用户为了简便,会直接在主函数或某个专门的任务中while(1)死循环的只执行一个“喂狗”操作,这样就有一个潜在的风险,连续“喂狗”操作时长低于4个看门狗时钟。

4、忌讳在定时中断中“喂狗”

有时为了偷懒,不想在程序中一直加“喂狗”函数,投机取巧的就开启一个定时中断,然后在中断中“喂狗”。这看似很巧妙,可以实现“喂狗”。但是这个并不能真正反应出系统是否工作正常,存在系统进入一个错误的死循环或运行出错,但是定时中断还是能产生的风险。

当你看完“喂狗”姿势要领,再回想一下一直以来你的“喂狗”姿势真的对吗?

文章来源:周立功单片机

围观 579

1、概述:

WATCHDOG对于没有底层开发经验的开发人员来说,可能比较陌生,但是它在系统起到非常重要的作用,相当于系统警察,当系统发生严重错误(如程序进入死循环等)不能恢复的时候,WATCHDOG能够让系统重启。WATCHDOG的应用主要是在嵌入式操作系统中,避免了系统在无人干预时长时间挂起的情况。

2、WATCHDOG模块

在比较高档的嵌入式硬件芯片中,都有一个WATCHDOG模块,如果在MCU/MPU中没有集成WATCHDOG,一般会在此嵌入式系统中加一个专门的WATCHDOG芯片来实现WATCHDOG机制。此模块主要的功能包括:

(1)提供WATCHDOG控制寄存器和配置寄存器,供软件开发人员根据系统需要进行灵活配置。

(2)提供一接口,使应用软件能够定时给WATCHDOG“喂狗”。

(3)提供WATCHDOG机制,当系统进入不可恢复错误时,能产生一个不可屏蔽中断来通知系统自动重启(一般这样,也有改变为其他处理方式的),只有相应的复位信号才能清除它。

3、WATCHDOG的实现方式:

对于WATCHDOG模块的实现,不同的硬件芯片有不同的方式,这里介绍2中工作方式:

(1)利用系统操作系统时钟来实现WATCHDOG

在Intel XScale系列中,利用了操作系统时钟的比较寄存器3(OSMR3)做为WATCHDOG的运行主体,当系统的WATCHDOG激活后,软件就必须在一定时间内从OSMR3读出当前的计数,然后加上一定的计数值(下一次到期的计数值),再写回到OSMR3中,软件一直周期性的重复这个过程,如果软件没有重新写入新的计数使定时器到期,此OSMR3会利用一个GPIO触发系统复位。

(2)芯片的专门WATCHDOG模块

对于现在的很多芯片,已经集成了专门的WATCHDOG模块,比如ARM11的芯片,WATCHDOG模块中,提供了比较灵活的配置和控制机制:

A、宽范围设置过期时间间隔,从0。5秒到128秒可以用户配置

B、可以灵活配置在低功耗下,使用或者停止WATCHDOG功能

C、可以灵活配置在DEBUG等状态下,使用或者停止WATCHDOG功能

根据不同的系统,设置好相应的寄存器,激活WATCHDOG后,需要应用程序周期性的服务WATCHDOG,即我们所说的“喂狗”,对于WATCHDOG模块,需要定时向Watchdog Service Register按顺序写入0x5555、0xaaaa。一般在WATCHDOG模块中还会提供Watchdog Reset Status Register,从中可以找到复位的具体原因。

3、单片机的WATCHDOG实现

许多单片机片内自带看门狗电路,单片机复位时将片内自带看门狗电路禁止,只有当程序访问该电路时,电路启动。如51系列单片机对SFR中的0A6H地址顺序写入#01EH、#0E1H;而96系列单片机则对SFR中的0A6H地址顺序写入#1EH、#0E1H;工控主机板上看门狗电路本身并不要求复位后重新启动,但BIOS在复位后将板上看门狗禁止,启动和喂狗方法与单片机相同。通常在WatchDog编程状态,只要执行如下两条指令:

outportb(0x2e,0xf6);

outportb(0x2f,TIME-OUT-VALUE);

可实现WatchDog的启停,其中TIME-OUT-VALUE ≠0启动;TIME-OUT-VALUE =0停止[2]。能够用指令禁止看门狗是为了适应用户程序开发阶段的需要,这同时给看门狗启动和运行失败留下了后门,在看门狗启动时或启动前遇干扰而使程序跑飞,则看门狗启动失败,无法行使监控职能。

4、结论

WATCHDOG在嵌入式系统中发挥着非常重要的作用,其实现方式也千差万别,根据不同的硬件设计,可以选用不同的WATCHDOG,但它们的作用是一样的:保证系统在出现不可恢复错误时,能够自动让系统重启。

围观 1281

页面

订阅 RSS - 看门狗