luozewei 发表于 2020-1-16 11:36:49

【开源】keil OS 编程源代码, 串口速度提高了10倍

修正之前论坛分享的T5L51源代码串口C程序,去掉不必要的累赘。原串口buf[] 改为指针结构。 优化协议解释代码。 UI接口代码改为内部变量传递。整个速度比之前的提高了10倍。分享给大家。继续修正。目前串口刷机代码还没找到协议。论坛上知道的朋友提供一下。


luozewei 发表于 2020-1-16 19:20:19

本帖最后由 luozewei 于 2020-1-16 21:09 编辑

终于不用卡刷了。V2.1版本支持T5L 串口刷 DGUS2。 UI接口程序部分又提高了5%速度。在2.1504M波特率下,T5L串口刷机速度比SD卡还要快1倍。 那个坛友有没高速USB转串口测试一下,把波特率提高到6.4512M,设置后示波器要实际测试一下的,有些芯片不支持。
U4串口可以支持到25.80484M. 内部串口已经是8分频了最高了。要再高就要研究FIFO了。
把整个工程分享给大家,文字非JPG格式做的,用小字库生成加载边缘光滑。时钟用T2生成,T2定时器是自动关闭中断标记,不存在进中断的时间差。
内含OS高速串口代码。支持串口刷机。T5L好像只能刷DGUS2 bin文件。 keilbin文件刷进去不起作用,不知道官网是不是这样。第二页背景和网格是OS代码生成,图像非常清晰。




choraless 发表于 2020-1-17 08:04:18

多谢楼主的分享,很好的代码资源,大力支持!!!:victory:

qlwz 发表于 2020-1-23 15:44:45

试了 串口文件失败

luozewei 发表于 2020-1-25 23:13:38

qlwz 发表于 2020-1-23 15:44
试了 串口文件失败

检查一下串口连接线,波特率高了。连接线要尽量短。并且串联100R电阻,减小震荡。 我用5cm串口连接线波特率提高到6.4512M连续发送2048byte不丢帧。当波特率提高到8.6M时,就发现丢帧了。这是TTL电平。还想提高速度就得用485了

luozewei 发表于 2020-1-25 23:53:22

结构化指针应用

本帖最后由 luozewei 于 2020-1-26 00:01 编辑

串口2 波特率2150400;串口4波特率6451200;串口4支持大于256byte字节一个包。数据长度为16bit的16位数据,最大长度只是受51内核RAM限制。    2个串口都实际测试通过。从接收缓冲到UI接口就一个缓冲。在不同函数之间用缓冲指针传递到结构化指针。其中变量非常清晰明了。丢弃了之前的不同变量在一个buf里面用指针++造成变量混乱。 串口4每10ms时间传递4122byte。 用于显示电压和电流波形。串口2协议还是原来的。 串口4做了些修改增加可靠性。 串口4和STM32串口通信,由于STM32。高字节在高位和51核高字节在低位刚好相反。协议修改为帧头(0x5555) + 字节数(0x08) + 读写(0x84) + 16bit数据长度(0x400) + 数据 +帧尾(0xAA)    帧总长度 = (0x08+ 0x400 * 2)这样检查帧尾非常方便。接收缓冲头指针   if(*(psRx + strlen) == 0xAA) ...
uart4_rxBuf;
uart2_rxBuf;
typedef struct UART {
                u8*phRx;               
                u8*psRx;               
                u8*ptRx;               
                u8*peRx;
                u8      rxErr;
      
                u8*phTx;
                u8*psTx;
                u8*ptTx;
                u8*peTx;      
                u8      txErr;
}TypDefUart;

typedef struct
{         struct
                {                u16         head;
                              u8                length;
                              u8                command;
                              u16          addr;
                }pack;
                union
                {                u8                datLen16;
                              u16                strLen;
                              u16                content;
                }dat;
                u8         end;
}TypDefRx;


typedef struct
{                struct
                {                u16         head;
                              u8                length;
                              u8                command;
                              u16          addr;                        
                              u8                datLen16;
                              u16                dat;                        
                }pack;      
}TypDefTx;

TypDefRx*rx = (TypDefRx*)uart->psRx;

一零八科技 发表于 2020-2-2 16:49:24

好东西,谢谢分享!

jia175891641 发表于 2020-2-3 16:54:47

大奖非你莫属

jia175891641 发表于 2020-2-4 10:02:36

请教楼主,void Serial_Uart2_Deal(TypDefUart *uart)的作用是解析接收回来的数据包, 我觉得 等数据包解析完了 直接uart->psRx = uart->ptRx = uart->phRx;这样不安全,万一在解析(写内存)的时候,进来的串口数据 就被丢弃了,我想的是不正确的?
Serial_Uart4_Deal这个函数就没有问题。疑惑中。。

luozewei 发表于 2020-2-7 08:33:14

jia175891641 发表于 2020-2-4 10:02
请教楼主,void Serial_Uart2_Deal(TypDefUart *uart)的作用是解析接收回来的数据包, 我觉得 等数据包解析 ...

你好,数据包解释完,指针复位,如果在解释时又有数据包接收。这时数据会被清掉。我也测试过用环形指针或是环形下标。放在UART2接收函数里面,但8位机解释太慢。环形指针容易出错,环形下标不容易出错但是速度比指针更慢。UART2波特率低点用环形没问题,但还不如用高的波特率,接收完发送4F4B来做应答比较好。UART4波特率更高,6.4M下,每20ms 发送8K数据量,去掉4F4B应答。波特率提高到8.6M时,接收无码率就比较高了。后来查到是连接布线太长了,UART4接收函数8.6M还是能支持的。
页: [1] 2 3
查看完整版本: 【开源】keil OS 编程源代码, 串口速度提高了10倍