迪文科技论坛

 找回密码
 立即注册
搜索
楼主: luozewei

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

[复制链接]

10

主题

84

回帖

782

积分

高级会员

Rank: 4

积分
782
 楼主| 发表于 2020-2-7 10:52:17 | 显示全部楼层
本帖最后由 luozewei 于 2020-2-7 20:59 编辑

DUGS的拖动控件只能做横向或者纵向拖动,且不能做控件交叉,这很不好使,我做了一个平移功能,手指落下在那条线上就选中那条线平移,非常好使。  滑动刻度指示条控件,不能在图标上反应变化值。用数据变量指示修改X,Y变量和值变量,这个比滑动刻度指示好使多了。后续有空想做一个菜单自动隐藏功能,类似手机下拉功能区。这些都要用OS去读写GUI会造成速度问题。GUI内核功能还是太LOW, 速度也太低。明明GUI有很多问题,速度问题,功能问题。原厂的GUI源代码不公开这点很不好。会造成和ST的 touchGFX相比竞争力不够。

本帖子中包含更多资源

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

x
回复

使用道具 举报

2

主题

7

回帖

85

积分

注册会员

Rank: 2

积分
85
发表于 2020-2-8 21:05:32 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

10

主题

84

回帖

782

积分

高级会员

Rank: 4

积分
782
 楼主| 发表于 2020-3-5 10:39:05 | 显示全部楼层
本帖最后由 luozewei 于 2020-3-5 13:20 编辑

串口4波特率成功从6.4M 升到10.5M 。 把板子晶振换到18M.  主频 = 18*56/3 = 336M  厂家定制版本是350M,看起来还是有裕量的。 串口4设置8倍采样率,4分频,我尝试过3分频波特率变成14M但是不成功,原因进中断退中断时间太长差不多要38个指令周期。接收1个byte 14M波特率下0.71us,中断响应到退中断这个时间不够用了,看起来只有DMA机制才可以解决。 串口4用空闲中断方式。不需要每个main循环去检查数据包是否完成,效率大大提升。实现方法,T1定时器设置2个8位自动加载模式,设置串口4接收中断最高级,每次串口接收中断后开启T1,TL1 = 0X40,等到所有数据接收完毕,T1中断置位。 OS部分完成了UI的底层结构化,全部用指针调用,变量结构化。串口8bit数据和接收,发送帧结构互相转换。这样大大提高了程序可读性和程序运行效率。
提醒一下,晶振频率改了,原串口1波特率921600,升高到1500000了。DwinPckitis-T5L读写的时波特率要修改位1.5M

本帖子中包含更多资源

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

x
回复

使用道具 举报

10

主题

84

回帖

782

积分

高级会员

Rank: 4

积分
782
 楼主| 发表于 2020-3-17 11:44:17 | 显示全部楼层
本帖最后由 luozewei 于 2020-3-17 14:58 编辑

添加了串口2 高速接口。解释协议不变。 波特率在18M晶振下1.5M, 晶振没变情况下还是921600。  由于PC USB转串口波特率高了误差比较大。个人认为不要超过2M。
串口4是和ST单片机通讯的,2个单片机主频是确定的。晶振频率在18M时设置到10.5M波特率和ST单片机刚好无误差,稳定通讯。串口2和串口4都同时启用了空闲中断。空闲时间都在串口接收中断函数里面独立设置的。mani函数里面查询TF1中断,再判断是U2数据接收完成的还是U4数据接收完成的,去做相应的串口接收。
液晶第二页底下一排 Err 0000-00-00。。。。。。是错误帧显示,帮助开发者查问题。加在串口4解释里面。用户也可以加在串口2里面,帮助上位机错误帧显示。
液晶第一页增加了电压,电流矫正,按下电压rms 数字地方会跳出窗口来。

本帖子中包含更多资源

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

x
回复

使用道具 举报

1

主题

31

回帖

764

积分

高级会员

Rank: 4

积分
764
发表于 2020-3-27 18:17:44 | 显示全部楼层
请教楼主,8283解析协议的  83处理解析函数是不是没有写好,我看到发送的83指令 读取不到对应的值;而且  void ReadDGUS_ii(u8 *pBuf)  函数, 好多看不 明白的地方 ,应该是没有写好吧 ,

本帖子中包含更多资源

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

x
回复

使用道具 举报

10

主题

84

回帖

782

积分

高级会员

Rank: 4

积分
782
 楼主| 发表于 2020-3-28 10:17:29 | 显示全部楼层
本帖最后由 luozewei 于 2020-3-28 10:27 编辑

buf.word[0] >>= 1 是UI内核是按32bit地址排列的。函数带进来的地址是按16bit,所有地址需要对齐。比如 要读写0x82地址内容(亮度信息地址), 在UI内核地址实际是0x41。 len_8是按8bit字节的长度。你的代码是最早的版本是按官网Keil C版本优化dgus读写速度。你可以用最后的版本。串口2和4都做了结构化处理,更容易读懂。 buf.word,len_8定义在global里面,因为C51不支持data变量出函数体销毁。最新版本dgus读写里面,typedef struct 类型是已经结构化的调用参数。
typedef struct
{
   u16    addr;        //UI地址,读写时也要 addr>>=1
   u8      datLen;    //8bit据字节数
   u8      *pBuf;    //8bit数据指针, 用指针最大好处是不需要去修改内容,比如有10种内容,每种长度和内容都不同。不需要copy内容到缓冲里面,只要修改指针pBuf指向内容首地址和长度datLen就可以传递到dgus改变屏内容,这种操作模式的速度比原先要快的多。
} TypStrUIpack;void Read_Dgus(TypStrUIpack *read)
{
   u8 data i = 0;
   ADR_M = read->addr >> 9;
   ADR_L = read->addr >> 1;
   RAMMODE = 0x80;
   len8 = read->datLen;
   len32 = len8 >> 2;
   pdat8 = read->pBuf;
   RAMMODE = 0xEF;
   while (APP_EN);
   while (len32--)
   {        //while (APP_EN);
      buf.byte[0] = DATA3;
      buf.byte[1] = DATA2;
      buf.byte[2] = DATA1;
      buf.byte[3] = DATA0;
      APP_EN = 1;
      *(u32 *)pdat8 = buf.lword;
      pdat8 += 4;
   }
   while (APP_EN);
   buf.byte[0] = DATA3;
   buf.byte[1] = DATA2;
   buf.byte[2] = DATA1;
   RAMMODE = 0x00;
   len8 &= 0x03;
   while (len8--)
      *pdat8++ = buf.byte[i++];
}

这里已经去掉了地址加1设置。在系统初始化时已经设置了不需要每次进函数体重新设置。也去掉了APP_ACK应答检查,因为在RAMMODE = 0x80;之后有很多代码插入,等到DATA0~3数据读写,这个UI早就响应了。在循环体里面while (APP_EN);也可以去掉, APP_EN = 1;之后也有好多条指令插入UI内核也早就响应了。这代码方式最大限度提高了效率。
回复

使用道具 举报

1

主题

31

回帖

764

积分

高级会员

Rank: 4

积分
764
发表于 2020-3-31 17:49:52 | 显示全部楼层
感谢楼主大神分享,我移植了楼主最后版本的void Read_Dgus(TypStrUIpack *read) ,还是没办法读取到的页面ID, 后来调试发现void Read_Dgus(TypStrUIpack *read)这个函数的倒数 第四行的:“len8 &= 0x03;” 不需要加“&”,直接“ len8 = 0x03;” 就OK了;如果传来需要读的变量地址只有1,读到的DATA3的数据只赋值给*pdat8了一次就结束了,而真正有效的数据在DATA2里面,没有赋值;
回复

使用道具 举报

10

主题

84

回帖

782

积分

高级会员

Rank: 4

积分
782
 楼主| 发表于 2020-3-31 21:07:02 | 显示全部楼层
liulaogen2 发表于 2020-3-31 17:49
感谢楼主大神分享,我移植了楼主最后版本的void Read_Dgus(TypStrUIpack *read) ,还是没办法读取到的页面I ...

len8 &= 0x03 是对8位字节数的1,2,3字节的读取。比如带进来的字节数是9个字节,那么8个字节是按32bit读取,1个字节是按8位变量读取.  
回复

使用道具 举报

18

主题

17

回帖

541

积分

高级会员

Rank: 4

积分
541
发表于 2020-4-9 12:02:43 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

7

主题

15

回帖

136

积分

注册会员

Rank: 2

积分
136
发表于 2020-5-9 18:21:36 | 显示全部楼层
mark一下,后续学习一下。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 04:54 , Processed in 0.044470 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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