USB Host, "Blue Pill", la méthode pour diviser le segment en deux et le prix de la vodka en URSS

A écrit récemment un logiciel USB-HOST sur esp32 pour fonctionner avec clavier / souris / joystick. Le processeur est rapide, mais délicat, 5 volts sur les jambes ne peuvent pas le supporter. Par conséquent, j'ai décidé de le réécrire en stm32f103c8t6, ​​largement connu dans la version de la carte de débogage "Blue Pill" .





Malheureusement, il s'agit d'un processeur très tranquille par rapport aux normes actuelles (72 MHz contre 240 pour esp32), il y avait donc des doutes sur le fait que je puisse fournir la précision nécessaire de l'intervalle de temps entre les bits pendant la transmission ( 1,5 Mbps +/- 1,5% ) correspond à +/- 0,01 uS, ce qui correspond à environ un cycle du processeur. Autrement dit, une procédure de retard comme:





static inline  void cpuDelay(uint32_t ticks)
{
	uint32_t stop =_getCycleCount32() + ticks;
	while((_getCycleCount32() - stop)&0x80000000u); // ntinue while overflow
}

      
      



J'ai arrêté de fournir la précision nécessaire, j'ai donc décidé de passer à une procédure du formulaire:





void cpuDelay()
{
__asm__ __volatile__("nop");
__asm__ __volatile__("nop");
__asm__ __volatile__("nop");
__asm__ __volatile__("nop");
}
  
      
      



avec le nombre requis de "nop" - s. Quand je me suis lassé d'ajuster manuellement la latence et de recompiler le code, j'ai décidé d'écrire une procédure qui sélectionne la latence nécessaire, travaillant dans une large gamme de fréquences de processeur. L'idée est la suivante: au lieu de saisir la procédure avec l'adresse cpuDelay, saisissez la procédure au milieu, au pointeur:





#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 , .





Vodka russe, étiquette:
Vodka Stolichnaya, étiquette:

Ce sont des photos d'ici





Donc 4,0 - contenu et 0,12 capacité totale 4,12 ---- C'est le prix de la vodka Stolichnaya en 1981.





résultat de l'exécution:





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 Vodka vodka, nous en Israël avons autorisé le chanvre, j'ai oublié de publier la source, ici .





PPS ne trouve pas de faute avec le code. Ceci est juste une preuve de concept. Sera nettoyé.








All Articles