Mr_LG 发表于 2024-1-10 07:01:23

关于8H08U系列的串口新功能

本帖最后由 Mr_LG 于 2024-1-10 07:02 编辑

这两天节奏有点迟缓啊,不见动静?难道干脆在改进硬件?那就大惊喜了!

乘风飞扬 发表于 2024-1-10 09:41:44

本帖最后由 乘风飞扬 于 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
    }
}
参考例程:

乘风飞扬 发表于 2024-1-10 13:13:59

使用例程包里面配套的头文件。
在原STC8H.h头文件基础上添加STC8H2K08U特有的寄存器定义。

Mr_LG 发表于 2024-1-10 15:03:13

{:4_250:}赞一个!继续,坐等硬件奇偶校验啦。

神农鼎 发表于 2024-1-10 15:12:51

Mr_LG 发表于 2024-1-10 15:03
赞一个!继续,坐等硬件奇偶校验啦。




暂时只做了 接收的 硬件奇偶校验,漏了发送的,
就不讲有了,这个新功能-硬件奇偶校验,等以后新产品再有
===其实一般都是 CRC 校验


Mr_LG 发表于 2024-1-10 18:53:55

盼望硬件奇偶校验的原因:
1,有些485通信协议的产品,上位机被”规定“为”奇“或”偶“校验;
2,又想动用DMA传送,此时没有硬件自动奇偶校验,就不能发挥DMA的全部优势(还得每个字节响应接收中断)!
3,我有个应用同,需要借第9位来标识字节流的序号的奇偶性。

神农鼎 发表于 2024-1-10 18:59:51

1,用管脚兼容的 STC32
2,舍弃 硬件奇偶校验 用 CRC 校验
3,先量产这个 STC8H2K08U-45I-TSSOP20/SOP16 的 A版了
===后续 STC8H2K32U-45I-LQFP32 出来 再 改版 STC8H2K08U

另外 STC8H2K08U-45I-TSSOP20/SOP16
===接收的 硬件奇偶校验 是有的,缺了发送的
===明这部分开放出来

Mr_LG 发表于 2024-1-11 06:23:17

本帖最后由 Mr_LG 于 2024-1-11 06:44 编辑

在一个创新活力澎拜的团队内,对老型号产品的提升是一种“痒”或者说“瘾”,呵呵,有体会!
因此,产品线之间功能上的“跨界”现象,实在是在所难免!
但还是要好好斟酌,“S”、“T”、“U”,乃至“L”、“C”、“D”、这些尾缀的区分,尽量让用户方便选型。

我瞎说说啊:C给LCD,E给LED,D给DMA,S还给串口(未来均增强),T给触摸屏,U给USB。。。

乘风飞扬 发表于 2024-1-11 17:57:36

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
参考例程:


神农鼎 发表于 2024-1-12 15:16:02

网友 立创版 即将开源作品









页: 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21
查看完整版本: 0.99元USB-8H2K08U,144MHz-PWM硬件移相,51全面进入USB时代