学习新唐 N76E003中断向量函数
void UART0_ISR() interrupt 4 using 1 等价于 #pragma vector = 0x23 `串口0 中断IE4.4 的入口地址0x23
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; } //接收中断处理
}