1、EWM和WDOG的区别
内部看门狗:看门狗是对单片机的CPU和外设进行复位的内部看门狗,通常用于监控嵌入式软件的流程和执行,在一个单片机。看门狗由一个计数器组成,如果允许它溢出,则强制执行内部复位
所以为了安全起见,有一个冗余的看门狗系统,即外部看门狗监控(EWM), EWM与内部看门狗的区别在于它不复位MCU的CPU和外围设备。EWM提供一个独立的EWM_OUT_b信号将外部电路复位或置于安全模式。一个可选的外部输入EWM_in是允许对EWM_OUT_b信号进行额外的控制。
2、EWM模块的特点
- 独立的LPO_CLK时钟源
- 可编程超时时间,由EWM_LPO_CLK的数量指定
- 一个输出端口,EWM_OUT_b,当断言被用来重置或放置外部电路进入安全模式。
- 一个输入端口,EWM_in,允许外部电路控制断言EWM_OUT_b信号。
- 在15个外围总线时钟周期内,向EWM刷新寄存器写入0xB4和0x2C的值
3、EWM模式
- STOP模式:当EWM处于停止模式时,CPU不回刷新EWM,在停止模式时,EWM的计数器会冻结
- 从停止模式退出有两种可能的方法:
- 重启退出停止模式时,EWM仍然处于禁用状态
- 当中断退出停止模式时,EWM将重新启用,计数器也重新启用
- 调试模式:进入调试模式对EWM没有影响。
- 如果在进入调试模式之前已经开启EWM,则EWM将保持开启状态。
- 如果在进入调试模式之前,EWM已被关闭,则EWM将保持关闭状态
4、EWM信号
EWM_in |
EWM输入,用于外部安全电路的安全状态。 EWM_in电平是通过EWM_CTRL[ASSIN]位可编程的。默认低电平 |
EWM_OUT_b |
EWM复位信号 |
5、EWM寄存器
EWM寄存器默认是8bit的,16bit和32bit不适用
5.1、CTRL:Control Register
注意:EWMEN、ASSIN和INEN在CPU复位后写入一次,多次写入会造成总线错误
0 |
EWMEN |
EWM启用。 设置此位后,将使能EWM模块。这将重置EWM计数器为零,并取消EWM_OUT_b信号。如果不设置该位,则保持EWM模块处于禁用状态。它不能重新启用,直到由于这个位的写一次性质,下一次重置。 |
1 |
ASSIN |
EWM_in的断言状态选择。 |
2 |
INEN |
输入启用。 设置此位时,将启用EWM_in端口 |
3 |
INTEN |
中断使能 当设置EWM_OUT_b并断言时,将生成一个中断请求。de-assert中断请求时,用户应该写0来清除此位 |
5.2、SERV:Service Register
此寄存器提供了CPU到EWM的接口,只读
0-7 |
SERVICE |
EWM刷新机制要求CPU向服务寄存器写入两个值:第一个数据字节后面是0xB4的第二个数据字节0x2C |
5.3、CMPL:Compare Low Register
设置最小刷新时间,在CPU复位后写入一次,多次写入会造成总线错误
5.4、CMPH:Compare High Register
设置最大刷新时间,在CPU复位后写入一次,多次写入会造成总线错误
如果设置CMPH=0xFF,那么EWM计数器永远不会触发,因为触发条件EWM计数器需要大于CMPH值
6、代码
void PORT_init (void)
{
/*!
* Pins definitions
* ===================================================
*
* Pin number | Function
* ----------------- |------------------
* PTA2 | [EWM_OUT_b]
*/
PCC->PCCn[PCC_PORTA_INDEX] = PCC_PCCn_CGC_MASK; /* Enable clock for PORT A */
PORTA->PCR[2] |= PORT_PCR_MUX(4); /* Port A2: MUX = ALT4, EWM_OUT_b */
/* External Watchdog Monitor Output */
}
void Enable_Interrupt(uint8_t vector_number)
{
S32_NVIC->ISER[(uint32_t)(vector_number) >> 5U] = (uint32_t)(1U << ((uint32_t)(vector_number) & (uint32_t)0x1FU));
S32_NVIC->ICPR[(uint32_t)(vector_number) >> 5U] = (uint32_t)(1U << ((uint32_t)(vector_number) & (uint32_t)0x1FU));
}
void EWM_init(void)
{
/*!
*EWM clocking
*==========================================
*/
PCC->PCCn[PCC_EWM_INDEX] |= PCC_PCCn_CGC_MASK;
EWM->CLKPRESCALER = 127; /*! Prescaled clock frequency =
* low power clock source frequency / ( 1 + CLK_DIV ) =
* LPO 128KHz / 128 = 1KHz.
*/
/*!
* The EWM compare registers are used to create a
* refresh window to refresh the EWM module.
*/
EWM->CMPH = 0xFE; /* When the counter passes this value outb will be asserted */
EWM->CMPL = 0x0F; /* Refresh window is [15ms - 255ms]. */
EWM->CTRL |= EWM_CTRL_INTEN_MASK| /* Enable interrupt */
EWM_CTRL_EWMEN_MASK; /* Enable EWM */
}
void WDOG_EWM_IRQHandler(void)
{
/* EWM_OUT_b is asserted */
EWM->CTRL &= ~EWM_CTRL_INTEN_MASK; /* de-assert interrupt request */
/* does not affect EWM_OUT_b. */
}
int main(void)
{
WDOG_disable(); /* Disable WDOG */
SOSC_init_8MHz(); /* Initialize system oscilator for 8 MHz xtal */
SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
PORT_init(); /* Configure ports */
EWM_init(); /* Initialize EWM. */
Enable_Interrupt(WDOG_EWM_IRQn); /* Enable EWM interrupt. */
while(1){
}
return 0;
}
CLKPRESCALER:Clock Prescaler Register
开启EWM之前,需要先填写预分频值,在CPU复位后写入一次,多次写入会造成总线错误