您尚未登录。

楼主 # 2022-08-10 16:43:42

posystorage
会员
注册时间: 2018-05-06
已发帖子: 147
积分: 538

避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

W80x的主频速度很高,价格也很香,用来连接彩屏,刷屏显示应该是绰绰有余,弄个带屏幕的小玩意做智能家居控制之类的应该很好玩,但是实际测试发现刷屏速度很慢。使用8BIT并口刷屏,实际测下来不如主频跑在48MHz的STM32F030F6刷屏速度快!!!遂展开细究!
测试硬件如下:
1
焊接的W801芯片,但是使用W806的裸机SDK工程测试,目的是避免W801SDK工程的RTOS和中断等功能影响测试准确性。
只测试全屏清空,屏幕分辨率为240*432,8080并口,刷屏数据为RGB565,写两次8bit为一个像素点。

经过特殊优化后的LCD刷屏核心代码和编译后汇编如下:(防喷预警:“用户自己不会用怪芯片烂”)
注意,为避免误差,优化后,每一个指令读书写GPIO寄存器!!!没有多余操作!!
一个for循环内有6个紧密相连的ST.W指令,全是单周期操作GPIO!!和一个循环跳转指令BNEZ!!相比于正常的GPIO操作,“读ld.w--改bseti/bclri--写st.w”,没有别的多余的“读--改”步骤,只有“写”步骤,从理论上杜绝是因为代码写的稀烂导致的刷屏速度慢!也方便后续速度测试
1

理论计算:以上述指令ST.W均为单周期,跳转指令BNEZ因为要清流水线视为3个周期,写一个像素算9个CPU时钟,以下简称9T。
写240*432像素需要1036800T
在主频跑240MHz情况下,显示一屏需要的时间是3.888ms,也就是可以刷257帧/秒(暂时不考虑屏幕受不受得了)
实测,以240MHz主频刷屏,写一屏耗时33.6ms,慢了一个数量级,只有30帧的速度我不能接受,肉眼可见的明显拉窗帘现象!!!实际测主频跑在48MHz的乞丐CM0芯片STM32F030F6刷屏速度都可以接近50帧!
测试将W801主频降低到80MHz,此处发现了猫腻,写一屏耗时36.4ms,只是稍微增加?
1
刷屏速度没有变慢三倍。这里发现了猫腻。应该是GPIO速度和CPU时钟速度不匹配。
因为手上逻辑分析仪性能不足以测量IO翻转速度,特意借用了10Gsps的示波器测试。
测量数据位引脚的波形:写一个像素时间位360ns,也就是9T的用时,理论上9T用时应该是41ns左右
1
测量WR引脚的波形:这两个时钟之间的间隔在汇编上就表现为:
GPIOB->DATA = gpiob_cache_clr;
8011d6a:    dda32000     st.w          r13, (r3, 0x0)
GPIOB->DATA = gpiob_cache_set;
8011d6e:    dd832000     st.w
这里很明显的发现,GPIO时钟只有20MHZ????????
20MHz开什么天才国际大玩笑的设计????!!!?这可是主频240MHz的处理器哎!!!!怎么说也得给个50MHz好吧??????
1
根据手册猜测,而且CPU在访问GPIO为啥的时候应该是AHB-AHB2-APB的路径,写入GPIO操作后类似于总线忙,CPU一直在死等,这就造成了20MHz这种情况的奇观。
1

刷个屏幕拉窗帘不能接受,为了能提速,反复阅读了写的是中文但是不知道写的是啥的手册的CLK部分,明白APB时钟居然受控于WLAN根时钟管理???莫名其妙+1

1
1
"如果希望 WLAN 系统正常工作,WLAN 根时钟需要保持在 160MHz",二级总线时钟及 APB 时钟为此时钟四分频,这里再2分频就是GPIO时钟的20MHz
将wlan根时钟从原本的480MHz/3=160MHz调整到2分频 240MHz。
1
这样GPIO的速度就上来了,有30MHz了,如图单周期执行33ns:
1
刷屏时间来到22.5ms,这个速度有40多帧,总算不拉窗帘了
1

现在问题来了:这样直接超WLAN根时钟,wifi功能肯定不能用了。
不知道官方有办法解决,或者是开放一些时钟分频的配置寄存器(国产通病,手册里遮遮掩掩,这样不提,那也不敢写,全烤用户猜),让APB和AHB2不是绑定四分之一时钟关系。
可否保留wifi功能支持的情况下,提高GPIO的速度。
主频240MHz的单片机刷个屏幕还这么拉跨说出去多丢人啊。。。
你说别人程序写的烂刷屏慢可以怪用户不会用,这问题如果官方不给出方案或者开放隐藏寄存器(如果有),换个神仙用户也优化不了哦,总不能给你一个时钟周期挤一挤变成两条操作用了吧?

最近编辑记录 posystorage (2022-08-11 00:34:36)

离线

#1 2022-08-10 20:57:00

echo
会员
注册时间: 2020-04-16
已发帖子: 283
积分: 291.5

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

最简单方法就是不要用这些乱七八糟的MCU,除非对性能没有要求。

离线

#2 2022-08-10 21:17:49

xiao_fang
会员
注册时间: 2022-08-02
已发帖子: 3
积分: 4

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

我这几天在往CH582上移植DAPLINK,用逻辑分析仪看过SWDCLK的输出波形,最高也只有600K左右,IO的输出语句我没看过汇编,就是一句简单的|=和&=。
这个速度真的是见了鬼了,一个80M主频的单片机,在不用黑魔法优化的情况下IO翻转速度居然还到不了1M`````````
QQ截图20220810211613.png

离线

楼主 #3 2022-08-11 00:46:06

posystorage
会员
注册时间: 2018-05-06
已发帖子: 147
积分: 538

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

@xiao_fang
我优化过CH55x上的DAPLINK,望参考https://whycan.com/t_7786.html
这个我觉得不是ch5xx的问题(虽然ch5xx除了usb其他外设都很拉跨)
主要是原版daplink代码的swd时序部分写的很烂,而且是争对32位机的,这个优化以后其实速度挺快的

最近编辑记录 posystorage (2022-08-11 00:47:00)

离线

楼主 #4 2022-08-11 00:46:32

posystorage
会员
注册时间: 2018-05-06
已发帖子: 147
积分: 538

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

@xiao_fang
优化后 经过计算软IO模拟的话,12个处理器周期可以刷一个SWD时钟,3.3V下16M主频时钟1.66M,5V下24M主频时钟2M.

离线

楼主 #5 2022-08-11 00:47:49

posystorage
会员
注册时间: 2018-05-06
已发帖子: 147
积分: 538

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

echo 说:

最简单方法就是不要用这些乱七八糟的MCU,除非对性能没有要求。

你说的对 是我大意了。国产这些芯片,吹的光鲜亮丽,实际上没一个省心

离线

#6 2022-08-11 09:31:40

zzm24
会员
注册时间: 2018-05-07
已发帖子: 91
积分: 28

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

字多,设备高级,我必须信你,我不用就是

离线

#7 2022-08-11 10:38:04

xiao_fang
会员
注册时间: 2022-08-02
已发帖子: 3
积分: 4

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

posystorage 说:

@xiao_fang
我优化过CH55x上的DAPLINK,望参考https://whycan.com/t_7786.html
这个我觉得不是ch5xx的问题(虽然ch5xx除了usb其他外设都很拉跨)
主要是原版daplink代码的swd时序部分写的很烂,而且是争对32位机的,这个优化以后其实速度挺快的

被大佬翻牌子了,我的上一个版本就是基于你和ljbfly的那个CH55X的程序的,移植你那个的话SWDCLK时钟只有300K左右。后来我对比原版程序,意识到你那个是针对8位机做了一些优化,而CH582是个用RISCV内核的32位机。所以我又移植了原版的2.0程序,用原版程序速度会更快一点,能到600K,但是如果不用点儿黑魔法优化,再往上提升就提不上去了。
昨天在论坛看到echo反馈说CH582内置的rom其实是SPIFLASH,导致程序运行速度奇慢,80M主频下和20M的Cortex-M打平手,详见 https://whycan.com/t_7318.html 。所以我下一步打算把所有关键代码都放到RAM里运行试试。

最近编辑记录 xiao_fang (2022-08-11 10:54:34)

离线

#8 2022-08-23 16:55:29

815794369
会员
注册时间: 2020-02-16
已发帖子: 9
积分: 22.5

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

这个芯片我真的是醉了,本来要适配806的Arduino ,结果发现他C++支持的一坨狗屎,官方也eemmmm后面就放弃了

离线

#9 2022-08-25 13:06:30

llinjupt
会员
注册时间: 2020-12-21
已发帖子: 77
积分: 173

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

如果侧重点在性能,MCU拿回来就要直接寄存器方式验GPIO的Toggle速度,因为这个是对外的,大脑发达,四肢萎缩,对外性能发挥不出来,而且是硬伤,什么黑科技都很难提高。基本上标称大FLASH,高主频,大RAM,但是价格又偏低的片子,这个速度不会太高。问题是W801的价格也不低,看不懂。

最近编辑记录 llinjupt (2022-08-25 16:12:35)

离线

#10 2022-08-25 14:57:34

A77
会员
注册时间: 2022-07-30
已发帖子: 5
积分: 5

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

W801 当时想用SPI+DMA想提高刷新速度,实在是文档太少,遇到好多问题,最后也不了了之。。。

离线

楼主 #11 2022-08-25 18:34:33

posystorage
会员
注册时间: 2018-05-06
已发帖子: 147
积分: 538

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

A77 说:

W801 当时想用SPI+DMA想提高刷新速度,实在是文档太少,遇到好多问题,最后也不了了之。。。

这个芯片不是说SPI速度只有20M么 好像也快不到哪里

离线

#12 2022-12-19 19:03:16

梦程
会员
注册时间: 2021-03-25
已发帖子: 9
积分: 69

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

@xiao_fang
因为ch582的flash只能在20m主频及以下0等待,等待周期太长了,追求速度得扔到ram运行。

离线

#13 2022-12-20 08:59:22

吴助建
会员
注册时间: 2021-12-08
已发帖子: 62
积分: 15

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

这丫的SDK就是个坑,很久以前就放弃了,因为厂家不愿意改。
简单的函数,就是要套好几层,搞得云里雾里的,放弃才是王道。
本来挺看好它的硬件的。

离线

#14 2022-12-21 14:46:51

iamseer
会员
注册时间: 2020-06-06
已发帖子: 64
积分: 41.5

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

@xiao_fang
我没用过ch582但用过ch573
__attribute__((section(".highcode")))
这是要求高速执行代码必备的操作,要不然flash等待时间没法看。

另外这片子有诡异的流水线问题。如果代码里有压缩过的16位指令会导致难以预测的延迟,问官方流水线的规则或者实现自然是什么也问不出来的。我的解决办法就只能是手写汇编避免编译器压出16位指令。

离线

#15 2022-12-22 19:38:00

梦程
会员
注册时间: 2021-03-25
已发帖子: 9
积分: 69

Re: 避坑指南-国产wifi蓝牙芯片W800/W801/W806的GPIO速度很慢

@iamseer
避免16位指令直接关掉c扩展不是更快?

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn