EFM32片内外设--RMU基本操作

造成MCU复位的原因,想必很很多。但是如何找到是何原因造成的复位,有时候却并不好找。EFM32提供了RMU的模块,全称为Reset Magagement Unit,复位管理单元。利用这个单元,就可以很方便的找到复位的原因了。

在MCU运行的过程当中,RMU会一直不停的检测各种复位源,例如POR Power-on Reset上电复位,BOD Brown-out Detection,以及外部Reset脚复位,看门狗复位,软件复位,或则是EM4唤醒等等。都可以通过查询RMU->RSTCAUSE这个来获知复位的原因。注意的是,有时候复位不是单一原因造成的,例如外部复位和看门狗复位同时发生等。

通过查看reference manual里面的表格,可以知道具体那几位代表的是什么意思。

初看,你会发现这张表格会稍显复杂一些,其实很简单,我们也不需要去记这张表格,请直接使用EMLib中的函RMU_ResetCauseGet() 即可获知复位的原因。

知道可以获知复位源之后,您肯定也想到了,如何去清除这个寄存器,为下一次查询做好准备了。查看Reference manual,发现这个RMU->RSTCAUSE这个寄存器是个只读类型,要清除这个寄存器,必须经过如下三个步骤:

往RMU->CMD中的RCCLR写1,往EMU->AUXCTRL中的bit0写1,然后再往EMU->AUXCTRL中的bit0写0.

或则调用:RMU_ResetCauseClear()来完成这项复杂的工作。呵呵。各位看官也可以参考如下的这段小代码(基于TG STK)。

#include <stdint.h>
#include <stdbool.h>
#include "efm32.h"
#include "em_chip.h"
#include "em_cmu.h"
#include "em_rmu.h"
#include "em_gpio.h"
#include "segmentlcd.h"
#include "lcdtest.h"
#include "trace.h"


/**************************************************************************//**
 * @brief GPIO Interrupt handler (PB11)
 *****************************************************************************/
void GPIO_ODD_IRQHandler(void)
{
  GPIO_IntClear(1 << 11);
  RMU_ResetCauseClear();//使用按键来清除复位标志
}

/**************************************************************************//**
 * @brief GPIO Interrupt handler (PD8)
 *****************************************************************************/
void GPIO_EVEN_IRQHandler(void)
{
  GPIO_IntClear(1 << 8);
  RMU_ResetCauseClear(); //使用按键来清除复位标志
}

/**************************************************************************//**
 * @brief  Main function
 *****************************************************************************/
int main(void)
{
  /* Chip errata */
  CHIP_Init();

  /* Enable GPIO in CMU */
  CMU_ClockEnable(cmuClock_GPIO, true);

  /* Configure PD8 and PB11 as input */
  GPIO_PinModeSet(gpioPortD, 8, gpioModeInput, 0);
  GPIO_PinModeSet(gpioPortB, 11, gpioModeInput, 0);

  /* Set falling edge interrupt for both ports */
  GPIO_IntConfig(gpioPortD, 8, false, true, true);
  GPIO_IntConfig(gpioPortB, 11, false, true, true);

  /* Enable interrupt in core for even and odd gpio interrupts */
  NVIC_ClearPendingIRQ(GPIO_EVEN_IRQn);
  NVIC_EnableIRQ(GPIO_EVEN_IRQn);

  NVIC_ClearPendingIRQ(GPIO_ODD_IRQn);
  NVIC_EnableIRQ(GPIO_ODD_IRQn);
 

  /* Enable LCD without voltage boost */
  SegmentLCD_Init(false);

  SegmentLCD_AllOff();

  while(1)
  {
      unsigned long ulDelay = 500000;
      while(ulDelay--);
      SegmentLCD_Number(RMU_ResetCauseGet()); //将复位标志显示在LCD上
      //SegmentLCD_Number(RMU->RSTCAUSE);
  }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值