4. 实例分析 下面将通过实例来验证时钟的模式是否设置成功。测试方法就是通过 Flex 总线上的时钟输出来,然后通过示波器来测量这个时钟的周期。由于时钟模块中有 FLL 和 PLL 两个部分,所以在实例说明中会有两个部分。一个是 PEE 实例,一个是 FEI 的实例。
4.1 PEE 实例 时钟配置模式:PEE
步骤一: 配置时钟,如图 4.1 和图 4.2 所示。
图 4.1 时钟配置(一)
图 4.2 时钟配置(二)
步骤二: 配置 Flex 总线上的是时钟输出引脚,如图 4.3 所示。
图 4.3 外部总线模块配置
步骤三: 生成代码
- /* 系统时钟初始化 */
- /* SIM_SCGC5: PORTC=1,PORTA=1 */
- SIM_SCGC5 |= (uint32_t)0x0A00UL; /* 使能引脚的时钟 */
- /* 内部时钟校准 */
- if ( *((uint8_t*) 0x03FFU) != 0xFFU) {
- MCG_C3 = *((uint8_t*) 0x03FFU);
- MCG_C4 = (MCG_C4 & 0xE0U) | ((*((uint8_t*) 0x03FEU)) & 0x1FU);
- }
- SIM_CLKDIV1 = (uint32_t)0x01130000UL;
- SIM_CLKDIV2 &= (uint32_t)~0x0FUL;
- SIM_SOPT2 &= (uint32_t)~0x00010000UL;
- SIM_SOPT1 &= (uint32_t)~0x00080000UL;
- PORTA_PCR18 &= (uint32_t)~0x01000700UL;
- /* 切换到PBE模式 */
- OSC_CR = (uint8_t)0x80U;
- SIM_SOPT2 &= (uint32_t)~0x01UL;
- MCG_C2 = (uint8_t)0x20U;
- MCG_C1 = (uint8_t)0xAAU;
- MCG_C4 &= (uint8_t)~(uint8_t)0xE0U;
- while((MCG_S & MCG_S_IREFST_MASK) != 0x00U) {
- }
- /* 等待外部参考时钟选为MCG输出*/
- while((MCG_S & 0x0CU) != 0x08U) { }
- /* 切换到PBE模式 */
- OSC_CR = (uint8_t)0x80U;
- SIM_SOPT2 &= (uint32_t)~0x01UL;
- MCG_C1 = (uint8_t)0xAAU;
- MCG_C2 = (uint8_t)0x20U;
- MCG_C5 = (uint8_t)0x18U;
- MCG_C6 = (uint8_t)0x58U;
- /* 等待外部参考时钟选为MCG输出*/
- while((MCG_S & 0x0CU) != 0x08U) { }
- /* 等待锁住 */
- while((MCG_S &MCG_S_LOCK_MASK)==0x00U)
- { }
- /* 切换到PEE模式 */
- OSC_CR = (uint8_t)0x80U;
- SIM_SOPT2 &= (uint32_t)~0x01UL;
- MCG_C1 = (uint8_t)0x2AU;
- MCG_C2 = (uint8_t)0x20U;
- MCG_C5 = (uint8_t)0x18U;
- MCG_C6 = (uint8_t)0x58U;
- /* 等待直到PLL时钟输出选中 */
- while((MCG_S & 0x0CU) != 0x0CU)
- { }
- SIM_SCGC7 |= (uint32_t)0x01。
- SIM_SOPT2 &= (uint32_t)~0x0300UL;
- FB_CSMR0 &= (uint32_t)~0x01UL;
- FB_CSMR1 &= (uint32_t)~0x01UL;
- FB_CSMR2 &= (uint32_t)~0x01UL;
- FB_CSMR3 &= (uint32_t)~0x01UL;
- FB_CSMR4 &= (uint32_t)~0x01UL;
- FB_CSMR5 &=(uint32_t)~0x01UL;
复制代码
步骤四: 检验波形,如图 4.4 所示。
图 4.4 输出波形
4.2 FEI 实例 开发板: TWR-K60N512 时钟配置模式:FEI 步骤一: 配置时钟,如图 4.5 和图 4.6 所示。
图 4.5 时钟配置(一)
图 4.6 时钟配置(二)
步骤二: 配置 Flex 总线上的是时钟输出引脚,如图 4.7 所示。
图 4.7 外部总线模块配置
步骤三: 生成代码
- /* 系统时钟初始化 */
- SIM_SCGC5 |= (uint32_t)0x0A00UL;
- /* 内部时钟校准*/
- if ( *((uint8_t*) 0x03FFU) != 0xFFU) {
- MCG_C3 = *((uint8_t*) 0x03FFU);
- MCG_C4 = (MCG_C4 & 0xE0U) | ((*((uint8_t*) 0x03FEU)) & 0x1FU);
- }
- SIM_CLKDIV1 = (uint32_t)0x00UL;
- SIM_CLKDIV2 = (uint32_t)((SIM_CLKDIV2 & (uint32_t)~0x0EUL) | (uint32_t)0x01UL);
- SIM_SOPT2 &= (uint32_t)~0x00010000UL;
- SIM_SOPT1 &= (uint32_t)~0x00080000UL;
- /* 切换到FEI模式*/
- MCG_C1 = (uint8_t)0x06U;
- MCG_C2 = (uint8_t)0x00U;
- MCG_C4 &= (uint8_t)~(uint8_t)0xE0U;
- OSC_CR = (uint8_t)0x80U;
- SIM_SOPT2 &= (uint32_t)~0x01UL;
- /* 检查FLL的参考时钟源是内部参考时钟*/
- while((MCG_S & MCG_S_IREFST_MASK) == 0x00U) {
- }
- while((MCG_S & 0x0CU) != 0x00U) { /* Wait until output of the FLL is selected */
- }
- SIM_SCGC7 |= (uint32_t)0x01UL;
- /*初始化外部总线模块*/
- SIM_SOPT2 &= (uint32_t)~0x0300UL;
- FB_CSMR0 &= (uint32_t)~0x01UL;
- FB_CSMR1 &= (uint32_t)~0x01UL;
- FB_CSMR2 &= (uint32_t)~0x01UL;
- FB_CSMR3 &= (uint32_t)~0x01UL;
- FB_CSMR4 &= (uint32_t)~0x01UL;
- FB_CSMR5 &= (uint32_t)~0x01UL;
复制代码
步骤四: 检测波形,如图 4.8 所示。
0
|
|
|
|