请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:RM48L952 主题中讨论的其他器件:HALCOGEN
你好!
在 Halcogen 中、我已经为 PLL 生成了代码、并注意到勘误表 SSWF0221#35权变措施说明:
解决方法在切换之前、将所有时钟域切换至不同的源(例如振荡器)
PLL 输出时钟分频器从1分频到更大的分频器;在 PLL 分频器之后
已更改、恢复为 PLL 作为这些时钟域的时钟源。
在 halcogen system.c 文件 mapClock()函数中,在更改时钟分频器之前不会从 PLL 切换时钟源。 请参阅下面突出显示的行:
/* sourceId:system_sourceId_005 */* DesignId:system_DesignId_005 */* 要求:HL_SR469 */ void mapClocks(void) { uint32 SYS_CSVSTAT、SYS_CSDIS; /*用户代码开始(11)*/ /*用户代码结束*/ /**@b 初始化@b 时钟@b 树:*/ /**-禁用/启用时钟域*/ systemREG1->CDDIS =(UINT32)((UINT32)0U <<4U)/* AVCLK 1关闭*/ |(uint32)((uint32) 1U << 5U)// AVCLK 2 off */ |(uint32)((uint32) 1U << 8U)/* VCLK3关闭*/ |(uint32)((uint32) 0U << 9U)// VCLK4 off */ |(uint32)((uint32) 1U << 10U)/* AVCLK 3关闭*/ |(uint32)((uint32) 1U << 11U);// AVCLK 4 off */ /*勘误表的解决方法 SYS#46: * *勘误表说明: * 时钟源切换不符合时钟源使能和时钟源有效的要求 *权变措施: * 始终检查 CSDIS 寄存器以确保时钟源已打开并检查 * CSVSTAT 寄存器以确保时钟源有效。 然后写入 GHVSRC 以切换时钟。 * /**-等待直到时钟锁定*/ SYS_CSVSTAT = systemREG1->CSVSTAT; SYS_CSDIS = systemREG1->CSDIS; while ((SYS_CSVSTAT &(SYS_CSDIS ^ 0xFFU)& 0xFFU))!=((SYS_CSDIS ^ 0xFFU)& 0xFFU) { SYS_CSVSTAT = systemREG1->CSVSTAT; SYS_CSDIS = systemREG1->CSDIS; } /*等待*/ /*用户代码开始(12)*/ /*用户代码结束*/ /**-将器件时钟域映射到所需的源并配置顶级分频器*/ /**-到目前为止,所有时钟域都在关闭默认时钟源*/ /**-可以使用 HALCoGen GUI 轻松修改以下分配*/ /**-为正常运行、断电模式和唤醒后设置 GCLK、HCLK 和 VCLK 时钟源*/ systemREG1->GHVSRC =(UINT32)((UINT32) SYS_OSC << 24U) |(UINT32)((UINT32) SYS_OSC << 16U) |(UINT32)((UINT32) SYS_PLL1 << 0U); /**-设置 RTICLK1和 RTICLK2时钟*/ systemREG1->RCLKSRC =(uint32)((uint32) 1U << 24U) |(UINT32)((UINT32) SYS_VCLK << 16U) |(uint32)((uint32) 2U << 8U) |(UINT32)((UINT32) SYS_VCLK << 0U); /**-为 AVCLK1和 AVCLK2设置异步外设时钟源*/ systemREG1->VCLKASRC =(uint32)((uint32) SYS_VCLK << 8U) |(UINT32)((UINT32) SYS_VCLK << 0U); /**-为 VCLK1、VCLK2、VCLK3设置同步外设时钟分频器*/ systemREG1->CLKCNTL =(systemREG1->CLKCNTL & 0xF0FFFFFFU) |(uint32)((uint32) 2U << 24U); systemREG1->CLKCNTL =(systemREG1->CLKCNTL & 0xFFF0FFFFU) |(uint32)((uint32) 2U << 16U); systemREG2->CLK2CNTL =(systemREG2->CLK2CNTL 和0xFFFFFF0F0U) |(uint32)((uint32) 1U <<8U) |(uint32)((uint32) 2U << 0U); systemREG2->VCLKACON1 =(uint32)((uint32)(1U-1U)<< 24U) |(UINT32)((UINT32) 0U << 20U) |(UINT32)((UINT32) SYS_VCLK << 16U) |(uint32)((uint32)(1U-1U)<<8U) |(uint32)((uint32) 0U << 4U) |(UINT32)((UINT32) SYS_VCLK << 0U); /*用户代码开始(13)*/ /*用户代码结束* /*现在 PLL 被锁定并且 PLL 输出可被向上加速*/ /* R 分频器被设定为0xF。 现在、该分频器已更改为编程值*/ systemREG1->PLLCTL1 =(systemREG1->PLLCTL1 & 0xE0FFFFFFU)|(uint32)((uint32)(2U-1U)<< 24U); /*SAFETYMCUSW 134 S MR:12.2. "LDRA 工具问题"*/ systemREG2->PLLCTL3 =(systemREG2->PLLCTL3 & 0xE0FFFFFFU)|(uint32)((uint32)(2U-1U)<< 24U); /*启用/禁用频率调制*/ systemREG1->PLLCTL2 |= 0x000000000000U; //用户代码开始(14)*/ //*用户代码结束*/ }
请澄清这是否正确。
谢谢!