共2条
1/1 1 跳转至页
UART0 关于串口UART0中断-----我又来了
问
前一段时间,UART0接收中断不能触发,毫不容易搞定了,结果又发现,接收中断触发后不能返回,中段程序执行VICVectAddr=0x00;中断标志寄存器U0IIR值为C4,说明接收数据可用(RDA)中断未清除~~~、郁闷阿!!那位高手给指点指点!!还有,从PC发送30 31 32 33 34 35 36 37后,触发接收中断,然而接收到的数据UART0_Rx_Buff=“77777777”,何解???
相关程序如下:
uint8 UART0_Rx_Buff[8]; //定义UART0接收缓冲区
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void IRQ_UART0_Rx_Set(void) //设置UART0中断
{
U0FCR=0x81; //使能FIFO,并设置触发深度为8字节
U0IER=0x01; //使能接收数据可用中断和接收超时中断
VICIntSelect=0x00000000; //使能所有通道为IRQ中断
VICVectCntl2=0x26; //UART0中断分配到IRQ slot2,
//优先级次与I2C和外部中断3(键盘中断)
VICVectAddr2=(int)IRQ_UART0_Rx; //设置UART0向量地址
VICIntEnable=0x00000040; //使能UART0中断
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
void ISendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
{
UART0_SendByte(UART0_Rx_Buff[i]);//发送缓冲区
//UART0_Rx_Buff[]数据
}
while((U0LSR&0x20)==0);
}
void __irq IRQ_UART0_Rx(void)
{
uint8 i;
// if(0x04==(U0IIR&0x0F))
for(i=0;i<8;i++)
{
UART0_Rx_Buff[i]=U0RBR; //读取FIFO中的数据存储与
//缓冲区UART0_Rx_Buff[8],该操作自动清除标志位
}
ISendBuf(); //将接收到的数据发回
VICVectAddr=0x00;
}
void main(void)
{
PINSEL0 =0x800A8055;//设置引脚功能(PWM2.4.5.6;P0.15.16.30(EIN0/2/3);
PINSEL1 =0x20000402; //P0.0/1为UART0;P0.2/3为I2C有效;其他均为I/O,
UART0_Ini(); //初始化串口模式
IRQ_UART0_Rx_Set();//接收中断设置
.
.
.
.
}
还望高手指教阿~~~~~谢谢啦先!!
答 1: 没有清中断标志UART的中断标志U0IIR,在中断执行结束前必须读取U0IIR来清除中断。
但,实际发现,中断清除后,但不执行可以跳出中断,但全速运行却挑不出中断!!
高手们是不是觉得问题太菜了,给个会话儿啊!!! 答 2: 读RBR之前要先读LSR
相关程序如下:
uint8 UART0_Rx_Buff[8]; //定义UART0接收缓冲区
void UART0_Ini(void)
{ uint16 Fdiv;
U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk / 16) / UART_BPS; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03;
}
void IRQ_UART0_Rx_Set(void) //设置UART0中断
{
U0FCR=0x81; //使能FIFO,并设置触发深度为8字节
U0IER=0x01; //使能接收数据可用中断和接收超时中断
VICIntSelect=0x00000000; //使能所有通道为IRQ中断
VICVectCntl2=0x26; //UART0中断分配到IRQ slot2,
//优先级次与I2C和外部中断3(键盘中断)
VICVectAddr2=(int)IRQ_UART0_Rx; //设置UART0向量地址
VICIntEnable=0x00000040; //使能UART0中断
}
void UART0_SendByte(uint8 data)
{ U0THR = data; // 发送数据
while( (U0LSR&0x40)==0 ); // 等待数据发送完毕
}
void ISendBuf(void)
{
uint8 i;
for(i=0;i<8;i++)
{
UART0_SendByte(UART0_Rx_Buff[i]);//发送缓冲区
//UART0_Rx_Buff[]数据
}
while((U0LSR&0x20)==0);
}
void __irq IRQ_UART0_Rx(void)
{
uint8 i;
// if(0x04==(U0IIR&0x0F))
for(i=0;i<8;i++)
{
UART0_Rx_Buff[i]=U0RBR; //读取FIFO中的数据存储与
//缓冲区UART0_Rx_Buff[8],该操作自动清除标志位
}
ISendBuf(); //将接收到的数据发回
VICVectAddr=0x00;
}
void main(void)
{
PINSEL0 =0x800A8055;//设置引脚功能(PWM2.4.5.6;P0.15.16.30(EIN0/2/3);
PINSEL1 =0x20000402; //P0.0/1为UART0;P0.2/3为I2C有效;其他均为I/O,
UART0_Ini(); //初始化串口模式
IRQ_UART0_Rx_Set();//接收中断设置
.
.
.
.
}
还望高手指教阿~~~~~谢谢啦先!!
答 1: 没有清中断标志UART的中断标志U0IIR,在中断执行结束前必须读取U0IIR来清除中断。
但,实际发现,中断清除后,但不执行可以跳出中断,但全速运行却挑不出中断!!
高手们是不是觉得问题太菜了,给个会话儿啊!!! 答 2: 读RBR之前要先读LSR
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动——B站互动赢积分】活动开启啦! | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |