S32K144(16)EWM

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的计数器会冻结
  1. 从停止模式退出有两种可能的方法:
  2. 重启退出停止模式时,EWM仍然处于禁用状态
  3. 当中断退出停止模式时,EWM将重新启用,计数器也重新启用
  • 调试模式:进入调试模式对EWM没有影响。
  1. 如果在进入调试模式之前已经开启EWM,则EWM将保持开启状态。
  2. 如果在进入调试模式之前,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复位后写入一次,多次写入会造成总线错误

上一篇:站长新手入门:从0开始搭建微信小程序商城,不会代码也能开商城(附带源码)


下一篇:S32K144(15)CRC