N76E003之定时器3
定时器3是一个16位自动重装载,向上计数定时器。用户可以通过配置T3PS[2:0] (T3CON[2:0])选择预分频,并写入重载值到R3H 和R3L寄存器来决定它的溢出速率。用户可以设置TR3 (T3CON.3)来开始计数。当计数跨过FFFFH,TF3 (T3CON.4)置为1,且R3H 和R3L寄存器的内容重载到内部16位计数器。如果ET3 (EIE1.1)置为1,定时器3中断服务程序被执行。当进入中断服务程序,TF3会被硬件自动清零。
定时器3同时也用作串口波特率产生定时器,详细内容请参考章节13.5“波特率”
用户可以设置TR3 (T3CON.3)来开始计数。当计数跨过
FFFFH,TF3 (T3CON.4)置为1,且R3H 和R3L寄存器的内容重载到内部16位计数器。
如果ET3 (EIE1.1)置为1,定时器3中断服务程序被执行。当进入中断服务程序,TF3会被硬件自动清零。
定时器3同时也用作串口波特率产生定时器,详细内容请参考章节13.5“波特率”
波特率
串口的不同模式的波特率时钟源和速度是完全不同的。详见表 13–3. 用于设定不同的波特率。
在模式1或模式3,串口0的波特率时钟源可通过BRCK (T3CON.5)选择定时器1或定时器3。对于串口1,只有采用定时器3作为唯一的时钟源。
当采用定时器1作为波特率发生器,需要关闭定时器1中断。定时器1可配置为计数器或是定时器,三种工作模式都可以。典型应用中,会配置为定时器工作在自动重装载模式(定时器模式2)。如果采用定时器3作为波特率发生器,同样也需要关闭定时器3中断。
对应算式如下:
- #ifdef FOSC_160000
- RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
- RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
- #endif
- #ifdef FOSC_166000
- RH3 = HIBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */
- RL3 = LOBYTE(65536 - (1037500/u32Baudrate)); /*16.6 MHz */
- #endif
- #include "N76E003.h"
- #include "SFR_Macro.h"
- #include "Function_define.h"
- #include "Common.h"
- #include "Delay.h"
- #define RELOAD_VALUE_H (65536-1500)/256
- #define RELOAD_VALUE_L (65536-1500)%256
- /************************************************************************************************************
- * TIMER 2 interrupt subroutine
- ************************************************************************************************************/
- void Timer3_ISR (void) interrupt
- {
- clr_TF3;
- P12 = ~P12; //P0.2 toggle when TF3 interrupt
- printf("\n TM3 INT 0x%bX", RH3);
- }
- /************************************************************************************************************
- * Main function
- ************************************************************************************************************/
- void main (void)
- {
- Set_All_GPIO_Quasi_Mode;
- InitialUART0_Timer1();
- RH3 = RELOAD_VALUE_H; //initial counter values
- RL3 = RELOAD_VALUE_L;
- set_ET3; //enable Timer3 interrupt
- set_EA; //enable interrupts
- set_TR3; //Timer3 run
- while();
- }
上面这个程序利用定时器一产生波特率,利用定时器3来进入中断。
下面这个例程是产生串口波特率的(串口一)
- void InitialUART1_Timer3(UINT32 u32Baudrate) //use timer3 as Baudrate generator
- {
- P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
- P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
- SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
- T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
- clr_BRCK; //timer 1
- #ifdef FOSC_160000
- RH3 = HIBYTE( - (/u32Baudrate)-); /*16 MHz */
- RL3 = LOBYTE( - (/u32Baudrate)-); /*16 MHz */
- #endif
- #ifdef FOSC_166000
- RH3 = HIBYTE( - (/u32Baudrate)); /*16.6 MHz */
- RL3 = LOBYTE( - (/u32Baudrate)); /*16.6 MHz */
- #endif
- set_TR3; //Trigger Timer3
- }
- #define HIBYTE(v1) ((UINT8)((v1)>>8)) //v1 is UINT16
- #define LOBYTE(v1) ((UINT8)((v1)&0xFF))
- SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
- T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
- #ifdef FOSC_160000
- RH3 = HIBYTE( - (/u32Baudrate)-); /*16 MHz */
- RL3 = LOBYTE( - (/u32Baudrate)-); /*16 MHz */
- #endif
- #ifdef FOSC_166000
- RH3 = HIBYTE( - (/u32Baudrate)); /*16.6 MHz */
- RL3 = LOBYTE( - (/u32Baudrate)); /*16.6 MHz */
- #endif
- set_TR3; //Trigger Timer3
N76E003之定时器3的更多相关文章
- N76E003的定时器/计数器 0和1
定时器/计数器 0和1N76E003系列定时器/计数器 0和1是2个16位定时器/计数器.每个都是由两个8位的寄存器组成的16位计数寄存器. 对于定时器/计数器0,高8位寄存器是TH0. 低8位寄存器 ...
- N76E003之WDT(看门狗定时器)
N76E003提供一个看门狗定时器(WDT),它可以配置成一个超时复位定时器用于复位整个设备.一旦由于外界干扰设备进入非正常状态或挂起,看门狗可以复位恢复系统.这有用于监测系统运行以提高系统可靠性.对 ...
- N76E003之IIC
I2C 总线提供了一种串行通信方式,用在 MCU 与 EEPROM,LCD模块,温度传感器等等之间控制.I2C 用两条线 (数据线SDA 和时钟线 SCL) 在设备间传输数据.I2C 总线用作主机与从 ...
- N76E003之串口
N76E003包含两个具备增强的自动地址识别和帧错误检测功能的全双工串口.由于两个串口的控制位是一样的,为了区分两个串口控制位,串口1的控制位以“_1”结尾(例如SCON_1).下述详例以串口0为例. ...
- N76E003的学习之路(一)
N76E003是8051内核的一款单片机MCU,它提供丰富的特殊功能模块,包括: 1KRAM其中包括256字节SRAM,768字节XRAM. 最多可达18个标准管脚. 两组标准16位定时器/计数器:定 ...
- N76E003学习之路(二)
最近一直在想N76E003和STM8M003的对比情况,在网上找了不少资料,看了不少文档,具体总结如下: STM8S003F3P6:一共20个脚,最多支持16个GPIO,支持16个外部中断:2个16位 ...
- 单片机成长之路(51基础篇)- 024 基于 N76E003 的按键按键状态机
前端时间要用按键,搞了个状态机(如图): main.c #include <N76E003.H> #include <SFR_Macro.h> //N76E003 SFR寄存器 ...
- 单片机成长之路(51基础篇) - 023 N76e003 系统时钟切换到外部时钟
N76e003切换到外部时钟的资料很少(因为N76e003的片子是不支持无源晶振的,有源晶振的成本又很高,所以网上很少有对N76e003的介绍).有图有真相: 代码如下: main.c #includ ...
- 几款一元单片机对比:CMS8S5880、STM8S003、N76E003
大概17年开始,STM8S003的价格被贸易商炒货,变得很不稳定,一度上涨到2~3元,因为市场需求大增,小家电.无线充和一些简单功能的产品,本人就有在空气净化器.433M触摸开关.数据收发模块.红外控 ...
随机推荐
- 自然语言交流系统 phxnet团队 创新实训 项目博客 (十四)
项目技术借鉴报告: 一.服务器端(Server) 1.分词 分词使用的是庖丁分词.使用盘古分词词库和词素作为辅助.其中包括下载Jar包并且使用. 2.人工神经网络 以网上已有的初级网络为蓝图,结合机器 ...
- 【转】]监听SMS消息/编程实现短信拦截
当设备接收到一条新的SMS消息时,就会广播一个包含了android.provider.Telephony.SMS_RECEIVED动作的Intent.注意,这个动作是一个字符串值,SDK 1.0不再包 ...
- 关于Unity中粒子效果的使用
粒子效果1: 游戏中会有很炫酷的特效,比如爆炸,水花,火焰等;2: unity提供粒子编辑器,方便特效人员来开发很炫酷的特效;3.粒子效果一般有专门的粒子特效师来做,我们只需要拿来用就好了,很多参数没 ...
- MongoDB MapReduce 小例子
var map = function(){ if (this.gscode == "ZTJB"){ ymd = this.ymd; emit("maxymd", ...
- LintCode #3 统计数字
解题思路请参考 代码(可以通过,不过很乱,需要整理): /// <summary> /// 计算n在数组[targetNum]中出现的次数 /// 形如:[0, 1, 2, 3, 4, 5 ...
- SecureCRT同时发送命令到所有主机
有时候我们需要在多台服务器上执行相同的命令,比如安装软件,复制,粘贴,删除等等,但一台一台的去操作工作量就太大了,我们可以借助SecureCRT这款客户端远程连接工具实现这样的要求! 相关阅读: 如何 ...
- VS 调试 无法启动IIS Express Web 服务器(进程不存在)
拷贝VS2015项目 出现无法启动IIS Express Web 服务器 一.把你们拷贝刀本机的解决方案文件中的隐藏文件夹.vs删除掉 重新生产解决方案就可以启动iis express了.
- #define中的特殊符号
(关于#define的用法,看这里 http://www.cppblog.com/kenny/archive/2011/04/26/145087.html) #define Conn(x,y) x## ...
- SOA及分布式
结合领域驱动设计的SOA分布式软件架构 Windows平台分布式架构实践 - 负载均衡(下) 分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载 我终于深入参与了一 ...
- php 区分0和空
能够区分出来的有2,4,6 方法 public function test(){ $test=; if($test==''){ echo '<br />在php中1,0即为空'; //被输 ...