共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 跳转至页
回复
打赏帖 | |
---|---|
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 |