富士通半导体 ( 上海 ) 有限公司应用笔记 MCU-AN-500077-Z-12 F²MC-8FX 家族 8 位微型控制器 MB95430 系列 16 位 FRT 和 OCU 应用笔记
修改记录 修改记录 版本日期作者修改记录 1.0 2010-03-12 Kevin. Lin 初稿 1.1 2010-04-12 Kevin. Lin 更新 1.2 2010-09-27 Kevin. Lin 更新源代码 本手册包含 35 页 1. 本文档记载的产品信息及规格说明如有变动, 恕不预先通知 如需最新产品信息和 / 或规格说明, 联系富士通销售代表或富士通授权经销商 2. 基于本文档记载信息或示意图的使用引起的对著作权 工业产权或第三方的其他权利的侵害, 富士通不承担任何责任 3. 未经富士通明文批准, 不得对本文档的记载内容进行转让 拷贝 4. 本文档所介绍的产品并不旨在以下用途 : 需要极高可靠性的设备, 诸如航空航天装置 海底中继器 核控制系统或维系生命的医用设施 5. 本文档介绍的部分产品可能是 外汇及外贸管理法 规定的战略物资 ( 或专门技术 ), 出口该产品或其中部分元件前, 应根据该法获得正式批准 版权 2009 富士通半导体 ( 上海 ) 有限公司 MCU-AN-500077-Z-12- 第 2 页
目录 目录 修改记录... 2 目录... 3 1 概要... 5 2 16 位 OCU 和 FRT 的特性... 6 2.1 OCU 和 FRT 的结构图... 6 2.2 OCU 和 FRT 记数器... 8 2.2.1 与输出比较单元相关的寄存器... 8 2.2.2 与定时器相关的寄存器... 8 2.3 OCU 的引脚设置... 9 2.4 与电压比较器的关系... 9 2.5 中断... 9 2.5.1 定时器中断... 9 2.5.2 OCU 中断... 10 3 软件操作... 11 3.1 设置程序... 11 3.1.1 16 位定时器... 11 3.1.2 输出比较单元... 11 3.2 操作模式... 12 3.2.1 有相位差的输出脉冲序列... 12 3.2.2 有死区时间的脉冲序列... 14 3.2.3 输出 PWM... 16 4 部分位的影响... 18 4.1.1 EOCS_BTSn... 18 4.1.2 OCMCR_CMPMDn... 19 MCU-AN-500077-Z-12 - 第 3 页
目录 4.1.3 OCMCR_FDENn (n= 0, 1)... 20 5 更多信息... 22 6 附录... 23 6.1 图表索引... 23 6.2 范例代码... 24 MCU-AN-500077-Z-12- 第 4 页
第 1 章概要 1 概要 本文档介绍了 16 位定时器和输出比较单元的功能及配置方法, 同时给出了相关代码 MCU-AN-500077-Z-12 - 第 5 页
第 2 章 16 位 OCU 和 FRT 的特性 2 16 位 OCU 和 FRT 的特性 本章介绍了 OCU 和 FRT 的特性 2.1 OCU 和 FRT 的结构图 16 位输出比较单元用于生成脉冲序列 它包括一个 16 位定时器, 两个比较寄存器, 两个比较缓冲寄存器, 两个比较输出引脚, 以及多个控制寄存器 如果烧入比较寄存器的值与 16 位定时器的计数值匹配, 引脚的输出水平将被触发, 产生中断 图 2-1 显示了 16 位 OCU 的结构图 图 2-1:OCU 结构图 MCU-AN-500077-Z-12- 第 6 页
第 2 章 16 位 OCU 和 FRT 的特性该 16 位定时器包括一个 16 位上 / 下计数器, 一个比较清除缓冲寄存器, 以及一个控制状态记数器 定时器的计数值用作输出比较单元的时基 图 2-2 显示了 16 位定时器的结构图 图 2-2:FRT 结构图 MCU-AN-500077-Z-12 - 第 7 页
第 2 章 16 位 OCU 和 FRT 的特性 2.2 OCU 和 FRT 记数器 2.2.1 与输出比较单元相关的寄存器 OCU 模块有两个通道 :OUT0 和 OUT1 每个通道有一个 16 位输出比较寄存器和一个 16 位缓冲寄存器 输出寄存器和缓冲寄存器位于同一地址 输出寄存器为只读 ; 缓冲记数器只写 用户可以使用 2.2.2 节中介绍的方法访问这两种寄存器 表 2-1 列出了与输出比较单元相关的寄存器 表 2-1:OCU 寄存器 寄存器名 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 缺省值 OCCP0/B0 H OCCP0/B0 L OCCP1/B1 H OCCP1/B1 L 输出比较寄存器 0 / 缓冲寄存器 0 H b 00000000 输出比较寄存器 0 / 缓冲寄存器 0 L b 00000000 输出比较寄存器 1 / 缓冲寄存器 1 H b 00000000 输出比较寄存器 1 / 缓冲寄存器 1 L b 00000000 OCSL ICP1 ICP0 ICE1 ICE0 -- -- CST1 CST0 b 00000000 OCSH -- CMOD 0 OTE11 OTE10 OTE01 OTE00 OTD1 OTD0 b 01000000 EOCS HW_S TOP -- BTS1 BUF1 -- -- BTS0 BUF0 b 00000000 OCMCR -- FDEN1 INV1 CMPMD 1 -- FDEN0 INV0 CMPMD 0 b 00000000 OCUOC -- -- -- -- -- OCSTPSEL b 00000000 2.2.2 与定时器相关的寄存器 表 2-2 列出了与定时器相关的寄存器 表 2-2:FRT 寄存器 寄存器名 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit1 Bit 0 缺省值 CPCLRH 定时器比较清除寄存器寄存器 H b 11111111 CPCLRL 定时器比较清除寄存器 L b 11111111 CPCLRBH 定时器比较清除缓冲寄存器 H b 11111111 MCU-AN-500077-Z-12- 第 8 页
第 2 章 16 位 OCU 和 FRT 的特性 CPCLRBL 定时器比较清除缓冲寄存器 L b 11111111 TCCSL IVF IVFE 中止 模式 CLR CLK2 CLK1 CLK0 b 00000000 TCCSH -- FSEL -- -- -- -- -- -- b 01000000 ETCCSL -- -- CNTDIR -- BFE IRQZF IRQZE CNTMD b 00000000 ETCCSH -- CIMS2 CIMS1 CIMS0 -- ZIMS2 ZIMS1 ZIMS0 b 00000000 比较清除缓冲寄存器 (CPCLRBH/L) 和比较清除记数器 (CPCLRH/L) 位于同一地址 比较清除缓冲寄存器为只写寄存器 ; 比较清除寄存器为只读寄存器 两者都是 16 位寄存器, 可使用以下方法进行读写 使用 16 位访问指令读写 ( 例如 MOVW ) 首先使用字节访问指令读写高位, 然后读写低位 ( 例如 MOV ) 2.3 OCU 的引脚设置 OCU 模块有两对输出 PG0 或 P70 可配置为 OUT0,PG1 或 P73 可配置为 OUT1, 如下所示 SYSC2_OUTSEL0 = 0 : OUT0 -- P70. SYSC2_OUTSEL0 = 1 : OUT0 -- PG0. SYSC2_OUTSEL1 = 0 : OUT1 -- P73. SYSC2_OUTSEL1 = 1 : OUT1 -- PG1. 为输出比较信号, 用户应通过 OCSH_ OTEn 启用通道 ; 否则引脚状态将由 GPIO 或其他外围 设备控制 建议在禁用 OCU 通道前, 初始化引脚至安全状态 2.4 与电压比较器的关系 如果 OTE00,OTE 01(OTE10,OTE11) 设置为 11,OCU 模块可由电压比较器输出停止 用户可通过配置寄存器 OCUOC, 选择停止 OCU 输出的比较器和边沿方向 2.5 中断 2.5.1 定时器中断 对于 FRT, 如果首先启用中断, 根据设置的不同, 中断请求将在零检测或比较清除点发生 用户可通过设置 ETCCSH 寄存器多次匹配中断标志 MCU-AN-500077-Z-12 - 第 9 页
第 2 章 16 位 OCU 和 FRT 的特性 2.5.2 OCU 中断 OCU 的每个通道都有一个中断 输出比较发生时, 设置中断标志 如果启用中断, 中断的优先级应在 vector.c 文件中设置 下表列出了中断向量 表 2-3: 中断向量 中断源中断请求编号中断优先级设置寄存器向量表地址 记数器设置位高位低位 输出比较 ch0 与匹配输出比较 ch1 与匹配 IRQ07 ILR07 L07 [1:0] FFECH FFEDH IRQ08 ILR08 L08 [1:0] FFEAH FFEBH 16 位定时器 IRQ14 ILR14 L14 [1:0] FFDEH FFDFH MCU-AN-500077-Z-12- 第 10 页
第 3 章软件操作 3 软件操作 本章介绍了输出比较单元的软件操作 OCU 有一个用于提供时基的 16 位定时器, 设置该定时器是先决条件 本文档给出了 FRT 的 范例代码 参见 16 位定时器 了解关于该定时器的更多信息 3.1 设置程序 3.1.1 16 位定时器通过 TCCSL_CLK0~CLK2 设置定时器计数时钟通过 ETCCSL_CNTMD 选择 FRT 计数模式烧写比较清除值至 CPCLRH/L 通过 TCCSL_CLR 清除定时器计数器如有必要, 启用缓冲器如有必要, 启用溢出或过零中断如有必要, 设置溢出或过零中断标志配置 OCU 后, 启用定时器 3.1.2 输出比较单元选择输出引脚烧写输出比较值至 OCCP0 和 OCCP1 通过 OCMCR_CMPMDn 设置比较匹配输出如有必要, 启用输出比较缓冲器如果缓冲器由 EOCS_BTSn 启用, 选择数据传送点通过 OCSH_CMOD0 为通道 1 定义比较输出模式使用 OCSH_OTDn 选择输出比较引脚的初始水平如有必要, 选择硬件停止触发器来源如有必要, 启用中断通过 OCSH_OTE 启用输出比较引脚通过 OCSL_CSTn 启用输出比较操作 MCU-AN-500077-Z-12 - 第 11 页
第 3 章软件操作 3.2 操作模式 3.2.1 有相位差的输出脉冲序列 图 3-1 显示了有相位差的脉冲序列 图 3-1: 有相位的差脉冲序列 如图 3-1 所示,OUT0 和 OUT1 的周期和占空比相同, 但上升沿和下降沿发生的点不同 上升沿间的不同就是相位差 为输出期望的序列,16 位定时器在向上计数模式下运行 如果时钟输入相同, 比较清除记数器的值将决定脉冲序列的周期 用户可通过烧写不同的值至寄存器 CPCLRH/L, 修改比较清除记数器的值 OCCP0 和 OCCP1 的不同造成脉冲序列的相位差 下式用于计算周期 ( 向上计数模式 ) Period =2* (1/MCLK)*(1/Pre-scale)*CPCLRH/L. (3-1) 预分频为 16 位定时器的预分频 因此, CPCLRH/L = Period*MCLK*Pre-scale/2. (3-2) 如果 : FCH = 4M, MCLK =4M, 频率 = 20k, 预分频 =1/4 则有 : CPCLH/L = 25 MCU-AN-500077-Z-12- 第 12 页
第 3 章软件操作 初始化图 3-2 中的代码说明了配置 FRT 和 OCU 模块的步骤 P70 和 P73 用作输出引脚, 定时器处于向上计数模式, 预分频为 1 :4, 缓冲器被启用 16 位定时器和 OCU 功能在初始化代码中被禁用 注意 : 务必在启用比较操作之前, 写一个值至比较寄存器 图 3-2: 初始化代码 MCU-AN-500077-Z-12 - 第 13 页
第 3 章软件操作 3.2.2 有死区时间的脉冲序列有死区时间的脉冲序列通常用于驱动 H 桥 OCU 不能输出两个通道的 PWM 信号, 但可以改变两个脉冲序列的频率 因此,PFM 方法对于驱动 H 桥非常有用 图 3-3 显示了波形 CPCLRH/L 可通过式 (3-2) 算出, 脉冲序列的占空比为 50% 图 3-3: 有失效时间的脉冲序列死区时间的计算如下 : Dead Time = (OCCP0-OCCP1) *(1/MCLK)*(1/Pre-scale) 改变 OCCP0-OCCP1 的值将改变死区时间 MCU-AN-500077-Z-12- 第 14 页
第 3 章软件操作 初始化 16 位定时器处于上 / 下模式 CPCLRH/L 的缺省值为 0XFFFF OCCP0 和 OCCP1 分别烧写 为 0XAAAA 和 0X5555, 该值的不同导致死区时间的产生 图 3-4 显示了初始化代码 图 3-4: 有死区时间的脉冲序列的初始化 MCU-AN-500077-Z-12 - 第 15 页
第 3 章软件操作 3.2.3 输出 PWM OCSH_CMOD0 位设置为 1 时,OCU 模块可通过 OUT1 产生一个通道的 PWM 图 3-5 显示 了 PWM 信号波形 图 3-5:PWM 信号波形周期的计算公式如下 : Period = (1/MCLK)*(1/Pre-scale)*CPCLRH/L (3-3) 预分频是 16 位定时器的预分频因此, CPCLRH/L = Period*MCLK*Pre-scale (3-4) 如果 16 位定时器处于上 / 下模式, 应使用式 (3-1) 计算周期 改变 OCCP0 的值将改变占空比 保持 OCCP1 不变, 修改 OCCP0 为 0XFFFF,OUT1 的占空比将变大 MCU-AN-500077-Z-12- 第 16 页
第 3 章软件操作 初始化在该模式下, 输出通道 1 配置为与比较记数器 0,1 匹配时反向 改变 OCCP0 的值将改变 PWM 波形的占空比 图 3-6 显示了 PWM 的初始化代码 图 3-6:PWM 的初始化代码 MCU-AN-500077-Z-12 - 第 17 页
第 4 章部分位的影响 4 部分位的影响 4.1.1 EOCS_BTSn EOCS_BTSn 决定了启用缓冲器功能时, 输出比较缓冲器寄存器的值转移至输出比较寄存器的时间点 EOCS_BTSn = 0, 转移发生在 FRT 的过零点 图 4-1: 过零点的转移 EOCS_BTSn = 1, 转移发生在 FRT 的溢出点 图 4-2: 在溢出点转移 MCU-AN-500077-Z-12- 第 18 页
第 4 章部分位的影响 4.1.2 OCMCR_CMPMDn 启用引脚输出时, 该位用于在匹配发生后立即改变引脚的输出水平 OCMCR_CMPMDn = 0 在该模式下, 引脚水平与之前的值相反 因此, 需注意引脚的初始水平 图 4-3 显示了信号波形 图 4-3:CMPMDn=0 的信号波形 OCMCR_CMPMDn = 1 16 位定时器处于向上计数模式时, 输出引脚水平设置为 1;16 位定时器处于向下计数模式时, 输出引脚水平被清除 该模式不考虑输出引脚的初始值 MCU-AN-500077-Z-12 - 第 19 页
第 4 章部分位的影响 图 4-4:CMPMDn= 1 的信号波形 4.1.3 OCMCR_FDENn (n= 0, 1) 该位用于 ch0 或 ch1 的满占空比功能 FDENn = 0 时, 满占空比功能特性被禁用 FDENn =1 时, 满占空比功能特性被启用 ( 必须设置 OCSH_CMOD0 = 0) 如果 FDENn = 0, 16 位定时器的值与比较寄存器 (OCCPn) 匹配时, 触发输出水平 如果 FDENn =1, 且 COMD0=0, OCCPn= 0 时,OCU 的输出与 16 位定时器的值无关 OUTn = OCMCR_INVn 0<OCCP0<CPCLR 时, OCU 的输出取决于 CMPMDn 位 OCCP0>= CPCLR 时, OCU 的输出取决于比较清除事件的 OCU 比较标志 如果 CMP_FLAG =0,OUTn =-OCMCR_INVn 如果 CMP_FLAG =1, OUTn 不变 MCU-AN-500077-Z-12- 第 20 页
第 4 章部分位的影响 CMP_FLAG 由比较匹配事件设置, 由比较清除事件重置 图 4-5 显示了 FDEN =1,CMPMD0= 0,INV0 = 0 时的信号波形 图 4-5: 满占空比的信号波形 MCU-AN-500077-Z-12 - 第 21 页
第 5 章更多信息 5 更多信息 关于富士通半导体更多的产品信息, 请访问以下网站 : 英文版本地址 : http://www.fujitsu.com/cn/fsp/services/mcu/mb95/application_notes.html 中文版本地址 : http://www.fujitsu.com/cn/fss/services/mcu/mb95/application_notes.html MCU-AN-500077-Z-12- 第 22 页
第 6 章附录 6 附录 6.1 图表索引表 2-1:OCU 寄存器... 8 表 2-2:FRT 寄存器... 8 表 2-3: 中断向量... 10 图 2-1:OCU 结构图... 6 图 2-2:FRT 结构图... 7 图 3-1: 有相位的差脉冲序列... 12 图 3-2: 初始化代码... 13 图 3-3: 有失效时间的脉冲序列... 14 图 3-4: 有死区时间的脉冲序列的初始化... 15 图 3-5:PWM 信号波形... 16 图 3-6:PWM 的初始化代码... 17 图 4-1: 过零点的转移... 18 图 4-2: 在溢出点转移... 18 图 4-3:CMPMDn=0 的信号波形... 19 图 4-4:CMPMDn= 1 的信号波形... 20 图 4-5: 满占空比的信号波形... 21 MCU-AN-500077-Z-12 - 第 23 页
第 6 章附录 6.2 范例代码 Project1: Pulse sequences with phase difference #include "mb95430.h" /*------------------------------------------------------------------------- ------ Name : InitFRTandOCU () Function Input Output : Initialize the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void InitFRTandOCU (void) SYSC2_OUTSEL0 = 0; SYSC2_OUTSEL1 = 0; DDR7_P70 = 1; DDR7_P73 = 1; PDR7_P70 = 0; PDR7_P73 = 0; // select OUT0 output pin // select OUT1 output pin // OUT0 output // OUT1 output // OUT0 output 0 first // OUT1 output 0 first TCCSH = 0x40; TCCSL = 0x2A; // count clock have no division // clear timer // disable timer first // count clock=1/4*mclk ETCCSH = 0x0; ETCCSL = 0x08; // no interrupt mask // up count mode // interrupt disabled CPCLRH = 0xFF; CPCLRL = 0xFF; // write upper register first // then down register MCU-AN-500077-Z-12- 第 24 页
第 6 章附录 OCSL = 0x00; operation first // disable compare OCSH = 0x00; // initialize ch0&ch1 to 0 // disable output // ch1 reverses upon comp reg1 EOCS = 0x11; // buffer enabled // transfer data at zero point OCCP0H = 0xBF; OCCP0L = 0xFF; // write upper register first // then down register OCCP1H = 0x7F; OCCP1L = 0xFF; /*------------------------------------------------------------------------- ------ Name : EnableFRTandOCU () Function Input Output : Enable the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void EnableFRTandOCU (void) TCCSL_CLR = 1; // clear FRT counter /* take care here, strongly recommend to write 0 to TCDTH/L!!!! */ TCDTH = 0; TCDTL = 0; MCU-AN-500077-Z-12 - 第 25 页
第 6 章附录 OCSH = 0x28; enabled // output channels are // if HW_STOP=0 OCSL_CST0 = 1; operation OCSL_CST1 = 1; operation // enable output compare0 // enable output compare1 TCCSL_STOP = 1; // start free-run timer counting /*------------------------------------------------------------------------- ------ Name : DisableFRTandOCU () Function Input Output : Disable the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void DisableFRTandOCU(void) OCSH = 0; // output channels are disabled // the pin are controlled by GPIO TCCSL_STOP = 0; // stop free-run timer counting OCSL_CST0 = 0; // disable operation OCSL_CST1 = 0; /* delay */ void Delayms (unsigned char cnt_dly) unsigned char i; for(; cnt_dly > 0 ; cnt_dly-- ) MCU-AN-500077-Z-12- 第 26 页
第 6 章附录 for(i = 250 ; i > 0 ; i-- ) main() DI(); SYCC = 0x01; InitFRTandOCU (); // disable interrupt // MCLK = (1/4)*8M // enable interrupt EI(); while(1) EnableFRTandOCU (); Delayms(100); DisableFRTandOCU (); Delayms(100); MCU-AN-500077-Z-12 - 第 27 页
第 6 章附录 Project 2: Output Pulse Sequences with Dead Time #include "mb95430.h" /*------------------------------------------------------------------------- ------ Name : InitFRTandOCU () Function Input Output : Initialize the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void InitFRTandOCU (void) SYSC2_OUTSEL0 = 0; SYSC2_OUTSEL1 = 0; DDR7_P70 = 1; DDR7_P73 = 1; PDR7_P70 = 0; PDR7_P73 = 0; // select OUT0 output pin // select OUT1 output pin // OUT0 output // OUT1 output // OUT0 output 0 first // OUT1 output 0 first TCCSH = 0x40; TCCSL = 0x2A; // count clock have no division // clear timer // disable timer first // count clock=1/4*mclk ETCCSH = 0x0; ETCCSL = 0x08; // no interrupt mask // up count mode // interrupt disabled CPCLRH = 0xFF; CPCLRL = 0xFF; // write upper register first // then down register MCU-AN-500077-Z-12- 第 28 页
第 6 章附录 OCSL = 0x00; operation first // disable compare OCSH = 0x40; // initialize ch0&ch1 to 0 // disable output // ch1 reverses upon comp reg0,1 EOCS = 0x11; // buffer enabled // transfer data at zero point OCCP0H = 0xBF; OCCP0L = 0xFF; // write upper register first // then down register OCCP1H = 0x7F; OCCP1L = 0xFF; /*------------------------------------------------------------------------- ------ Name : EnableFRTandOCU () Function Input Output : Enable the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void EnableFRTandOCU(void) TCCSL_CLR = 1; // clear FRT counter /* take care here, strongly recommend to write 0 to TCDTH/L!!!! */ TCDTH = 0; TCDTL = 0; OCSH = 0x68; enabled // output channels are MCU-AN-500077-Z-12 - 第 29 页
第 6 章附录 // if HW_STOP=0 OCSL_CST0 = 1; operation OCSL_CST1 = 1; operation // enable output compare0 // enable output compare1 TCCSL_STOP = 1; // start free-run timer counting /*------------------------------------------------------------------------- ------ Name : DisableFRTandOCU () Function Input Output : Disable the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void DisableFRTandOCU (void) TCCSL_STOP = 0; // stop free-run timer counting OCSH = 0x80; disabled // output channels are // the pin are controlled by GPIO OCSL_CST0 = 0; // disable operation OCSL_CST1 = 0; /*delay*/ void Delayms (unsigned char cnt_dly) unsigned char i; for(; cnt_dly > 0 ; cnt_dly-- ) for(i = 250 ; i > 0 ; i-- ) MCU-AN-500077-Z-12- 第 30 页
第 6 章附录 main() DI(); SYCC = 0x01; InitFRTandOCU (); // disable interrupt // MCLK = (1/4)*8M // enable interrupt EI(); while(1) EnableFRTandOCU (); Delayms(100); DisableFRTandOCU (); Delayms(100); MCU-AN-500077-Z-12 - 第 31 页
第 6 章附录 Project 3: Output PWM #include "mb95430.h" /*------------------------------------------------------------------------- ------ Name : InitFRTandOCU () Function Input Output : Initialize the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void InitFRTandOCU(void) SYSC2_OUTSEL0 = 0; SYSC2_OUTSEL1 = 0; DDR7_P70 = 1; DDR7_P73 = 1; PDR7_P70 = 0; PDR7_P73 = 0; // select OUT0 output pin // select OUT1 output pin // OUT0 output // OUT1 output // OUT0 output 0 first // OUT1 output 0 first TCCSH = 0x40; TCCSL = 0x2A; // count clock have no division // clear timer // disable timer first // count clock=1/4*mclk ETCCSH = 0x0; ETCCSL = 0x08; // no interrupt mask // up count mode // interrupt disabled CPCLRH = 0xFF; CPCLRL = 0xFF; // write upper register first // then down register MCU-AN-500077-Z-12- 第 32 页
第 6 章附录 OCSL = 0x00; operation first // disable compare OCSH = 0x40; // initialize ch0&ch1 to 0 // disable output // ch1 reverses upon comp reg0,1 EOCS = 0x11; // buffer enabled // transfer data at zero point OCCP0H = 0xBF; OCCP0L = 0xFF; // write upper register first // then down register OCCP1H = 0x7F; OCCP1L = 0xFF; /*------------------------------------------------------------------------- ------ Name : EnableFRTandOCU () Function Input Output : Enable the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void EnableFRTandOCU(void) TCCSL_CLR = 1; // clear FRT counter /* take care here, strongly recommend to write 0 to TCDTH/L!!!! */ TCDTH = 0; TCDTL = 0; OCSH = 0x68; enabled // output channels are MCU-AN-500077-Z-12 - 第 33 页
第 6 章附录 // if HW_STOP=0 OCSL_CST0 = 1; operation OCSL_CST1 = 1; operation // enable output compare0 // enable output compare1 TCCSL_STOP = 1; // start free-run timer counting /*------------------------------------------------------------------------- ------ Name : DisableFRTandOCU () Function Input Output : Disable the Free-Run Timer and OCU module --------------------------------------------------------------------------- -----*/ void DisableFRTandOCU(void) TCCSL_STOP = 0; // stop free-run timer counting OCSH = 0x80; disabled // output channels are // the pin are controlled by GPIO OCSL_CST0 = 0; // disable operation OCSL_CST1 = 0; /*delay*/ void Delayms (unsigned char cnt_dly) unsigned char i; for(; cnt_dly > 0 ; cnt_dly-- ) for(i = 250 ; i > 0 ; i-- ) MCU-AN-500077-Z-12- 第 34 页
第 6 章附录 main() DI(); SYCC = 0x01; InitFRTandOCU (); // disable interrupt // MCLK = (1/4)*8M // enable interrupt EI(); while(1) EnableFRTandOCU (); Delayms(100); DisableFRTandOCU (); Delayms(100); MCU-AN-500077-Z-12 - 第 35 页