MSP430F5529时钟系统配置

news2024/11/16 7:34:09

1、为什么要进行时钟管理?  

时钟系统是一个数字器件的命脉,对于普通的51单片机来说,它的时钟来源只有外部晶振,然后每12个振荡周期完成一个基本操作,所以也叫做12T单片机,但对于当前高级一点的单片机来说,比如MSP430F5529有5个时钟来源,经过UCS(Unified Clock System,通用时钟系统)模块之后,产生MCLK(Master Clock),SMCLK(Subsystem master clock ),ACLK(Auxiliary clock)三个时钟;对于更高端的单片机,比STM32F103ZET6里面有专门用来管理时钟的RCC单元(Reset Clock Control),也就是通常所说的时钟树,在时钟管理上更加强大!

  首先来看两个例子:

  1、MSP430F5529单片机的时钟设计:

  该单片机中通过UCS单元产生三路信号,MCLK供CPU使用,SMCLK供高速外设使用,ACLK供低速外设使用,这样设计后,每个外设都具有自己的时钟源,可以独立工作,不需要的时候可以空闲的时钟源关闭,进入低功耗模式,根据时钟不同程度上的关闭,分为7中低功耗模式;

  2、STM32F103ZET6单片机的时钟设计

  该单片机中通过RCC单元产生SYSCLK,HCLK,PCLK2,PCLK1四路时钟,独立工作,并且默认情况下所有外设时钟都处于关闭状态,即使要使用一个IO口输出,也需要先使能相应GPIO时钟,可见STM32的时钟管理单元更加精妙;

  通过这两个例子,可以看出时钟管理这个单元往往被开发者所忽略是因为一般情况下单片机设计者已经为我们设置好了最优的时钟状态,系统工作都采用默认时钟,我们利用这个默认设置可以完成大部分项目,但是在一些必须要求低功耗的场合,比如智能手环,智能仪表,性能需求不是很高,但是必须要求低功耗,那么如何实现低功耗呢?有两种途径,一是关闭没有用到的外设的时钟,停止工作;二是降低系统CPU工作频率。这两种途径都是通过操作单片机的时钟管理单元实现的,所以掌握时钟的管理尤其重要!

2、器材资料准备

  在这里我们深入探究一下MSP430F5529的UCS单元

  • 实验平台:MSP430F55529launchpad开发板
  • 实验仪器:示波器或者逻辑分析仪
  • 参考资料:MSP430F55529launchpad开发板原理图《MSP-EXP430F5529LP_Schematic》以及MSP430F5529的官方参考手册《MSP430x5xx and MSP430x6xx Family User's Guide》

3、统一时钟系统(Unified Clock System,UCS)  

  1)功能简图

  2)由图中可以看到时钟来源一共有5个:

    • XT1CLK     ——  外部低频率或高频率振荡源,32.768Khz(LF模式)或4-32Mhz(HF模式);
    • VLOCLK    ——  内部超低功耗振荡源,典型值10Khz;
    • REFOCLK  ——  内部低频参考源,典型值32.768Khz;
    • DCOCLK   ——  内部数字时钟振荡器,由FLL稳定后得到;
    • XT2CLK     ——  外部高频振荡源4-32Mhz;  

  注:DCOCLK是通过内部FLL单元稳定而来,并不算是一个通过振荡产生时钟的源,所以在图中未标注;

  3)这5个时钟源经过UCS单元后,产生3个时钟信号,这三个时钟的时钟源可由软件控制从XT1,REFO,VLO,DCO,DCOCLK,XT2中选择,其中DCOCLKDIV经由DCO1/2/4/8/16/32分频得到;另外ACLK也可以被再次1/2/4/8/16/32分频;

    • MCLK   —— CPU使用;
    • SMCLK —— 高速外设使用;
    • ACLK —— 低速外设使用;

  4)单独的MOSOSC模块,产生5Mhz的MDOCLK时钟信号,只为FLASH控制模块和ADC12模块提供时钟,该模块不使用时自动关闭,使用时无需使能即可响应请求,为外设提供时钟;

  5)具体的时钟框图如下(图片来源于官方参考手册):

4、实验验证

了解了UCS单元的基本功能后,接下来开始实验:

首先查看开发板原理图,搞清楚硬件连接,可以看到,单片机在XIN(P5.4)和XOUT(P5.5)引脚接了一个32.768K的手表晶振,在XT2IN(P5.2)和XT2OUT(P5.3)处接了一个4M的有源晶振;

1)复位后的时钟情况

  系统上电复位后,XT1在LF低频模式,作为XT1CLK的时钟来源,XT1CLK又被选中作为ACLK的时钟源;当XT1无效时,低频模式自动切换为REFO,其它情况切换为DCO;

  FLL使能,FLL的参考时钟源FLLREFCLK选中XT1CLK,当XT1无效时,低频模式自动切换为REFO,经过锁频环FLL稳定倍频,分频,稳定频率之后,产生DCOCLK和DCOCLKDIV;

  这个时候要注意最关键的,如果连接XT1和XT2的引脚不进行PXSEL的设置,那么这两个时钟源都是无效的,而内部时钟源REFOCLK,VLOCLK,DCOCLK默认都是可用的;并且在单片机复位之后,XT2OFFG,XT1HFOFFG清零,没有故障失效,XT1LFOFFG,DCOCLK置位,产生故障失效,而且在刚打开时钟的时候,这些故障位都会置位一旦被置位,即使晶振恢复到正常状态也将一直保持置位,直到手动用软件将故障失效标志位清零,清零之后,若晶振故障失效情况仍然存在,晶振故障失效标志位将自动再次被置位

  所以,单片机默认情况下虽然全被配置为XT1CLK,但是因为XT1引脚未配置,并且故障位置位,所以自动切换使用REFO,即:

  ACLK =REFOCLK = 32.768Khz;

  FLLREFCLK = REFOCLK = 32.768K;

  MCLK = SMCLK =  DCOCLKDIV =1.048576MHZ;

  DCOCLK = 2.097152Mhz;

  接下来将时钟信号输出到示波器上验证一下,MCLK输出复用P7.7脚,SMCLK输出复用P2.2脚,ACLK复用P1.0脚,实验板上只引出P1.0和P2.2,所以我们只测试ACLK和SMCLK,可以看到ACLK = 32.86khz,SMCLK = MCLK = 1.05Mhz,LED闪烁频率大约为1hz;

 1 #include <msp430.h> 
 2 
 3 int main(void)
 4 {
 5     volatile unsigned int i;    //循环变量
 6     WDTCTL = WDTPW | WDTHOLD;    // stop watchdog timer
 7     P4DIR |= (BIT1+BIT7);       //P4.7观察现象,P4.1用于示波器观测
 8     P4OUT |= (BIT1+BIT7);       //输出高电平,点亮LED
 9     P1DIR |= BIT0;
10     P1SEL |= BIT0;              //P1.0输出ACLK
11     P2DIR |= BIT2;
12     P2SEL |= BIT2;              //P2.2输出SMCLK
13     while(1)
14     {
15         P4OUT ^= (BIT1+BIT7);   //LED状态取反
16         for(i = 50000;i>0;i--); //delay
17     }
18 }

 

2)配置内部时钟源

  编程思路:内部钟源默认都可用,所以直接修改UCSCTL4寄存器配置即可;

1、修改时钟源,将ACLK配置为VLOCLK内部超低功耗振荡器,可以看到,ACLK = VCOCLK = 9.21Khz

加入这行代码:

UCSCTL4 |= SELA_1;          //配置ACLK = VCOCLK

2、修改时钟源,配置ACLK为REFOCLK,内置调整低频参考振荡器,可以看到,ACLK = REFOCLK = 32.86Khz

UCSCTL4 |= SELA_2;          //配置ACLK = REFOCLK

 

3、修改时钟源,配置ACLK为DCOCLK,可以看到,ACLK = DCOCLK = 2.11Mhz

UCSCTL4 |= SELA_3;          //配置ACLK = DCOCLK

 

4、修改时钟源,配置ACLK为DCOCLKDIV,可以看到,ACLK = DCOCLKDIV = 1.06Mhz

UCSCTL4 |= SELA_4;          //配置ACLK = DCOCLKDIV

3)配置外部时钟源

编程思路:

  • 配置XT1/XT2连接晶振的引脚(PXSEL)
  • 清除XT1,XT2,DCO失效标志位
  • 修改UCSCTL4寄存器,选择时钟源

1、修改时钟源,配置ACLK = 32.768Khz,MCLK = SMCLK = DCOCLKDIV=1.05M;

#include <msp430.h>

int main(void)
{
    volatile unsigned int i;    //循环变量
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    P4DIR |= (BIT1+BIT7);       //P4.7观察现象,P4.1用于示波器观测
    P4OUT |= (BIT1+BIT7);       //输出高电平,点亮LED
    P1DIR |= BIT0;
    P1SEL |= BIT0;              //P1.0输出ACLK
    P2DIR |= BIT2;
    P2SEL |= BIT2;              //P2.2输出SMCLK

    P5SEL   |= BIT4+BIT5;       //P5.4和P5.5选择XT1晶振功能
    UCSCTL3 |= SELREF_0;        //设置FLL参考时钟源为XT1
    do
    {
       UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                //清除XT2,XT1,DCO故障失效标志位
       SFRIFG1 &= ~OFIFG;       //清除晶振故障失效中断标志位
    }while(SFRIFG1&OFIFG);      //晶振故障失效中断标志位
    UCSCTL6 &= ~XT1DRIVE_0;     //减少XT1驱动能力
    UCSCTL4 |= SELA_0;          //ACLK = XT1CLK

    while(1)
    {
        P4OUT ^= (BIT1+BIT7);   //LED状态取反
        for(i = 50000;i>0;i--); //delay
    }
}

 

2、修改时钟源,配置ACLK = MCLK = SMCLK = XT2CLK =4Mhz

#include <msp430.h>

int main(void)
{
    volatile unsigned int i;    //循环变量
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    P4DIR |= (BIT1+BIT7);       //P4.7观察现象,P4.1用于示波器观测
    P4OUT |= (BIT1+BIT7);       //输出高电平,点亮LED
    P1DIR |= BIT0;
    P1SEL |= BIT0;              //P1.0输出ACLK
    P2DIR |= BIT2;
    P2SEL |= BIT2;              //P2.2输出SMCLK

    P5SEL   |= BIT2+BIT3;       //P5.2和P5.3选择XT2晶振功能
    UCSCTL3 |= SELREF_5;        //设置FLL参考时钟源为XT2CLK
    UCSCTL4 |= SELA_5;          //必须要设置这一句配置ACLK = XT2CLK
    do
    {
       UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                //清除XT2,XT1,DCO故障失效标志位
       SFRIFG1 &= ~OFIFG;       //清除晶振故障失效中断标志位
    }while(SFRIFG1&OFIFG);      //晶振故障失效中断标志位
    UCSCTL6 &= ~XT2DRIVE_0;     //XT2 = 4M,减少XT2驱动能力
    UCSCTL4 |= SELS_5 + SELM_5; //配置MCLK = SMCLK = XT2CLK

    while(1)
    {
        P4OUT ^= (BIT1+BIT7);   //LED状态取反
        for(i = 50000;i>0;i--); //delay
    }
}

 示波器观测结果,可以看到LED闪烁频率也比之前加快4倍:

 3、修改时钟源,配置ACLK = 32.768Khz,MCLK = SMCLK = XT1CLK * (499+1) =16Mhz

#include <msp430.h>

int main(void)
{
    volatile unsigned int i;    //循环变量
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    P4DIR |= (BIT1+BIT7);       //P4.7观察现象,P4.1用于示波器观测
    P4OUT |= (BIT1+BIT7);       //输出高电平,点亮LED
    P1DIR |= BIT0;
    P1SEL |= BIT0;              //P1.0输出ACLK
    P2DIR |= BIT2;
    P2SEL |= BIT2;              //P2.2输出SMCLK

    P5SEL   |= BIT4+BIT5;       //P5.4和P5.5选择XT1晶振功能
    UCSCTL3 |= SELREF_0;        //设置FLL参考时钟源为XT1
    UCSCTL4 |= SELA_0;          //ACLK = XT1CLK
    UCSCTL0 = 0;                //设置DCO=MOD=0  
    do
    {
       UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                //清除XT2,XT1,DCO故障失效标志位
       SFRIFG1 &= ~OFIFG;       //清除晶振故障失效中断标志位
    }while(SFRIFG1&OFIFG);      //晶振故障失效中断标志位
    UCSCTL6 &= ~XT1DRIVE_0;     //减少XT1驱动能力
    __bis_SR_register(SCG0);    //禁止FLL
    UCSCTL1 = DCORSEL_4;        //选择DCO频率范围
    UCSCTL2 |= 499;             //设置频率16Mhz
    __bic_SR_register(SCG0);    //启用FLL
    for(i = 50000;i>0;i--);     //delay,等待FLL稳定

    while(1)
    {
        P4OUT ^= (BIT1+BIT7);   //LED状态取反
        for(i = 50000;i>0;i--); //delay
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1116292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客:NC59 矩阵的最小路径和

牛客&#xff1a;NC59 矩阵的最小路径和 文章目录 牛客&#xff1a;NC59 矩阵的最小路径和题目描述题解思路题解代码 题目描述 题解思路 动态规划&#xff0c;递推公式&#xff1a;matrix[i][j] min(matrix[i-1][j], matrix[i][j-1]) 题解代码 func minPathSum( matrix [][…

性能压测工具 —— wrk

一般我们压测的时候&#xff0c;需要了解衡量系统性能的一些参数指标&#xff0c;比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线&#xff1a;P95。平均100%的请求中95%已经响应的时间 99线&#xff1a;P99。平均100%的请求中99%已经响应的时间 平…

maven聚合和继承

一、什么是maven的聚合和继承&why 随着技术飞速发展&#xff0c;各类用户对软件的要求越来越高&#xff0c;软件也变得越来越复杂。 软件设计人员往往会采用各种方式对软件划分模块&#xff0c;已得到更加清晰的设计及更高的复用性。 当把Maven应用到实际项目中的时候&am…

多年没有遇到如此流畅的面试了

美东一公司的面试&#xff0c;有多年没有遇到如此流畅的面试了。 本来说的面试时间是 30 分钟&#xff0c;这个还是第一轮处于电话面试那种&#xff0c;但是不知道为什么最后面试整个时间都延长到了快一个小时&#xff0c;貌似双方都还继续沟通下&#xff0c;有点意犹未尽的感觉…

ZKP5.1 Plonk Interactive Oracle Proofs (KZG‘10)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 5: The Plonk SNARK (Dan Boneh) 5.1 KZG’10 general SNARK A polynomial commitment scheme A polynomial interactive oracle proof (IOP) Review: polynomial commitments The KZG poly-commit scheme commit a bind…

自动化测试07Selenium01

目录 什么是自动化测试 Selenium介绍 Selenium是什么 Selenium特点 工作原理 SeleniumJava环境搭建 Selenium常用的API使用 定位元素findElement CSS选择语法 id选择器&#xff1a;#id 类选择 .class 标签选择器 标签名 后代选择器 父级选择器 自己选择器 xpath …

AM@两种余项型泰勒公式的对比和总结@常用函数的麦克劳林公式

文章目录 abstract两种余项型泰勒公式的对比和总结Maclaurin公式常用函数的Maclaurin公式推导例求极限按幂展开 abstract 泰勒公式的两种余项型(Penao&Lagrange)泰勒公式的对比和总结常用的Maclaurin公式列举(Peano余项型为主) 两种余项型泰勒公式的对比和总结 Taylor公式…

Youtrack Linux 安装

我们考虑最后应该使用的是 ZIP 方式的安装。 按照官方的说法如何设置运行 YouTrack 应该是非常简单的。 准备环境 根据官方的说法&#xff0c;我们需要做的就是下载 Zip 包&#xff0c;然后把 Zip 包解压到指定的目录中就可以了。 下载 当前官方的下载地址为&#xff1a;Ge…

Vue解决 npm -v 报错(一)

报错内容&#xff1a; npm WARN config global --global, --local are deprecated. Use --locationglobal instead. 解决方案&#xff1a; 代码&#xff1a; prefix -g 替换为&#xff1a; prefix --locationglobal 原创作者&#xff1a;吴小糖 创作时间&#xff1a;2023.1…

盒式交换机堆叠配置

目录 1.配置环形拓扑堆叠 2.设备组建堆叠 3.设备组件堆叠 堆叠 istack&#xff0c;是指将多台支持堆叠特性的交换机设备组合在一起&#xff0c;从逻辑上组合成一台交换设备。如图所示&#xff0c;SwitchA与 SwitchB 通过堆叠线缆连接后组成堆叠 istack&#xff0c;对于上游和…

Windows Server服务器下的Linux子系统

Windows、Linux看似死敌一对&#xff0c;但其实微软对于开源实业还是相当支持的&#xff0c;Windows 10系统内就首次内置了一个Linux子系统(Windows Subsystem for Linux/WSL)&#xff0c;允许开发者模拟Linux环境&#xff0c;而且有需要的可以直接从Windows应用商店下载SUSE、…

软件项目管理【UML-组件图】

目录 一、组件图概念 二、组件图包含的元素 1.组件&#xff08;Component&#xff09;->构件 2.接口&#xff08;Interface&#xff09; 3.外部接口——端口 4.连接器&#xff08;Connector&#xff09;——连接件 4.关系 5.组件图表示方法 三、例子 一、组件图概念…

Linux简单安装ffmpeg 实现用PHP压缩音频

一、下载安装 1、官方下载地址&#xff1a;Download FFmpeg 2、下载完上传到服务器然 然后解压就算安装完成了 tar -xf ffmpeg-git-amd64-static.tar.xz 3、然后配置一下全局变量&#xff08;当然也可以不用配置 使用的时候带上文件路径就行&#xff09; cd /usr/bin ln -s…

互联网Java工程师面试题·Java 总结篇·第十一弹

目录 90、简述一下你了解的设计模式。 91、用 Java 写一个单例类。 92、什么是 UML&#xff1f; 93、UML 中有哪些常用的图&#xff1f; 94、用 Java 写一个冒泡排序。 95、用 Java 写一个折半查找。 90、简述一下你了解的设计模式。 所谓设计模式&#xff0c;就是一套被…

Ae 效果:CC Overbrights

实用工具/CC Overbrights Utility/CC Overbrights CC Overbrights&#xff08;CC 高光溢出&#xff0c;CC 过于鲜亮&#xff09;主要用于改变图像中高光溢出&#xff08;又称高光剪切、过曝&#xff09;区域的显示方式&#xff0c;以便配合其它效果来更好地处理和控制这些区域的…

分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现SSA-CNN-LSTM数据分类预测&…

Maven系列第8篇:大型Maven项目,快速按需任意构建

本篇涉及到的内容属于神技能&#xff0c;多数使用maven的人都经常想要的一种功能&#xff0c;但是大多数人都不知道如何使用&#xff0c;废话不多说&#xff0c;上干货。 需求背景 我们需要做一个电商项目&#xff0c;一般都会做成微服务的形式&#xff0c;按业务进行划分&am…

自然语言处理基础——词表示

词表示 把自然语言中最基本的语言单元——词转换为机器能够理解的 词表示能完成以下两个能力 词相似度计算 词与词之间语义的关系 近义词&上位词 使用近义词或上位词表示的问题 遗漏差异 遗漏新的释义 带有主观性 数据吸收 需要大量人工构建 One-Hot Representation …

AI全栈大模型工程师(九)Function Calling 的机制

文章目录 Function Calling 的机制Function Calling 示例 1:加法计算器Function Calling 实例 2:四则混合运算计算器后记Function Calling 的机制 Function Calling 示例 1:加法计算器 需求:用户输入任意可以用加法解决的问题,都能得到计算结果。 # 加载环境变量import o…

微信小程序前后端交互与WXS的应用

目录 前言 一、后台数据交互 1.数据表 2.后端代码的实现 3.前后端交互 3.1.后端接口URL管理 3.2.发送后端请求 3.3.请求方式的封装 4.前端代码的编写 二、WXS的使用 1、.wxs 文件 2.综合运用 前言 当今社交媒体的普及使得微信小程序成为了一种流行的应用开发形式。…