当前位置: 首页 > news >正文

MSP430F5529晶振配置

MSP430(F5529)相比MSP430(F149)来讲,功能更加强大。

UCS简介
MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源,依次是:XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK。这五种时钟的详细介绍请参考该系列芯片的指导手册,其中XT1CLK、VLOCLK、REFOCLK和XT2CLK跟MSP430F1XX系列没有太大区别,学习配置起来也比较简单。

UCS上电默认状态

PUC后,UCS模块的默认状态如下:

XT1处于LF模式作为XT1CLK时钟源。ACLK选通为XT1CLK。  
MCLK选通为DCOCLKDIV  
SMCLK选通为DCOCLKDIV  
FLL使能,且将XT1CLK作为FLL参考时钟。  
XIN和XOUT脚设置为通用IO,XIN和XOUT配置为XT1功能前,XT1保持禁用。  
如果可用的话,XT2IN和XT2OUT被设置为通用IO且保持禁止状态。  
UCS时钟源切换

由于REFOCLK、VLOCLK、DCOCLK(这里暂时这么认为)默认状态下是可用的,所以,切换的时候只需要通过UCSCTL4来配置ACLK、SMCLK和MCLK的时钟源即可,而XT1CLK和XT2CLK需要根据硬件的具体配置情况确定,所以,这两者的配置比起前三者来讲,就有些不同了。下面,我们做三个实验:

(1)将MCLK和SMCLK配置REFOCLK、VLOCLK
REFOCLK和VLOCLK是芯片默认提供的,只要芯片正常工作,这两个时钟就会正常工作,因此,该时钟配置非常简单,只需要修改UCSCTL4,将SELS和SELM配置为对应的选项VLOCLK或者REFOCLK即可,具体代码如下:

#include <msp430f5529.h>void main(void) {WDTCTL = WDTPW+WDTHOLD;P1SEL |= BIT0;P1DIR |= BIT0;//测量ACLK用P2SEL |= BIT2;P2DIR |= BIT2;//测量SMCLK用P7SEL |= BIT7;P7DIR |= BIT7;//测量MCLK用//UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_1|SELM_1; //将SMCLK和MCLK配置为VLOCLKUCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_2|SELM_2; //将SMCLK和MCLK配置为REFOCLKwhile(1);}

上面的代码就实现了将SMCLK和MCLK切换为VLOCLK和REFOCLK,ACLK的操作也是同样的,不作过多解释。
(2)将MCLK和SMCLK配置XT1CLK

XT1CLK的配置要分为以下几步:

配置IO口5.4和5.5为XT1功能。  
配置XCAP为XCAP_3,即12PF的电容。  
清除XT1OFF标志位。  
等待XT1起振。         
具体的代码如下: 

#include <msp430f5529.h>  void main(void) {  WDTCTL = WDTPW+WDTHOLD;  P1SEL |= BIT0;  P1DIR |= BIT0;//测量ACLK用  P2SEL |= BIT2;  P2DIR |= BIT2;//测量SMCLK用  P7SEL |= BIT7;  P7DIR |= BIT7;//测量MCLK用  P5SEL |= BIT4|BIT5; //将IO配置为XT1功能  UCSCTL6 |= XCAP_3;  //配置电容为12pF  UCSCTL6 &= ~XT1OFF; //使能XT1  while (SFRIFG1 & OFIFG){  UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位  // 这里需要清除三种标志位,因为任何一种  // 标志位都会将OFIFG置位  SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位  }  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_0|SELM_0;     //将SMCLK和MCLK时钟源配置为XT1  while(1);  
}  


(3)将SMCLK和MCLK配置XT2
将SMCLK和MCLK配置为XT2跟配置为XT1的过程基本相同,唯一不同的是,在配置SMCLK和MCLK为XT2之前,需要将ACLK和REFCLK的时钟源,因为ACLK和REFCLK的默认时钟源是XT1,而我们这里并没有配置启动XT1CLK,所以会产生XT1时钟错误,即XT1LFFG,因此,我们先将ACLK和REFCLK配置为芯片自带的时钟(REFOCLK或VLOCLK)或者即将启动的时钟(XT2),此外,XT2配置时不需要配置电容,故将SMCLK和MCLK配置为XT2的代码如下:

#include <msp430f5529.h>  void main(void) {  WDTCTL = WDTPW+WDTHOLD;  P1SEL |= BIT0;  P1DIR |= BIT0;//测量ACLK用  P2SEL |= BIT2;  P2DIR |= BIT2;//测量SMCLK用  P7SEL |= BIT7;  P7DIR |= BIT7;//测量MCLK用  P5SEL |= BIT2|BIT3; //将IO配置为XT2功能  UCSCTL6 &= ~XT2OFF; //使能XT2  UCSCTL4 = UCSCTL4&(~(SELA_7))|SELA_1; //先将ACLK配置为VLOCLK  UCSCTL3 |= SELREF_2;                  //将REFCLK配置为REFCLK  while (SFRIFG1 & OFIFG){  UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // 清除三类时钟标志位  // 这里需要清除三种标志位,因为任何一种  // 标志位都会将OFIFG置位  SFRIFG1 &= ~OFIFG;                                  // 清除时钟错误标志位  }  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_5|SELM_5;     //将SMCLK和MCLK时钟源配置为XT2  while(1);  
}  


DCO模块详解
DCO模块在MSP430F5XX系列芯片中非常重要,因为从MSP430F4XX开始,MSP430引用了FLL模块,FLL即锁相环,可以通过倍频的方式提高系统时钟频率,进而提高系统的运行速度。
DCO模块运行需要参考时钟REFCLK,REFCLK可以来自REFOCLK、XT1CLK和XT2CLK,通过UCSCTL3的SELREF选择,默认使用的XT1CLK,但如果XT1CLK不可用则使用REFOCLK。
DCO模块有两个输出时钟信号,级DCOCLK和DCOCLKDIV,其中,倍频计算公式如下:

DCOCLK = D*(N+1)*(REFCLK/n)  
DCOCLKDIV = (N+1)*(REFCLK/n)  
其中:
n即REFCLK输入时钟分频,可以通过UCSCTL3中的FLLCLKDIV设定,默认为0,也就是不分频;
D可以通过UCSCTL2中的FLLD来设定,默认为1,也就是2分频;
N可以通过UCSCTL2中的FLLN来设定,默认值为32。
所以,系统上电后如果不做任何设置,DCOCLK的实际值为2097152,DCOCLKDIV的实际值为1048576。
另外,配置芯片工作频率还需要配置DCORSEL和DCOx,DCORSEL和DCOx的具体作用如下:
DCORSEL位于UCSCTL1控制寄存器中的4到6位,共3位,将DCO分为8个频率段。
DCOx位于UCSCTL0中的8到12位,共5位,将DCORSEL选择的频率段分为32个频率阶,每阶比前一阶高出约8%,该寄存器系统可以自动调整,通常配置为0。
DCORSEL和DCOx值的具体作用可以参考MSP430F5529的数据手册,阅读该手册相关部分可以找到如下表格:

可以见,DCORESL的频率调节范围大致如下:

DCORSEL = 0的调节范围约为0.20~0.70MHZ;  
DCORSEL= 1的调节范围约为0.36~1.47MHZ;  
DCORSEL = 2的调节范围约为0.75~3.17MHZ;  
DCORSEL = 3的调节范围约为1.51~6.07MHZ;  
DCORSEL = 4的调节范围约为3.2~12.3MHZ;  
DCORSEL = 5的调节范围约为6.0~23.7MHZ;  
DCORSEL = 6的调节范围约为10.7~39.7MHZ;  
DCORSEL = 7的调节范围约为19.6~60MHZ。  
理解了上面这些,可以理解TI官方例子中的代码了,官方代码中的相关部分如下:

if (fsystem <= 630)            //           fsystem < 0.63MHz  
  UCSCTL1 = DCORSEL_0;  
else if (fsystem <  1250)      // 0.63MHz < fsystem < 1.25MHz  
  UCSCTL1 = DCORSEL_1;  
else if (fsystem <  2500)      // 1.25MHz < fsystem <  2.5MHz  
  UCSCTL1 = DCORSEL_2;  
else if (fsystem <  5000)      // 2.5MHz  < fsystem <    5MHz  
  UCSCTL1 = DCORSEL_3;  
else if (fsystem <  10000)     // 5MHz    < fsystem <   10MHz  
  UCSCTL1 = DCORSEL_4;  
else if (fsystem <  20000)     // 10MHz   < fsystem <   20MHz  
  UCSCTL1 = DCORSEL_5;  
else if (fsystem <  40000)     // 20MHz   < fsystem <   40MHz  
  UCSCTL1 = DCORSEL_6;  
else  
  UCSCTL1 = DCORSEL_7;  
都在前面讲到的范围内,由于前面的范围有重叠部分,例子代码中的值是TI的工程师根据上面这些参数选取的比较合理的值。
到这里,我相信大家配合芯片手册和本文,都能明白DCO配置相关部分的原理了,下面是将DCO参考时钟选为XT1,并将DCOCLK倍频到25M的详细代码:

#include <msp430f5529.h>  void delay(){  volatile unsigned int i;  for(i = 0; i != 5000; ++i){  _NOP();  }  
}  void SetVcoreUp (unsigned int level)  
{  // Open PMM registers for write  PMMCTL0_H = PMMPW_H;  // Set SVS/SVM high side new level  SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;  // Set SVM low side to new level  SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;  // Wait till SVM is settled  while ((PMMIFG & SVSMLDLYIFG) == 0);  // Clear already set flags  PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);  // Set VCore to new level  PMMCTL0_L = PMMCOREV0 * level;  // Wait till new level reached  if ((PMMIFG & SVMLIFG))  while ((PMMIFG & SVMLVLRIFG) == 0);  // Set SVS/SVM low side to new level  SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;  // Lock PMM registers for write access  PMMCTL0_H = 0x00;  
}  void main(void) {  WDTCTL = WDTPW+WDTHOLD;  P1SEL &= ~BIT1;  P1DIR |= BIT1;  P1SEL |= BIT0; //ACLK  P1DIR |= BIT0;  P2SEL |= BIT2; //SMCLK  P2DIR |= BIT2;  P7SEL |= BIT7; //MCLK  P7DIR |= BIT7;  P5SEL |= BIT4|BIT5;  UCSCTL6 |= XCAP_3;  UCSCTL6 &= ~XT1OFF;  SetVcoreUp(1); //一次提高Vcore电压等级,具体请参考手册  SetVcoreUp(2);  SetVcoreUp(3);  __bis_SR_register(SCG0);  UCSCTL0 = 0;  UCSCTL1 = DCORSEL_6;  UCSCTL2 = FLLD_1 | 380;  __bic_SR_register(SCG0);  __delay_cycles(782000);  /* * 默认状态下:ACLK=FLLREFCLK=XT1 SMCLK=MCLK=DCOCLKDIV XT2关闭 * 为了不产生XT1LFOFFG,将ACLK和FLLREFCLK设置为REFOCLK * 并打开XT2OFF,否则XT2将处于无法使用状态 * */  //UCSCTL6 &= ~(XT2DRIVE0|XT2DRIVE1|XT2OFF);  while (SFRIFG1 & OFIFG) {                               // Check OFIFG fault flag  UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);         // Clear OSC flaut Flags  SFRIFG1 &= ~OFIFG;                                  // Clear OFIFG fault flag  }  UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_3|SELM_3;  while(1){  P1OUT ^= BIT1;  delay();  }  
}


————————————————
版权声明:本文为CSDN博主「wzx@seu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wzx104104104/article/details/109105687

相关文章:

MSP430F5529晶振配置

MSP430(F5529)相比MSP430(F149)来讲&#xff0c;功能更加强大。 UCS简介 MSP430F5XX/MSP430F6XX系列器件的UCS包含有五种时钟源&#xff0c;依次是&#xff1a;XT1CLK、VLOCLK、REFOCLK、DCOCLK和XT2CLK。这五种时钟的详细介绍请参考该系列芯片的指导手册&#xff0c;其中XT1C…...

[架构之路-237]:目标系统 - 纵向分层 - 网络通信 - DNS的递归查询和迭代查询

目录 一、DNS协议与DNS系统架构 1.1 什么是DNS协议 1.2 为什么需要DNS协议 1.3 DNS系统架构 二、DNS系统的查询方式 2.1 递归与迭代的比较 2.2 DNS递归查询 2.3 DNS迭代查询 一、DNS协议与DNS系统架构 1.1 什么是DNS协议 DNS&#xff08;Domain Name System&#xff…...

vue2 集成 Onlyoffice

缘起于进行了一次在线 Office 解决方案的调研&#xff0c;对比了 Office365、可道云、WPS Office、PageOffice 等厂商&#xff0c;最终敲定了使用 Onlyoffice&#xff0c;故整理了一份 Onlyoffice 从零开始系列教程&#xff0c;这是第一篇。 一、Onlyoffice 是什么&#xff1f…...

天锐绿盾透明加密、半透明加密、智能加密这三种不同加密模式的区别和适用场景——@德人合科技-公司内部核心文件数据、资料防止外泄系统

由于企事业单位海量的内部数据存储情况复杂&#xff0c;且不同公司、不同部门对于文件加密的需求各不相同&#xff0c;单一的加密系统无法满足多样化的加密需求。天锐绿盾企业加密系统提供多种不同的加密模式&#xff0c;包括透明加密、半透明加密和智能加密&#xff0c;用户可…...

六、DHCP实验

拓扑图&#xff1a; DHCP协议&#xff0c;给定一个ip范围使其自动给终端分配IP&#xff0c;提高了IP分配的效率 首先对PC设备选择DHCP分配ip 首先先对路由器的下端配置网关的ip 创建地址池&#xff0c;通过globle的方式实现DHCP ip pool 地址池名称 之后设置地址池的网关地址…...

N沟道场效应管 FDA69N25深度图解 工作原理应用

深力科推荐一款 FDA69N25是高压 MOSFET产品&#xff0c;基于平面条形和 DMOS 技术。 该 MOSFET 产品专用于降低通态电阻&#xff0c;并提供更好的开关性能和更高的雪崩能量强度。 该器件系列适用于开关电源转换器应用&#xff0c;如功率因数校正&#xff08;PFC&#xff09;、…...

Python爬虫入门教程

文章目录&#xff1a; 一&#xff1a;Python基础 二&#xff1a;爬虫须知 1.流程 2.遵守规则 三&#xff1a;HTTP请求和响应 1.相关定义 2.HTTP请求响应 2.1 完整的HTTP请求 2.2 完整的HTTP响应 3.Requests库 四&#xff1a;HTML 1.HTML网页结构 2.常用标 参考&…...

使用正则前瞻检查密码强度

使用正则前瞻检查密码强度 题目要求 要求密码必须包含大小写字母&#xff0c;并且至少包含 $,_. 中的一个特殊字符。 在这道题中&#xff0c;我们可以使用正则表达式的前瞻运算来实现。 const reg /^(?.*\d)(?.*[a-z])(?.*[A-Z])(?.*[$,_.])[\da-zA-Z$,_.]{6,12}/;con…...

react+ts手写cron表达式转换组件

前言 最近在写的一个分布式调度系统&#xff0c;后端同学需要让我传入cron表达式&#xff0c;给调度接口传参。我去了学习了解了cron表达式的用法&#xff0c;发现有3个通用的表达式刚好符合我们的需求&#xff1a; 需求 每天 xx 的时间&#xff1a; 0 11 20 * * ? 上面是…...

民安智库(第三方市民健康素养调研)居民健康素养调查的重要性及实施步骤

一、背景和意义 健康素养是衡量一个社区或国家居民对健康知识的理解&#xff0c;以及他们如何将这些知识应用于日常生活中的能力的重要指标。它不仅包括了基本的医学知识&#xff0c;如疾病预防和治疗&#xff0c;也包括了生活方式的改善&#xff0c;如合理饮食和适当运动。因…...

Linux | vim的入门手册

目录 前言 一、什么是vim 二、vim编辑器的模式 1、插入模式 &#xff08;1&#xff09;用vim打开文件 &#xff08;2&#xff09;进入插入模式 2、默认模式 &#xff08;1&#xff09;光标移动 &#xff08;2&#xff09;复制、粘贴与剪切操作 &#xff08;3&#x…...

B053 项目部署

目录 Linux简介虚拟机软件安装安装centos步骤备份系统网络设置 远程访问Linux步骤永久关闭CentOS防火墙 linux命令linux文件系统linux常用命令目录相关命令文件相关命令 安装JDK先卸载自带的JDK安装JDK复制压缩包到linux解压配置环境变量 安装MySql清理旧文件安装mysqlMysql编码…...

视觉Slam面试题(不定时更新)

文章目录 0 引言1 单目、双目、深度相机和RGBD相机的区别2 特征点法与直接法的优缺点3 等距变换、相似变换、仿射变换、射影变换的区别4 单应矩阵、本质矩阵和基础矩阵的区别5 Slam中为什么用李群李代数6 解释Slam中的绑架问题7 ORB、SIFT和SURF特征点检测算法的区别8 什么是对…...

从入门到进阶 之 ElasticSearch 节点配置 集群篇

&#x1f339; 以上分享 ElasticSearch 安装部署&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏&#x1f431;‍&a…...

UE4中无法保存项目问题

系列文章目录 文章目录 系列文章目录前言一、解决方法 前言 取消&#xff1a;停止保存所有资产并返回编辑器。 重试&#xff1a;尝试再次保存资产。 继续&#xff1a;仅跳过保存该资产。 当我点击继续时&#xff0c;关闭项目&#xff0c;然后重新打开项目&#xff0c;发现之前…...

解剖—顺序表相关OJ练习题

目录 一、删除有序数组中的重复项&#xff0c;返回出现一次元素的个数。 二、原地移除数组中所有数值等于val的元素 三、合并两个有序数组 四、旋转数组 五、数组形式的整数加法 一、删除有序数组中的重复项&#xff0c;返回出现一次元素的个数。 26. 删除有序数组中的重…...

NAT网关在阿里云的应用

NAT网关&#xff08;Network Address Translation Gateway&#xff09;是一种网络地址转换服务&#xff0c;提供NAT代理&#xff08;SNAT和DNAT&#xff09;能力。NAT是用于在本地网络中使用私有地址&#xff0c;在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决I…...

操作系统体系结构和OS

1.冯诺依曼计算机体系 关于冯诺伊曼系统&#xff0c;在这里我只是简单讲一讲&#xff0c;更加详细的内容可以看我的计算机组成系列。 常见的笔记本、台式机&#xff0c;不常见的服务器、工作站&#xff0c;大部分都遵守“冯诺依曼体系”&#xff0c;因此该计算机体系就是现代…...

Flutter ☞ 常量

常量 只能被定义一次&#xff0c;并且不可修改的值叫做常量。 在 Flutter 中有两种常量修饰方法 finalconst 相同点 类型声明可以省略 final String a 123; final a 123;const String a 123; const a 123;初始化后不能再赋值 final a 123; a abc; // 错误const a …...

C++ 配置VSCode开发环境

C配置VSCode开发环境 简介 Visual Studio Code (VSCode) 是一款开源的轻量级代码编辑器。它支持许多编程语言&#xff0c;包括C。本文档将详细介绍如何在Windows环境下配置VSCode的C开发环境。 安装步骤 1. 安装Visual Studio Code 首先&#xff0c;你需要下载并安装Visua…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...