本帖最后由 乘风飞扬 于 2024-3-22 15:56 编辑
STC8H2K08U串口超时中断演示例程
串口1超时中断寄存器配置:
- UR1TOCR = 0xC0; //开启超时中断,SCALE(bit5) = 0:使用波特率bit时钟周期; 1:使用系统时钟周期
- UR1TOTL = 0x80; //设置超时时间:128个位时钟周期=(1000000/115200)*128us
- UR1TOTH = 0x00;
- UR1TOTE = 0x00; //写完TE超时时间才会生效
复制代码
串口2超时中断寄存器配置:
- UR2TOCR = 0xE0; //开启超时中断,SCALE(bit5) = 0:使用波特率bit时钟周期; 1:使用系统时钟周期
- UR2TOTL = 0xE0; //0xABE0 = 44000, 超时时间 = 系统时钟周期 * 44000
- UR2TOTH = 0xAB;
- UR2TOTE = 0x00; //写完TE超时时间才会生效
复制代码
串口1中断函数处理:
- void UART1_int (void) interrupt 4
- {
- if(RI)
- {
- RI = 0;
- RX1_Buffer[RX1_Cnt] = SBUF;
- if(++RX1_Cnt >= UART1_BUF_LENGTH) RX1_Cnt = 0;
- }
-
- if(TI)
- {
- TI = 0;
- B_TX1_Busy = 0;
- }
-
- if(UR1TOSR & 0x01) //判定是否产生超时中断
- {
- // P37 = !P37;
- B_RX1_OK = 1;
- UR1TOSR = 0x80; //设置 RTOCF 清除超时标志位 TOIF
- }
- }
复制代码
串口2中断函数处理:
- void UART2_int (void) interrupt 8
- {
- if((S2CON & 1) != 0)
- {
- S2CON &= ~1; //Clear Rx flag
- RX2_Buffer[RX2_Cnt] = S2BUF;
- if(++RX2_Cnt >= UART2_BUF_LENGTH) RX2_Cnt = 0;
- }
-
- if((S2CON & 2) != 0)
- {
- S2CON &= ~2; //Clear Tx flag
- B_TX2_Busy = 0;
- }
-
- if(UR2TOSR & 0x01) //判定是否产生超时中断
- {
- // P36 = !P36;
- B_RX2_OK = 1;
- UR2TOSR = 0x80; //设置 RTOCF 清除超时标志位 TOIF
- }
- }
复制代码
参考例程:
STC8H2K08U串口1串口2-超时中断与电脑收发测试-20240322.zip
(15.43 KB, 下载次数: 229)
|