P89V51RD2的中断优先级和串口波特率问题

一、关于P89V51RD2的中断优先级
数据手册说,P89V51RD2有8个中断源,支持4级中断优先级,SPI与UART共用中断向量0x23.
中断优先级控制寄存器为IP0、IP0H、IP1、IP1H。IP0和IP0H的bit0到bit6依次对应的中断源为External Interrupt 0、Timer0、External Interrupt1、Timer1、SerialPort(UART/SPI)、Timer2、PCA Interrupt;IP1和IP1H的bit4对应Brown-out interrupt。
数据手册并没有明确指明IP0和IP0H的配合与优先级的关系,猜测应该如下:
IP0H IP0 优先级
0 0 0,最低
0 1 1,
1 0 2,
1 1 3,最高

二、关于P89V51RD2的串口波特率设置
使用串口工作方式1,串口时钟来自于Timer1溢出中断,Timer1使用MODE2,自动重装。根据书上的说明计算公式应该如下:
如果PCON.SMOD=0,则:
TH1 = 256 – ((Crystal / 384) / Baud)
如果PCON.SMOD=1,则:
TH1 = 256 – ((Crystal / 192) / Baud)

而P89v51rd2数据手册中关于串口模式2波特率的说明如下:
The baud rate is programmable to either 1/16 or 1/32 of the CPU clock frequency, as determined by the SMOD1 bit in PCON.
手册中再也没有其他关于波特率的说明。

而实际编程时发现,晶振使用18.432MHz,设置PCON.SMOD1=0,TH1=251时,串口波特率为19200;而设置PCON.SMOD1=1,TH1=251时,串口波特率既不是19200也不是9600。

疑惑,按照上面的计算公式,应该是SMOD=1时波特率为19200,SMOD=0时波特率为9600才对啊?即便是P89v51rd2单片机本身特殊,在SMOD=0时波特率为19200,那大概猜测应该在SMOD=1时波特率为9600啊?
望用过P89V51RD2的朋友指点,谢谢!

初始化代码如下:
//————– 初始化定时器0 —————————-
TMOD |= 0x01; //定时器0,16位工作方式
TCON_bit.TR0 = 1; //启动定时器
IEN0_bit.ET0 = 1; //打开定时器0中断
IEN0_bit.EA = 1; //开总中断
//————– 初始化定时器1 ——————————
TMOD |= 0x20; //Timer1: MODE2,自动重装
TH1 = 0xFB; //波特率19200
TL1 = 0xFB;
//————– 初始化uart ———————————
PCON_bit.SMOD1 = 0;
SCON_bit.SM0_FE = 0; //uart mode 1: 8-bit UART variable
SCON_bit.SM1 = 1;
SCON_bit.REN = 1; //允许串口接收
TCON_bit.TR1 = 1; //启动定时器1
IEN0_bit.ES = 1; //打开uart接收中断
//————– 设置中断优先级 ——————————–
IP0_bit.PS = 1; //设置串口最高中断优先级
IP0H_bit.PSH = 1;
IP0_bit.PT0 = 0; //设置Timer0次高中断优先级
IP0H_bit.PT0H = 1;

分享到: 更多
版权申明:

本站保留所有原创文章的版权,本站地址:奔跑的博客[http://www.elecbench.com]

原创文章转载时请注明出处,并添加文章所在页面的链接:http://www.elecbench.com/p89v51rd2%e7%9a%84%e4%b8%ad%e6%96%ad%e4%bc%98%e5%85%88%e7%ba%a7%e5%92%8c%e4%b8%b2%e5%8f%a3%e6%b3%a2%e7%89%b9%e7%8e%87%e9%97%ae%e9%a2%98/

本站所有 2010年3月4日 以后发表、未标明为“转载”的文章均是本站原创。

发表评论?

2 条评论。

  1. @lishutong
    谢谢,以前用过Keil的软防,现在不能用Keil,所以……

  2. 不知道你用过MDK的软仿没,在它的UART外设窗口中,一般可以看到计算出来的波特率。

发表评论


(设置自己的个性头像)

*

申请属于你的免费顶级域名