MSP430学习笔记(二)丨MSP430的时钟系统

本文是MSP430学习笔记的第二部分,详细介绍了MSP430的时钟系统,包括单片机内部时钟需求、五个时钟源和三种时钟信号。同时,探讨了UCS模块的功能,如何配置UCS模块的寄存器以及使用库函数设置时钟源。
摘要由CSDN通过智能技术生成

​  笔者学习采用单片机型号为MSP430F5529,使用MSP-EXP430F5529LP开发板。


一、MSP430的时钟系统

1.1 单片机内部时钟信号的一般需求

  1. 高频时钟:用于程序运行,对外界信号快速做出反应
  2. 低频时钟:用于降低功耗
  3. 频率稳定的时钟:用于稳定计时
  4. 低Q值(品质因数)的时钟:用于保证开始或结束时的最小事件延迟

1.2 MSP430的五个时钟源

  1. XT1CLK(低频/高频时钟源):可以使用片内低频手表晶振(32.768kHz)、标准晶振、振荡器或者外部时钟源输入(4MHz~32MHz),XT1CLK可以作为内部FLL模块的参考时钟,且它是FLL模块(频锁环模块)的默认参考时钟。FLL时钟除锁频之外还可以对时钟进行倍频或分频。
  2. XT2CLK(高频时钟源):可以使用片内标准晶振(4MHz)、谐振器或者外部时钟源输入(4MHz~32MHz)。XT2CLK可以作为FLL的内部参考时钟。
  3. VLOCLK(低频内部时钟源):典型频率为10kHz。
  4. REFCLK(低频时钟源,内部的参考时钟源):典型频率为32.768kHz,可以作为内部FLL的参考时钟。
  5. DCOCLK(片内数字控制时钟源):通过内部FLL模块稳定,一般为1MHz。

1.3 MSP430的三种时钟信号

  1. ACLK ,辅助时钟: ACLK 的时钟源可由软件选择来自XT1CLK、 REFOCLK 、 VLOCLK 、 DCOCLK 、 DCOCLKDIV 、XT2CLK这几个时钟源之一。然后经1、2、4、8、16、32分频得到。 ACLK 的频率一般很低,所以即使一直开启功耗也不大,当然关掉也是可以的。辅助时可以供给那些只需低频时钟的外设,比如八位数码管,还可用于产生节拍时基,与定时器合间歇唤醒 CPU 。
  2. MCLK ,系统主时钟: MCLK 可由软件选择来自上述5种时钟源,同样可经过分频得到。 MCLK 主要用于 CPU 和系统。 MCLK 频率配置的越高, CPU 执行的速度越快。虽然 CPL 速度越快功耗也越高,但高频率的 MCLK 可以让 CPU 工作时间更短。所以正确的低功耗计并不是要尽量降低 MCLK ,而是在不用 CPU 时立刻关闭 MCLK 。在大部分应用中,需 CPU 运算的时间都非常短,所以,间歇开启 MCLK (唤醒 CPU)的方法节能效果非常明显。
  3. SMCLK ,子系统时钟:可由软件选择来自上述5种时钟源,同样可经过分频得到。 SMCLK 可由软件选作各个外设模块的时钟信号, SMCLK 专为一些需要高速时钟的片内外设提供服务,比如定时器和 ADC 采样等。当 CPU 休眠时,只要 SMCLK 开启,定时器和 ADC 仍可工作(一般待片内外设完成工作后触发中断,唤醒 CPU 去做后续工作)。
      MCLK 、 SMCLK 和 ACLK 三者关系用更形象的比喻就是主力部队( MCLK )、先头部队( SMCLK )、警戒哨兵( ACLK )的关系。

二、UCS模块

2.1 UCS模块简介

  UCS(Unified Clock System),标准时钟系统,可以通过配置UCS模块来更改芯片和片上外设的时钟源。
在这里插入图片描述
  可以看到,系统时钟XT1CLK的输入引脚XIN和XOUT被GPIO端口复用了。如果我们不对这两个端口进行PxSEL配置,单片机就无法使用外部时钟进行驱动。从原理图可以看出,XT2IN和XT2OUT引脚也是与之相同的情况。

2.2 UCS模块的寄存器配置

在这里插入图片描述

  以UCSCTL4寄存器为例,可以通过配置该寄存器来更改MSP430三种时钟信号的时钟源。对应位取值详见用户手册。笔者主要采用库函数的方法配置,所以这一块内容仅作了解即可,重点是了解和学习UCS模块具体控制了单片机时钟系统的哪些内容。
在这里插入图片描述

2.3 UCS模块的库函数配置

// 设置外部时钟源XT1和XT2晶振频率值
extern void UCS_setExternalClockSource(uint32_t XT1CLK_frequency, uint32_t XT2CLK_frequency);

// 初始化时钟信号(设置分频)
extern void UCS_initClockSignal(uint8_t selectedClockSignal, uint16_t clockSource, uint16_t clockSourceDivider);

// 在低频模式下初始化XT1晶体振荡器,无超时
extern void UCS_turnOnLFXT1(uint16_t xt1drive, uint8_t xcap);

// 在高频模式下初始化XT1晶体振荡器,无超时
extern void UCS_turnOnHFXT1(uint16_t xt1drive);

// 绕过XT1晶体振荡器;循环,直到所有振荡器故障标志被清除,没有超时
extern void UCS_bypassXT1(uint8_t highOrLowFrequency);

// 将XT1晶体振荡器初始化为低频模式,并带超时
extern bool UCS_turnOnLFXT1WithTimeout(uint16_t xt1drive, uint8_t xcap, uint16_t timeout);

// 将XT1晶体振荡器初始化为高频模式,并带超时
extern bool UCS_turnOnHFXT1WithTimeout(uint16_t xt1drive, uint16_t timeout);

// 将XT1晶体振荡器初始化为低频模式,并带超时;循环,直到所有振荡器故障标志被清除或直到超时计数器减少并等于零。
extern bool UCS_bypassXT1WithTimeout(uint8_t highOrLowFrequency,
                                     uint16_t timeout);

// 使用XT1OFF位停止XT1振荡器
extern void UCS_turnOffXT1(void);

// 初始化XT2晶体振荡器,不带超时
extern void UCS_turnOnXT2(uint16_t xt2drive);

// 绕过XT2晶体振荡器,不带超时
extern void UCS_bypassXT2(void);

// 初始化XT2晶体振荡器,并带超时
extern bool UCS_turnOnXT2WithTimeout(uint16_t xt2drive,
                                     uint16_t timeout);

// 绕过XT2晶体振荡器,带超时
extern bool UCS_bypassXT2WithTimeout(uint16_t timeout);

// 使用XT2OFF位停止XT2振荡器
extern void UCS_turnOffXT2(void);

//*****************************************************************************
//
//! \brief Initializes the DCO to operate a frequency that is a multiple of the
//! reference frequency into the FLL
//!
//! Initializes the DCO to operate a frequency that is a multiple of the
//! reference frequency into the FLL. Loops until all oscillator fault flags
//! are cleared, with a timeout. If the frequency is greater than 16 MHz, the
//! function sets the MCLK and SMCLK source to the undivided DCO frequency.
//! Otherwise, the function sets the MCLK and SMCLK source to the DCOCLKDIV
//! frequency. This function executes a software delay that is proportional in
//! length to the ratio of the target FLL frequency and the FLL reference. The
//! function PMM_setVCore() is required to call first if the target frequency
//! is beyond current Vcore supported frequency range.
//!
//! \param fsystem is the target frequency for MCLK in kHz
//! \param ratio is the ratio x/y, where x = fsystem and y = FLL reference
//!        frequency.
//!
//! Modified bits of \b UCSCTL0 register, bits of \b UCSCTL4 register, bits of
//! \b UCSCTL7 register, bits of \b UCSCTL1 register, bits of \b SFRIFG1
//! register and bits of \b UCSCTL2 register.
//!
//! \return None
//
//*****************************************************************************
extern void UCS_initFLLSettle(uint16_t fsystem,
                              uint16_t ratio);

//*****************************************************************************
//
//! \brief Initializes the DCO to operate a frequency that is a multiple of the
//! reference frequency into the FLL
//!
//! Initializes the DCO to operate a frequency that is a multiple of the
//! reference frequency into the FLL. Loops until all oscillator fault flags
//! are cleared, with no timeout. If the frequency is greater than 16 MHz, the
//! function sets the MCLK and SMCLK source to the undivided DCO frequency.
//! Otherwise, the function sets the MCLK and SMCLK source to the DCOCLKDIV
//! frequency. The function PMM_setVCore() is required to call first if the
//! target frequency is beyond current Vcore supported frequency range.
//!
//! \param fsystem is the target frequency for MCLK in kHz
//! \param ratio is the ratio x/y, where x = fsystem and y = FLL reference
//!        frequency.
//!
//! Modified bits of \b UCSCTL0 register, bits of \b UCSCTL4 register, bits of
//! \b UCSCTL7 register, bits of \b UCSCTL1 register, bits of \b SFRIFG1
//! register and bits of \b UCSCTL2 register.
//!
//! \return None
//
//*****************************************************************************
extern void UCS_initFLL(uint16_t fsystem,
                        uint16_t ratio);

//*****************************************************************************
//
//! \brief Enables conditional module requests
//!
//! \param selectClock selects specific request enables
//!        Valid values are:
//!        - \b UCS_ACLK
//!        - \b UCS_SMCLK
//!        - \b UCS_MCLK
//!        - \b UCS_MODOSC
//!
//! Modified bits of \b UCSCTL8 register.
//!
//! \return None
//
//*****************************************************************************
extern void UCS_enableClockRequest(uint8_t selectClock);

//*****************************************************************************
//
//! \brief Disables conditional module requests
//!
//! \param selectClock selects specific request disable
//!        Valid values are:
//!        - \b UCS_ACLK
//!        - \b UCS_SMCLK
//!        - \b UCS_MCLK
//!        - \b UCS_MODOSC
//!
//! Modified bits of \b UCSCTL8 register.
//!
//! \return None
//
//*****************************************************************************
extern void UCS_disableClockRequest(uint8_t selectClock);

//*****************************************************************************
//
//! \brief Gets the current UCS fault flag status.
//!
//! \param mask is the masked interrupt flag status to be returned. Mask
//!        parameter can be either any of the following selection.
//!        Valid values are:
//!        - \b UCS_XT2OFFG - XT2 oscillator fault flag
//!        - \b UCS_XT1HFOFFG - XT1 oscillator fault flag (HF mode)
//!        - \b UCS_XT1LFOFFG - XT1 oscillator fault flag (LF mode)
//!        - \b UCS_DCOFFG - DCO fault flag
//!
//
//*****************************************************************************
extern uint8_t UCS_getFaultFlagStatus(uint8_t mask);

//*****************************************************************************
//
//! \brief Clears the current UCS fault flag status for the masked bit.
//!
//! \param mask is the masked interrupt flag status to be returned. mask
//!        parameter can be any one of the following
//!        Valid values are:
//!        - \b UCS_XT2OFFG - XT2 oscillator fault flag
//!        - \b UCS_XT1HFOFFG - XT1 oscillator fault flag (HF mode)
//!        - \b UCS_XT1LFOFFG - XT1 oscillator fault flag (LF mode)
//!        - \b UCS_DCOFFG - DCO fault flag
//!
//! Modified bits of \b UCSCTL7 register.
//!
//! \return None
//
//*****************************************************************************
extern void UCS_clearFaultFlag(uint8_t mask);

//*****************************************************************************
//
//! \brief Turns off SMCLK using the SMCLKOFF bit
//!
//!
//! Modified bits of \b UCSCTL6 register.
//!
//! \return None
//
//*****************************************************************************
extern void UCS_turnOffSMCLK(void);

//*****************************************************************************
//
//! \brief Turns ON SMCLK using the SMCLKOFF bit
//!
//!
//! Modified bits of \b UCSCTL6 register.
//!
//! \return None
//
//*****************************************************************************
extern void UCS_turnOnSMCLK(void);

//*****************************************************************************
//
//! \brief Get the current ACLK frequency
//!
//! Get the current ACLK frequency. The user of this API must ensure that
//! UCS_setExternalClockSource API was invoked before in case XT1 or XT2 is
//! being used.
//!
//!
//! \return Current ACLK frequency in Hz
//
//*****************************************************************************
extern uint32_t UCS_getACLK(void);

//*****************************************************************************
//
//! \brief Get the current SMCLK frequency
//!
//! Get the current SMCLK frequency. The user of this API must ensure that
//! UCS_setExternalClockSource API was invoked before in case XT1 or XT2 is
//! being used.
//!
//!
//! \return Current SMCLK frequency in Hz
//
//*****************************************************************************
extern uint32_t UCS_getSMCLK(void);

//*****************************************************************************
//
//! \brief Get the current MCLK frequency
//!
//! Get the current MCLK frequency. The user of this API must ensure that
//! UCS_setExternalClockSource API was invoked before in case XT1 or XT2 is
//! being used.
//!
//!
//! \return Current MCLK frequency in Hz
//
//*****************************************************************************
extern uint32_t UCS_getMCLK(void);

//*****************************************************************************
//
//! \brief Clears all the Oscillator Flags
//!
//! \param timeout is the count value that gets decremented every time the loop
//!        that clears oscillator fault flags gets executed.
//!
//! \return Logical OR of any of the following:
//!         - \b UCS_XT2OFFG XT2 oscillator fault flag
//!         - \b UCS_XT1HFOFFG XT1 oscillator fault flag (HF mode)
//!         - \b UCS_XT1LFOFFG XT1 oscillator fault flag (LF mode)
//!         - \b UCS_DCOFFG DCO fault flag
//!         \n indicating the status of the oscillator fault flags
//
//*****************************************************************************
extern uint16_t UCS_clearAllOscFlagsWithTimeout(uint16_t timeout);

  持续更新完善中……


  原创笔记,码字不易,欢迎点赞,收藏~ 如有谬误敬请在评论区不吝告知,感激不尽!博主将持续更新有关嵌入式开发、机器学习方面的学习笔记~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Include everything

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值