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;

2人评论了“P89V51RD2的中断优先级和串口波特率问题”

发表评论

邮箱地址不会被公开。 必填项已用*标注