1飞思卡尔8位单片机MC9S08JM60开发板实践教程-60页word资料
- 格式:docx
- 大小:315.21 KB
- 文档页数:58
第17章通用串行总线设备控制器 (S08USBV1)17.1 介绍这一章描述了通用串行总线设备控制器 (S08USBV1) 模块,它基于通用串行总线规格版本2.0。
该USB 总线设计目的是替代已经存在的用于PC 机外围设备的RS-232, PS/2, 和 IEEE 1284 总线。
这种S08USBV1 模块提供单片全速(12 Mbps)USB 设备应用的解决方案,而且集成了必需的带有串行接口引擎(SIE )的收发器,3.3-V 调节器, 端点RAM 和其他控制逻辑。
17.1.1 时钟要求S08USBV1需要两个时钟源,一个是24 MHz 总线时钟和一个48 MHz 基准时钟。
它的48 MHz 时钟是直接来自MCGOUT 。
为了获得48 MHz 的时钟速率, MCG 必需被恰当地配置成PLL 使能的外部(PEE) 模式,外接一晶振。
对于USB 操作,例如MCG 配置使用PEE 模式包括: • 2 MHz 晶振 – RDIV = 000 , VDIV = 0110 • 4 MHz 晶振 – RDIV = 001 , VDIV = 011017.1.2 在USB 挂起模式的电流消耗在USB 挂起模式,USB 设备的电流消耗被限制在500 μA 。
当USB 设备进入挂起模式,为了符合USB 挂起模式的电流消耗要求,固件通常进入停止3模式。
注意:允许LVD 将增加在停止模式3下的电流消耗。
因此,为了能满足USB 挂起模式的要求,在进入停止模式3前要禁止LVD 。
F RE E-TE C H飞锐泰克17.1.3 内部3.3V 稳压器如果使用一个外部3.3-V 调节器作为输入给V USB33 (仅仅当USBVREN = 0), 供应电压,V DD , 必须不能低于输入给V USB33引脚的电压。
如果使用内部3.3-V 调节器 (USBVREN = 1), 确保不要把外部供应电压连接到V USB33 引脚。
第一章搭建实验环境系统时钟设置#include "App\Include\App.h"#ifndef _MCG_C#define _MCG_C//oscillator 12MHZ 倍频为24MHZ()先8分频后16倍频void S_MCGInit(void)/* the MCG is default set to FEI mode, it should be change to FBE mode*/MCGC2[7:6] BDIV总线频率分频因子–选择由MCGC1寄存器中CLKS位决定的时钟源的分频。
这控制总线频率。
00 编码0 –时钟1分频01 编码1 –时钟2分频(复位后默认)10 编码2 –时钟4分频11 编码3 –时钟8分频[5] RANGE频率范围选择–选择外部振荡器或者外部时钟源的频率范围。
1 选择1MHz到16MHz外部振荡器的频率范围。
(1MHz到40MHz的外部时钟电源)的高频率范围0 选择32kHz到100kHz外部振荡器的频率范围。
(32kHz到1MHz的外部时钟电源)的低频率范围[4] HGO高增益振荡器选择–控制外部振荡器操作模式。
1 配置外部振荡器为高增益运行0 配置外部振荡器为低功耗运行[3] LP低功耗选择–控制在忽略模式中FLL(或者PLL)是否为无效1 FLL(或PLL)在忽略模式(低功耗)中为无效的。
0 FLL(或PLL)在忽略模式中为无效的。
[2] EREFS外部参考时钟选择–为外部参考选择时钟源1 选择振荡器0 选择外部时钟源[1] ERCLKEN外部参考时钟使能–使能外部参考时钟作为MCGERCLK1 MCGERCLK激活0 MCGERCLK 无效[0] EREFSTEN外部参考时钟停止使能MCGC2 0b0011 0110 激发外部时钟(晶振)(没有使能)MCGC2=MCGC2_RANGE_MASK|MCGC2_HGO_MASK|MCGC2_EREFS_MASK|MCGC2_ERCLK EN_MASK;while(!MCGSC_OSCINIT);//MCGSC寄存器中OSCINIT(第1位)为1,表示由EREFS位选择的晶振被初始化。
第一章搭建实验环境1、实验电路板及下载器实物图片2、实验电路图本实验图包含两大部分,分别是CPU.SCH和实验资源.SCH。
CPU采用飞思卡尔8位单片机MC9S08JM60CLD,(电路图介绍)图1-3实验资源部分电路图1-4LCD串口1602液晶电路图1-5RS232接口电路图1-6数码管显示电路图1-7发光管、ad转换以及按键电路图1-83、集成开发软件环境的建立1〉运行文件CW_MCU_V6_3_SE.EXE,在电脑C盘安装飞思卡尔8位(及简化32位)单片机集成开发环境codewarrior6.3版本2〉运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:\Program Files\pgo\USBDM 4.7.0,在这个目录下a>C:\Program Files\pgo\USBDM 4.7.0\FlashImages\JMxx下的文件USBDM_JMxxCLD_V4.sx是下载器的固件文件;b>C:\Program Files\pgo\USBDM4.7.0\USBDM_Drivers\Drivers下有下载器的usb驱动.因此在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动安装位置到以上目录即可。
3〉运行USBDM_4_7_0i_Win之后,还会在目录:C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.3\prog\gdi下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior集成开发环境下对usb下载器的调试、下载的支持。
4、C语言编程基础第二章 LED闪烁程序编写过程1、新建工程运行单片机集成开发环境codewarrior IDE出现如下界面●Create New Project :创建一个新项目工程●Load Example Project :加载一个示例工程●Load Previous Project :加载以前创建过的工程●Run Getting started Tutorial:运行CodeWarrior软件帮助文档●Start Using CodeWarrior:立刻使用CodeWarrior点击Create New project按钮,以创建一个新的工程,出现选择CPU的界面如下,请选择HCS08/HCS08JM Family/MC9S08JM60,在右边的Connection窗口可以选择最后一个开源下载器HCS08 Open Source BDM。
通过SCI口单片机通过飞思卡尔MC9S08及MC9S12 单片机更新程序的一种方法王佚(Freescale 8/16bit MCU FAE) 飞思卡尔的8/16 Bit 单片机内置FLASH可以通过单片机编程来进行擦除与编程,所以,理论上就可以通过SCI口接口实现软件的自我升级.在实际工作中,我们也遇到不少客户询问相关的实现方法,而我们也给了一些参考代码,但还是有不少工程师不能很好地理解,基于这些原因,我写了点东西来介绍一种比较简单的实现方法,供大家参考,如有不周,敬请批评与谅解.一,飞思卡尔MC9S08单片机内部存储器介绍MC9S08有很多系列单片机,一般程序空间均在64K以下,为了介绍方便,我们以MC9S08AW60一种为例进行介绍.上图为MC9S08AW60的数据空间分布图,对于大于64K空间的MC9S08单片机,其结构与MC9S12单片机类似,故先不做介绍.从图中我们不难看出,由于飞思卡尔单片机的数据存储器(RAM)与程序存储器(FLASH)是统一编址,所以,我们可以将程序引导到RAM里运行.二,飞思卡尔 8位单片机内部中断相量地址介绍飞思卡尔 8位单片机对中断处理是通过判断中断相量表的地址来判断程序的入口地址的.飞思卡尔 8位单片机的中断相量为16位,其放置在从0xFFFF地址向下按照中断号以此排放.三, 飞思卡尔MC9S08单片机FLASH操作简介飞思卡尔MC908及MC9S08系列单片机的FLASH都可以通过软件进行擦除与编程,不同的是MC908有相应的程序内置在单片机的ROM空间,而MC9S08没有,其需要用户自己编写.飞思卡尔的CodeWarrior for MC9(S)08软件在安装后,在\freescale\CodeWarrior for Microcontrollers V6.0\(CodeWarrior_Examples)\HCS08\Device Initialization C Examples\GB60_Modules\Sources\Flash_GB60目录下有响应的参考代码.MC9S08系列单片机的Flash有四种操作模式:Byte program, Byte program (burst), Page erase及Mass erase,其操作时间见下表.需要说明的是,在此操作其间,不可以使能任何中断.下图为操作流程图.需要说明的是,用来实现”Write a data value to an address in the FLASH array”的语句代码,表面上看是将一个数据写到一个Flash数据区去,但实际上是将所需要编程的Flash地址或是擦除的Flash的块地址及数据分别写入到单片机内类似地址积存器及数据寄存器里.CodeWarrior里自带的代码,是用机器码的方式来做的,其也给出了相应的代码,大家可以对应着看看,一般来说,只做Flash模拟EEPROM,该代码即可满足大家使用.在此,本文就不详细描述代码实现的方法.四,实现程序自我更新的两种常见方法及各自特点一般说来,我们有两种方法来,我们有两种常见方法实现程序自我更新.一种是将实现程序更新的部分的程序与应用程序融合在一起,系统在更新程序时甚至可以将整个程序包括更新程序一起更新掉,其优点是可以花费少的程序空间,缺点是数据及主程序空间分配比较麻烦,且在做更新程序时一旦掉电或是其它什么原因,可能无法进行程序的再次更新.另外一种是,将实现程序更新的程序写成是一个独立的程序,其缺点是要浪费部分程序空间,且中断相量无法更新所以要做程序的映射,类似引导(bootload)的概念.其优点是在编写应用程序时不用考虑数据空间地址分配的问题,同时不用担心下载过程出现任何异常情况.本文后面所涉及的内容,均以第二种方法为例,为描述方便,我们定义其为下载程序.五, 下载程序如何实现中断相量的映射由于我们无法预知究竟系统会用多少中断,所以对于应用程序的中断,都必须在更新程序中做映射,即,我们在单片机的某个程序空间建立一个程序跳转表,更新程序的中断相量表做一个固定的表,对应固定地址,我们只需在固定地址放相应的跳转指令,就可以实现中断相量的映射.例题如下:地址A: JMP 地址B. JMP地址B其实是个引导程序.中断相量<1>: 地址A.其中, “中断相量<1>”地址放的”地址A”由更新程序确定,而”地址A” 地址放的” JMP地址B”,JMP由计算机来添加,”地址B”则由应用程序确定.对于复位中断,其处理方法有点不同,其实现方法如下:中断相量<1>: Main.地址A:JMP 地址B.Main:If (a>b){goto地址B }中断相量表的定义参考方法如下:void (* const _vect[])() @0xFFCC = { /* Interrupt vector table */0xf998, /* Int.no. 25 Vrti (at FFCC) Unassigned */0xf99c, /* Int.no. 24 Viic1 (at FFCE) Unassigned */…_Startup /* Int.no. 0 Vreset (at FFFE) Reset vector */};六,单片机程序注意事项1,程序空间分配下载程序的空间应该从0xfff地址向下排放,具体大小需要根据实际的大小及单片机Flash的Block大小来同时决定.空间的安排,一定是Block的倍数.应用程序的空间是从程序的最低段开始排放,除了中断向量外,不可以有任何代码地址与下载程序重叠.在用CodeWarrior来写程序时,我们可以修改PRM文件来控制程序排放地址.下面是下载程序的PRM参考代码.NAMES ENDSEGMENTSROM = READ_ONLY 0xfA00 TO 0xFFAF;Z_RAM = READ_WRITE 0x0070 TO 0x00FF;RAM = READ_WRITE 0x0200 TO 0x086F;ROM2 = READ_ONLY 0xFFC0 TO 0xFFCB;ENDPLACEMENTDEFAULT_RAM INTO RAM;DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;ENDSTACKSIZE 0x802,程序代码保护为了使下载程序在任何异常情况下不会被改写,其除了放置引导程序的空间外,均要做代码保护.其在C语言种的参考代码如下.const unsigned char NVPROT_INIT @0x0000FFBD = 0xFA;.3,计算机应用程序如何处理单片机应用程序的中断相量表计算机在应用程序处理该中断相量表时,应根据下载程序的映射关系,将两个字节的相量数据自动计算到对应引导地址,并变为JMP+地址(相量)的模式.下面是参考转变模式.单片机应用程序复位相量为0x8000,其变为跳转后的代码则为0xCC8000.如本文参考代码,其对应引导地址为0xf9fc,则计算机应用程序则应通知下载程序在0Xf9fc后写0XCC8000三个字节数据,运行完成后,反编译的代码如下:F9FC: JMP 0x80003,其它建议为保证应用程序的正确性,可以在下载程序里判断程序的校验码,可以用16位CRC码等.七,S19文件格式简介S-记录实际上是由五个部分组成的字符串的集合。
第一章搭建实验环境系统时钟设置#include "App\Include\App.h"#ifndef _MCG_C#define _MCG_C//oscillator 12MHZ 倍频为24MHZ()先8分频后16倍频void S_MCGInit(void){/* the MCG is default set to FEI mode, it should be change to FBE mode*//************************************************************************** ***********MCGC2[7:6] BDIV总线频率分频因子–选择由MCGC1寄存器中CLKS位决定的时钟源的分频。
这控制总线频率。
00 编码0 –时钟1分频01 编码1 –时钟2分频(复位后默认)10 编码2 –时钟4分频11 编码3 –时钟8分频[5] RANGE频率范围选择–选择外部振荡器或者外部时钟源的频率范围。
1 选择1MHz到16MHz外部振荡器的频率范围。
(1MHz到40MHz的外部时钟电源)的高频率范围0 选择32kHz到100kHz外部振荡器的频率范围。
(32kHz到1MHz的外部时钟电源)的低频率范围[4] HGO高增益振荡器选择–控制外部振荡器操作模式。
1 配置外部振荡器为高增益运行0 配置外部振荡器为低功耗运行[3] LP低功耗选择–控制在忽略模式中FLL(或者PLL)是否为无效1 FLL(或PLL)在忽略模式(低功耗)中为无效的。
0 FLL(或PLL)在忽略模式中为无效的。
[2] EREFS外部参考时钟选择–为外部参考选择时钟源1 选择振荡器0 选择外部时钟源[1] ERCLKEN外部参考时钟使能–使能外部参考时钟作为MCGERCLK1 MCGERCLK激活0 MCGERCLK 无效[0] EREFSTEN外部参考时钟停止使能MCGC2 0b0011 0110 激发外部时钟(晶振)(没有使能)*************************************************************************** ***********/MCGC2=MCGC2_RANGE_MASK|MCGC2_HGO_MASK|MCGC2_EREFS_MASK|MCGC2_ERCLK EN_MASK;while(!MCGSC_OSCINIT);//MCGSC寄存器中OSCINIT(第1位)为1,表示由EREFS位选择的晶振被初始化。
第一章搭建实验环境1、实验电路板及下载器实物图片2、实验电路图本实验图包含两大部分,分别是CPU.SCH和实验资源.SCH。
CPU采用飞思卡尔8位单片机MC9S08JM60CLD,(电路图介绍)图1-3实验资源部分电路图1-4LCD串口1602液晶电路图1-5RS232接口电路图1-6数码管显示电路图1-7发光管、ad转换以及按键电路图1-83、集成开发软件环境的建立1〉运行文件CW_MCU_V6_3_SE.EXE,在电脑C盘安装飞思卡尔8位(及简化32位)单片机集成开发环境codewarrior6.3版本2〉运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:\Program Files\pgo\USBDM 4.7.0,在这个目录下a>C:\Program Files\pgo\USBDM 4.7.0\FlashImages\JMxx下的文件USBDM_JMxxCLD_V4.sx是下载器的固件文件;b>C:\Program Files\pgo\USBDM4.7.0\USBDM_Drivers\Drivers下有下载器的usb驱动.因此在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动安装位置到以上目录即可。
3〉运行USBDM_4_7_0i_Win之后,还会在目录:C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.3\prog\gdi下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior集成开发环境下对usb下载器的调试、下载的支持。
4、C语言编程基础第二章 LED闪烁程序编写过程1、新建工程运行单片机集成开发环境codewarrior IDE出现如下界面●Create New Project :创建一个新项目工程●Load Example Project :加载一个示例工程●Load Previous Project :加载以前创建过的工程●Run Getting started Tutorial:运行CodeWarrior软件帮助文档●Start Using CodeWarrior:立刻使用CodeWarrior点击Create New project按钮,以创建一个新的工程,出现选择CPU的界面如下,请选择HCS08/HCS08JM Family/MC9S08JM60,在右边的Connection窗口可以选择最后一个开源下载器HCS08 Open Source BDM。
下一步后出现编程语言选择和指定项目名称以及存放位置界面选择C语言,项目名称就写“LED闪烁”,保存位置自己决定,但要记住。
后面有些选项就暂时跳过,选择“完成”后,并将文件夹展开的样子如下:点击“make”快捷按钮正确编译后,左边的钩钩全部消失,同时在Code和Data列出现了相关的代码和数据量。
2、修改主文件并下载运行在左侧双击mian.c文件,打开该文件的编辑界面,修改文件直到下面模样:修改完main.c文件后,点击最右边的debug按钮。
出现下载器配置界面,如果没出现说明下载器没有正确安装。
选择“5V”是打算让下载器给目标板供电5V。
确保其它选项都对后,选择“ok”出现装载警告继续“ok”后程序下载到单片机中。
在调试界面里点击运行按钮,让程序全速运行后应该看到两个LED交替点亮。
3、延伸讨论1〉在修改主程序main.c的过程中,对寄存器SOPT1、PTBDD_PTBDD0、PTBD_PTBD0的名称问题,对于刚入手者确实有一定难度。
由于包含了文件"derivative.h",该文件又包含了“MC9S08JM60.h”,这是与选用的cpu相关的,建议打开这个cpu相关的头文件仔细阅读,对于B口数据寄存器的定义如下,如果看不懂建议要搞懂C语言的数据结构和联合的用法。
关于方向寄存器的定义与此相似。
循环的PLLLEDMCGC2= 0x36;while(!MCGSC_OSCINIT) ;MCGC1 = 0xB8;while(MCGSC_IREFST);while(MCGSC_CLKST!=2);MCGC1 = 0x88; // RDIV = 2; //0x90;3〉如果没有硬件,也可以完全采用软件仿真的方法进行程序设计,改动过程如下:a〉首先确保在工程硬件连接下拉中选择第一项“Full Chip Simulation”,如果有硬件,对于自制的开源下载器则应该选择“HCS08 Open Source BDM”b〉点击“debug”按钮后不会出现下载器配置界面,而是直接进入调试界面,在调试界面选择“Component/Open…”菜单。
在弹出的界面里,双击虚拟可视工具。
在虚拟可视工具编辑界面被打开后,就可以从主菜单栏选择“Visualization Tool/Add New Instrument/LED”在放好LED,并调节大小合适后,在LED上右击鼠标,选择第一项打开LED的属性页在属性页中修改该LED对应的内存memory的地址为0x02(从讨论1中已经知道B口的数据寄存器的地址就是0x02),同时修改“Bitnumber to display”为“0”,也就是该LED对应PTBD_PTBD0。
采用相同的方法放另一个LED,修改属性页使得对应PTBD_PTBD1。
放好两个LED后,在空白的地方右键鼠标并选择属性,打开属性页在属性页的最下面选择刷新模式为周期性“Periodical”,刷新间隔可以用缺省的10ms。
全部修改完成后选择保存成文件以备后用。
既然是采用没有硬件的完全仿真模式,一定要去掉跟硬件相关的代码,比如讨论2中添加的将时钟切换到外部晶振的代码一定要去掉。
然后就可以全速运行了。
在完全仿真模式下,LED闪烁的速度跟实际硬件相比还是不一样的,只能是功能仿真。
第三章按键程序设计过程1、按键与cpu的连接,从图1-3可以看出,按键4、按键5分别与PTB4和PTB5相连。
该款单片机MC9S08JM60一共有8个键盘输入口,从数据手册可以看出非常分散。
总体来说,该款单片机的八个键盘中断输入特点如下:1〉可以单独允许某一个中断输入脚,其他不用的做一般I/O;2〉每个中断输入脚都可以单独编程设置为下降沿触发、上升沿触发、下降沿和低电平触发、上升沿和高电平触发;3〉所有中断输入口公用一个中断向量,可允许或者禁止中断;4〉键盘中断可以将芯片从低功耗中唤醒到正常工作模式。
2、跟键盘中断相关的三个寄存器,分别为状态与控制、管脚允许、中断触发沿模式选择。
1〉K BI Status and Control Register (KBISC)2〉KBI Pin Enable Register (KBIPE)3〉KBI Edge Select Register (KBIES)3、键盘中断使用的初始化过程;KBI首次使用时,为了不产生错误中断,建议初始化过程如下6步:1〉清除KBISC中的KBIE位,以屏蔽KBI中断;2〉设置KBIES寄存器中的KBEDGn位,选择使用管脚的中断触发极性;3〉如果需要内部上拉/下拉电阻,配置PTxPE(PTGPE、PTDPE、PTBPE)位;4〉设置KBIPE寄存器中的KBIPEn ,允许对应管脚的KBI功能;5〉给KBISC寄存器中的KBACK位写1,以清除所有KBI中断标志;6〉设置KBISC寄存器中的KBIE位,以允许KBI中断。
4、建立实验工程按照第二章的步骤,建立工程“按键控制LED”,该工程的最终目的是利用两个按键控制两个LED的亮灭,当按压key4时,D1的亮灭状态发生改变;按压key5时,D2的亮灭状态发生改变。
修改主文件直到如下模样:5、讨论1〉该键盘中断程序与上一章程序最大的区别就是使用了中断的方法进行程序设计,主文件中有两个函数:void main(void){ }interrupt VectorNumber_Vkeyboard voidkbi_isr( ){ }第二个函数中,interrupt为C语言保留字,表明后面的kbi_isr()是中断函数,中间的VectorNumber_Vkeyboard是该单片机键盘中断的中断号,来自于头文件MC9S08JM60.h,在该文件开头位置有语句#define VectorNumber_Vkeyboard 25关于中断的更多内容,参加后续章节。
2〉由于该单片机的8个键盘中断共用一个中断号,因此为了区别到底是哪个按键被按下,还需要在中断程序里读取管脚对应的数据寄存器的数值,根据数据寄存器的数值决定哪个键被按下。
比如,为了区别key4和key5,这两个管脚分别为PTB4和PTB5,因此需要读取B口的数据寄存器PTBD,根据PTBD_PTBD4和PTBD_PTBD5的值可以知道key4或者key5是否被按下。
3〉在读取相应的数据寄存器前,可以有小的延时,以便去除按键的机械抖动。
4〉在键盘中断程序的最后语句KBISC = 0x06; 是为了对KBACK写“1”以便清除中断标志。
第四章SCI串口通讯程序设计过程1、搞清楚SCI串口通讯的硬件连接,从图1-3和1-6中可以看出,实验板使用了第一个串口,对应管脚PTE0(发送)、PTE1(接收),经过RS232电平转换芯片ICL3232E之后,连接到9针接口COM0上。
2、SCI串口的初始化Sci串口初始化主要是设置波特率,jm60单片机的波特率设置寄存器有SCI1BDH和SCI1BDL波特率设置遵循公式:SCI 波特率 = BUSCLK/(16×BR),公式里的BR就是需要初始化设置给SCI1BDH、SCI1BDL的13位数值。
由于头文件的帮忙,对SCI1BDH、SCI1BDL的设置可以用一条语句整体赋值就是SCI1BD = BUSCLK/16/SCI波特率;比如要设置成9600的波特率,而且知道总线时钟为8MHz,则波特率设置语句为:SCI1BD = 8000000/16/9600;3、SCI寄存器设置SCIxC1SCIxC2SCIxS1SCIxS2SCIxC34、实用的串口通讯程序设计子程序由于JM60单片机有两路SCI串口,实验电路板上用到了第一路,因此下面针对第一路进行设计,读者只要稍微改动就可以用到第二路。
1〉发送一个字符2〉数字转换成对应的ASCII码3〉发送可以在文本文件中显示成十六进制的数据4〉发送字符串5〉接收一个字符5、与xp超级终端构建人机界面实验设计假设编写程序,在硬件连接正常的情况下,开机运行时超级终端显示菜单用户在超级终端激活状态下,敲击键盘数字1将使得D1的亮灭状态转换一次,敲击键盘数字2将使得D2的亮灭状态转换一次,敲击键盘数字3将使得D1和D2的亮灭状态同时转换一次。