学习新唐 N76E003的中断向量函数
void UART0_ISR() interrupt 4 using 1 等价于 #pragma vector = 0x23
`串口0 中断IE4.4 的入口地址0x23
C51 中断向量表:
8051系列的MCU 基本结构包括:
- 32个I/O口(4组8bit端口);
- 两个16位定时计数器;
- 全双工串行通信;
- 6个中断源 (2个外部中断,2个定时/计数器中断、1个串口输入/输出中断)
- 两级中断优先级
- 128字节内置RAM
- 独立的64K 字节可寻址数据和代码区
中断入口地址被编译器放在中断向量种,中断向量位于代码段最低地址处,串口输入/输出中断共用一个中断向量。
8051的中断向量表如下:
中断源 中断向量
上电复位 0000H
外部中断0 0003H
定时器0 溢出 000BH
外部中断1 0013H
定时器1 溢出 001BH
串行口中断 0023H
定时器2 溢出 0028H
Interrupt 和 using 都是C51 的关键字。C51 中断过程通过使用interrupt 关键字和中断号(0-31)来实现。
IE寄存器 C51 中的8051的
使能位 中断号 中断源
IE0 0 外部中断0
IE1 1 定时器0 溢出
IE2 2 外部中断1
IE3 3 定时器1 溢出
IE4 4 串口中断
IE5 5 定时器2 溢出
Using 关键字用来指定中断服务程序使用的寄存器组。
用法: using 后跟一个0-3 的数,对应着4组工作寄存器。
一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,会节约32个处理周期。
缺点是,所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发送错误。
示例代码1
* FUNCTION_PURPOSE: serial interrupt, echo received data.
* FUNCTION_INPUTS: P0.7(RXD) serial input
* FUNCTION_OUTPUTS: P0.6(TXD) serial output
*/
void SerialPort0_ISR(void) interrupt 4
{
if (RI==1)
{ /* if reception occur */
clr_RI; /* clear reception flag for next reception */
UART_BUFFER[u16CNT] = SBUF;
u16CNT ++;
riflag =1;
}
if(TI==1) { clr_TI; } /* if emission occur */
} //UART0 接收中断
#pragma vector = 0x23 //串行口中断入口地址
__interrupt void uart0_recv(void)
{
if(RI==1) { clr_RI; } //接收中断处理
}
示例代码2
//UART0 接收中断
#pragma vector = 0x23 //串行口中断入口地址
__interrupt void uart0_recv(void)
{
if(RI==1) { clr_RI; } //接收中断处理
}