迪文科技论坛

 找回密码
 立即注册
搜索
查看: 11665|回复: 27

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

[复制链接]

7

主题

71

回帖

611

积分

高级会员

Rank: 4

积分
611
发表于 2020-1-16 11:36:49 | 显示全部楼层 |阅读模式
修正之前论坛分享的T5L51源代码串口C程序,去掉不必要的累赘。原串口buf[] 改为指针结构。 优化协议解释代码。 UI接口代码改为内部变量传递。整个速度比之前的提高了10倍。分享给大家。继续修正。目前串口刷机代码还没找到协议。论坛上知道的朋友提供一下。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

7

主题

71

回帖

611

积分

高级会员

Rank: 4

积分
611
 楼主| 发表于 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文件。 keil  bin文件刷进去不起作用,不知道官网是不是这样。第二页背景和网格是OS代码生成,图像非常清晰。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

2

主题

19

回帖

1905

积分

金牌会员

Rank: 6Rank: 6

积分
1905
发表于 2020-1-17 08:04:18 | 显示全部楼层
多谢楼主的分享,很好的代码资源,大力支持!!!
回复

使用道具 举报

1

主题

2

回帖

36

积分

新手上路

Rank: 1

积分
36
发表于 2020-1-23 15:44:45 | 显示全部楼层
试了 串口文件失败
回复

使用道具 举报

7

主题

71

回帖

611

积分

高级会员

Rank: 4

积分
611
 楼主| 发表于 2020-1-25 23:13:38 | 显示全部楼层
qlwz 发表于 2020-1-23 15:44
试了 串口文件失败

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

使用道具 举报

7

主题

71

回帖

611

积分

高级会员

Rank: 4

积分
611
 楼主| 发表于 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[UART4_MAX_LEN];
uart2_rxBuf[UART2_MAX_LEN];
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[1025];
                }dat;
                u8         end;
}TypDefRx;


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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

4

主题

45

回帖

203

积分

中级会员

Rank: 3Rank: 3

积分
203
QQ
发表于 2020-2-2 16:49:24 | 显示全部楼层
好东西,谢谢分享!
回复

使用道具 举报

15

主题

42

回帖

282

积分

中级会员

Rank: 3Rank: 3

积分
282
发表于 2020-2-3 16:54:47 | 显示全部楼层
大奖非你莫属
回复

使用道具 举报

15

主题

42

回帖

282

积分

中级会员

Rank: 3Rank: 3

积分
282
发表于 2020-2-4 10:02:36 | 显示全部楼层
请教楼主,void Serial_Uart2_Deal(TypDefUart *uart)的作用是解析接收回来的数据包, 我觉得 等数据包解析完了 直接uart->psRx = uart->ptRx = uart->phRx;这样不安全,万一在解析(写内存)的时候,进来的串口数据 就被丢弃了,我想的是不正确的?
Serial_Uart4_Deal这个函数就没有问题。疑惑中。。
回复

使用道具 举报

7

主题

71

回帖

611

积分

高级会员

Rank: 4

积分
611
 楼主| 发表于 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还是能支持的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-4-25 02:58 , Processed in 0.091360 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表