ESP32-S3 GPIO翻转速度怎么这么慢呢?
ESP32-S3 GPIO翻转速度怎么这么慢呢?
示例代码改了改,基本上直接操作寄存器了,60ns翻转,请教各位高工正常么?是否还能提高?实际项目中要模拟一个通信协议,至少要20到30ns翻转才行。
- Attachments
-
- 逻辑分析仪测量翻转
- 逻辑分析仪测量esp32-s3翻转.png (13.25 KiB) Viewed 7894 times
-
- 测量翻转的代码
- esp32-s3翻转代码.png (27.79 KiB) Viewed 7894 times
-
- Posts: 290
- Joined: Wed Sep 05, 2018 6:23 am
-
- Posts: 290
- Joined: Wed Sep 05, 2018 6:23 am
Re: ESP32-S3 GPIO翻转速度怎么这么慢呢?
另外,真不建议使用gpio去模拟任何协议,尤其是在一个RTOS环境下。你可以看看能否用RMT硬件构造出你要的时序:https://docs.espressif.com/projects/esp ... s/rmt.html
Re: ESP32-S3 GPIO翻转速度怎么这么慢呢?
同意,RMT 硬件非常灵活,协议一般的格式 RMT 都可以搞的定,GPIO模拟翻转的太频繁容易导致系统不稳定
Re: ESP32-S3 GPIO翻转速度怎么这么慢呢?
可以直接反转io引脚寄存器,当前测试,反转io大概需要3个时钟周期,我是用esp32-s3,240mhz工作频率下,大概只有8ns左右。
参考
参考
Code: Select all
GPIO.out_w1ts = (1 << BLINK_GPIO);
GPIO.out_w1tsc = (1 << BLINK_GPIO);
Re: ESP32-S3 GPIO翻转速度怎么这么慢呢?
补充一下,在社区中有人之前已经提过相关的话题了,参考:https://esp32.com/viewtopic.php?t=27963。
根据我的了解,大致的思路主要有四个:
1. 类似题主,使用hal库来提高反转的速度。优点是,方便,配置内容少。缺点是,操作还是不够底层,速度上不去。
2. 直接操作寄存器。相关寄存器为:GPIO.out_w1tc GPIO.out_w1ts GPIO.out1_w1ts.val GPIO.out1_w1tc.val 。至于为什么是四个,和引脚的序号有关,前32个引脚使用GPIO.out_w1tc GPIO.out_w1ts,33-34使用GPIO.out1_w1ts.val GPIO.out1_w1tc.val,至于超过34引脚的,不太清楚有没有相关操作。
3.直接使用CPU调用,也就是cpu直接通过指令集操作io。需要使用#include "driver/dedic_gpio.h"库,并进行配置。这里的相关内容可以参考上述文章中大佬得回复。基本可以将io翻转时间降低到12ns(80MHZ主频下)。使用得相关配置可以参考官方示例中得软件i2c模拟示例代码。
4.如果是想要模拟时序和相关外设,使用rmt是不错得选择。我本来是打算作为步进电机驱动使用的,还在适配中,主要问题是步进电机的梯形加减法导致的脉冲周期是可变的。
根据我的了解,大致的思路主要有四个:
1. 类似题主,使用hal库来提高反转的速度。优点是,方便,配置内容少。缺点是,操作还是不够底层,速度上不去。
2. 直接操作寄存器。相关寄存器为:GPIO.out_w1tc GPIO.out_w1ts GPIO.out1_w1ts.val GPIO.out1_w1tc.val 。至于为什么是四个,和引脚的序号有关,前32个引脚使用GPIO.out_w1tc GPIO.out_w1ts,33-34使用GPIO.out1_w1ts.val GPIO.out1_w1tc.val,至于超过34引脚的,不太清楚有没有相关操作。
3.直接使用CPU调用,也就是cpu直接通过指令集操作io。需要使用#include "driver/dedic_gpio.h"库,并进行配置。这里的相关内容可以参考上述文章中大佬得回复。基本可以将io翻转时间降低到12ns(80MHZ主频下)。使用得相关配置可以参考官方示例中得软件i2c模拟示例代码。
4.如果是想要模拟时序和相关外设,使用rmt是不错得选择。我本来是打算作为步进电机驱动使用的,还在适配中,主要问题是步进电机的梯形加减法导致的脉冲周期是可变的。
Who is online
Users browsing this forum: No registered users and 78 guests