痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同 (2)

  最后我们看一下 LPC 上 SystemReset 不复位的通用寄存器 RTC->GPREGx,从 RTC 模块寄存器定义上来看,它和 i.MXRTxxx 里的 RTC 一模一样,是的,说 i.MXRTxxx 来自于 LPC 没有丝毫夸张,它们就是一个平台的产物。我们在代码里尝试直接写这个寄存器,发现读写操作都会直接发生系统错误,在线调试无法继续进行。

void gpreg_rw_test(void) { uint32_t flag = 0x5a; RTC->GPREG[0] = flag; // 系统错误,调试无法进行 flag = RTC->GPREG[0]; }

  我们知道 LPC 里 SYSCON 模块负责所有其他外设的时钟开关控制(具体在 SYSCON->AHBCLKCTRLx 寄存器),下图是 LPC55S69 里 SYSCON->AHBCLKCTRLx 的默认值(复位后初值,包含软/硬复位):

痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同

  每个 SYSCON->AHBCLKCTRLx 包含 32 个 1bit 的 xxxPeripheral 位,每个 xxxPeripheral 控制一个外设的时钟开关,0 表示关闭,1 表示打开。可以看到大部分外设默认时钟都是关闭的,仅有 Flash/FMC 默认时钟是开启的:

SYSCON->AHBCLKCTRL0[FLASH] - Flash 存储器 SYSCON->AHBCLKCTRL0[FMC] - FMC 控制器

  至于操作 RTC->GPREGx 前准备工作,与 i.MXRTxxx 上是一致的,这里不予赘述。现在我们发现 LPC 上才真正对外设地址空间的访问做了 MCU 上常见的保护机制(即外设时钟不使能的情况下,外设寄存器的写访问应返回总线错误,读访问应返回总线错误),它才是典型的 MCU 产物, 而 i.MXRT 其实更偏向 MPU 设计风格。

void gpreg_rw_test(void) { // 准备工作 SYSCON->AHBCLKCTRLSET[0] = (1UL << SYSCON_AHBCLKCTRL0_RTC_SHIFT); // 或 CLOCK_EnableClock(kCLOCK_Rtc); RTC->CTRL &= ~RTC_CTRL_SWRESET_MASK; // 原代码 uint32_t flag = 0x5a; RTC->GPREG[0] = flag; flag = RTC->GPREG[0]; // flag 为 0x5a }

  至此,对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:对比i.MXRT与LPC在RTC外设GPREG寄存器使用上的异同

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjjzy.html