最近、キーボード/マウス/ジョイスティックで動作するようにesp32でソフトウェアUSB-HOSTを作成しました。プロセッサは高速ですが、繊細で、脚の5ボルトはそれに耐えられません。そのため、「BluePill 」デバッグボードのバージョンで広く知られているstm32f103c8t6に書き直すことにしました。
残念ながら、これは今日の標準では非常にゆったりとしたプロセッサであるため(72 MHz対esp32の240)、送信中のビット間の時間間隔(1.5 Mbps +/- 1.5%)の必要な精度を提供できるかどうか疑問がありました。 +/- 0.01uSに対応します。これは、プロセッサの約1サイクルです。つまり、次のような遅延手順です。
static inline void cpuDelay(uint32_t ticks)
{
uint32_t stop =_getCycleCount32() + ticks;
while((_getCycleCount32() - stop)&0x80000000u); // ntinue while overflow
}
必要な精度を提供するのをやめたので、次のフォームの手順に進むことにしました。
void cpuDelay()
{
__asm__ __volatile__("nop");
__asm__ __volatile__("nop");
__asm__ __volatile__("nop");
__asm__ __volatile__("nop");
}
必要な数の「nop」-sを使用します。レイテンシーを手動で調整してコードを再コンパイルすることにうんざりしたとき、私は必要なレイテンシーを選択するプロシージャを作成し、幅広いプロセッサ周波数で動作することにしました。考え方は次のとおりです。cpuDelayアドレスを使用してプロシージャを入力する代わりに、ポインタの中央にプロシージャを入力します。
#define TNOP1 { __asm__ __volatile__(" nop"); }
#define TNOP2 {TNOP1 TNOP1}
#define TNOP4 {TNOP2 TNOP2}
#define TNOP8 {TNOP4 TNOP4}
#define TNOP16 {TNOP8 TNOP8}
#define TNOP32 {TNOP16 TNOP16}
#define TNOP64 {TNOP32 TNOP32}
__volatile__ void cpuDelayBase()
{
TNOP64;
TNOP64;
TNOP64;
TNOP64;
END_BASE:;
}
void (*delay_pntA)() = &cpuDelayBase;
#define cpuDelay(x) {(*delay_pntA)();}
#define SIZEOF_NOP 2
void setDelay(uint8_t ticks)
{
delay_pntA = (&cpuDelayBase)+((256-ticks)*SIZEOF_NOP);
}
200,, delay_pntA.
6 4.0uS. 6 . 6 , :
, , 0.12uS 4.12 uS.
!!!???
, , CCCP , , , . , , , , .
. , , 2-87, - 3-62, 4-12. . 2.87 3.62 ( ) 4.12 () - . 12 , .
ロシアのウォッカ、ラベル:
ストリチナヤウォッカ、ラベル:
つまり、4.0-コンテンツと0.12-容量の合計4.12 ----これは1981年のストリチナヤウォッカの価格です。
実行結果:
pins 8 9 1 1 is OK!
cpu freq = 72.000000 MHz
TIME_MULT = 43
120 bits in 57.333332 uSec 2.093023 MHz 6 ticks in 2.866667 uS
120 bits in 269.000000 uSec 0.446097 MHz 6 ticks in 13.450000 uS
120 bits in 162.333328 uSec 0.739220 MHz 6 ticks in 8.116667 uS
120 bits in 109.000000 uSec 1.100917 MHz 6 ticks in 5.450000 uS
120 bits in 82.916664 uSec 1.447236 MHz 6 ticks in 4.145833 uS
120 bits in 69.000000 uSec 1.739130 MHz 6 ticks in 3.450000 uS
120 bits in 75.666664 uSec 1.585903 MHz 6 ticks in 3.783333 uS
120 bits in 75.666664 uSec 1.585903 MHz 6 ticks in 3.783333 uS
120 bits in 77.333336 uSec 1.551724 MHz 6 ticks in 3.866667 uS
120 bits in 77.333336 uSec 1.551724 MHz 6 ticks in 3.866667 uS
TRANSMIT_TIME_DELAY = 15 time = 4.145833 error = 0.627029%
USB1: Ack = 0 Nack = 0 20 pcurrent->cb_Cmd = 2 state = 2 epCount = 0
USB2: Ack = 0 Nack = 0 00 pcurrent->cb_Cmd = 0 state = 0 epCount = 0
desc.bDeviceClass = 00
desc.bNumConfigurations = 01
cfg.bLength = 09
cfg.wLength = 59
cfg.bNumIntf = 02
cfg.bCV = 01
cfg.bIndex = 00
cfg.bAttr = a0
cfg.bMaxPower = 50
pcurrent->epCount = 1
pcurrent->epCount = 2
desc.bDeviceClass = 00
desc.bNumConfigurations = 01
cfg.bLength = 09
cfg.wLength = 34
cfg.bNumIntf = 01
cfg.bCV = 01
cfg.bIndex = 00
cfg.bAttr = a0
cfg.bMaxPower = 50
pcurrent->epCount = 1
USB0: Ack = 6 Nack = 0 80 pcurrent->cb_Cmd = 14 state = 100 epCount = 2
USB1: Ack = 6 Nack = 0 20 pcurrent->cb_Cmd = 14 state = 104 epCount = 1
PSウォッカウォッカ、私たちはイスラエルで麻を許可しました、私はここにソースを投稿するのを忘れました。
PPSはコードに問題を見つけません。これは概念実証にすぎません。掃除されます。