关于8H08U系列的串口新功能
本帖最后由 Mr_LG 于 2024-1-10 07:02 编辑这两天节奏有点迟缓啊,不见动静?难道干脆在改进硬件?那就大惊喜了! 本帖最后由 乘风飞扬 于 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 = 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 = 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
}
}
参考例程:
使用例程包里面配套的头文件。
在原STC8H.h头文件基础上添加STC8H2K08U特有的寄存器定义。 {:4_250:}赞一个!继续,坐等硬件奇偶校验啦。 Mr_LG 发表于 2024-1-10 15:03
赞一个!继续,坐等硬件奇偶校验啦。
暂时只做了 接收的 硬件奇偶校验,漏了发送的,
就不讲有了,这个新功能-硬件奇偶校验,等以后新产品再有
===其实一般都是 CRC 校验
盼望硬件奇偶校验的原因:
1,有些485通信协议的产品,上位机被”规定“为”奇“或”偶“校验;
2,又想动用DMA传送,此时没有硬件自动奇偶校验,就不能发挥DMA的全部优势(还得每个字节响应接收中断)!
3,我有个应用同,需要借第9位来标识字节流的序号的奇偶性。 1,用管脚兼容的 STC32
2,舍弃 硬件奇偶校验 用 CRC 校验
3,先量产这个 STC8H2K08U-45I-TSSOP20/SOP16 的 A版了
===后续 STC8H2K32U-45I-LQFP32 出来 再 改版 STC8H2K08U
另外 STC8H2K08U-45I-TSSOP20/SOP16
===接收的 硬件奇偶校验 是有的,缺了发送的
===明这部分开放出来
本帖最后由 Mr_LG 于 2024-1-11 06:44 编辑
在一个创新活力澎拜的团队内,对老型号产品的提升是一种“痒”或者说“瘾”,呵呵,有体会!
因此,产品线之间功能上的“跨界”现象,实在是在所难免!
但还是要好好斟酌,“S”、“T”、“U”,乃至“L”、“C”、“D”、这些尾缀的区分,尽量让用户方便选型。
我瞎说说啊:C给LCD,E给LED,D给DMA,S还给串口(未来均增强),T给触摸屏,U给USB。。。
STC8H2K08U串口接收硬件奇偶校验演示例程
注:STC8H2K08U-A版本-大量生产的版本,
===新增 串口接收有硬件奇偶校验,
===串口发送的硬件奇偶校验位自动产生,暂时没有,需要软件处理,后续B版本再增加这个。
通过定义使能奇偶校验:
#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define PARITYBIT ODD_PARITY//定义校验位
串口1硬件奇偶校验寄存器配置:
#if (PARITYBIT == NONE_PARITY)
USARTCR2 = 0x00; //禁止硬件产生奇偶校验
#elif (PARITYBIT == EVEN_PARITY)
//串口1(模式3:可变波特率9位数据)
SCON |= 0xc0;
USARTCR2 = 0x04; //使能硬件产生偶校验
#elif (PARITYBIT == ODD_PARITY)
//串口1(模式3:可变波特率9位数据)
SCON |= 0xc0;
USARTCR2 = 0x06; //使能硬件产生奇校验
#endif
串口2硬件奇偶校验寄存器配置:
#if (PARITYBIT == NONE_PARITY)
USART2CR2 = 0x00; //禁止硬件产生奇偶校验
#elif (PARITYBIT == EVEN_PARITY)
//串口2(模式1:可变波特率9位数据)
S2CON |= 0x80;
USART2CR2 = 0x04; //使能硬件产生偶校验
#elif (PARITYBIT == ODD_PARITY)
//串口2(模式1:可变波特率9位数据)
S2CON |= 0x80;
USART2CR2 = 0x06; //使能硬件产生奇校验
#endif
参考例程:
网友 立创版 即将开源作品