Según la hoja de datos de STM32F103C8T6, sus pines GPIO tienen una limitación de velocidad de hardware de 50 MHz. Necesito lograr una velocidad superior a 10 MHz, pero incluso con los códigos de ensamblaje solo obtengo 7,99 MHz.
Funciona a la velocidad máxima recomendada de 72MHz (8MHz Crystal + PLL).
¿Alguien puede guiarme? Verifique el siguiente ciclo de lenguaje ensamblador que estoy usando para alternar los pines GPIO.
asm(".equ GPIOB_ODR, 0x4001080C");
asm("ldr r6, = GPIOB_ODR");
asm("loop:");
asm("mov r1, #0xFFFFFFFF");
asm("strh r1, [r6]");
asm("mov r1, #0x00000000");
asm("strh r1, [r6]");
asm("b loop");
Tienes un par de mejores opciones para manejar pines GPIO:
Temporizadores. En esta parte, tiene siete temporizadores, la mayoría de los cuales se pueden configurar para establecer/restablecer/alternar pines en ciertos eventos (como comparación de coincidencias y desbordamiento).
DMA. Configure una transferencia DMA al registro de establecimiento/reinicio de bits GPIO y podrá alternar bits a la velocidad del bus. O puede conectarlo a un temporizador para establecer bits a la velocidad que desee.
Usos creativos de otros periféricos. USART y SPI/I2S parecen candidatos particularmente probables.
Tu método:
:loop
MOV R1, #0xFFFFFFFF ; 1 cycle
STRH R1, [R6] ; 2 cycles
MOV R1, #0x00000000 ; 1 cycle
STRH R1, [R6] ; 2 cycles
b loop ; 3 cycles
Lo más rápido que el núcleo puede escribir registros:
MOV R3, #0xFFFFFFFF
MOV R4, #0x00000000
:loop
STRH R3, [R6]
STRH R4, [R6]
b loop
Nota: GPIO es APB2, por lo tanto, bus de 36 MHz. Nunca se puede superar los 36 MHz.
Sin embargo, un temporizador puede hacer oscilar el pin en sysclk/2. (a menudo 72/2 Mhz)
Para obtener 10 MHz en una salida, necesita sincronizar el núcleo a un múltiplo de 10 con el PLL, ya que no puede dividir el reloj por 7,2 en los temporizadores.
El número máximo de hoja de datos Fmax(IO)out
de 50 MHz es el límite de hardware. El hardware GPIO no puede alcanzar una pendiente lo suficientemente rápido como para ir más alto.
Puede configurar el slew rate de las salidas, por ejemplo, sería innecesario hacer parpadear un led con pendientes de 10 ns. Pero sería necesario para la memoria externa de alta velocidad.
Jeroen3
dibosco
ligo george
ligo george
dibosco
ligo george
Bence Kaulics
dibosco