STM32F103C8T6 Velocidad máxima de salida de E/S

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");
Deberías usar un temporizador.
Incluso si cada una de esas instrucciones tomara un ciclo, solo obtendrías 12MHz. ¿Qué estás tratando de lograr con esto? ¿Simplemente desea producir una onda cuadrada? Si es así, necesita usar un PWM. ¡Usando este método, su procesador no haría nada más que ser un generador de onda cuadrada!
¿Puede explicar el motivo del comportamiento anterior? Si el código anterior se ejecuta a 72 MHz, la frecuencia de salida de GPIO tiene que ser mucho más alta, ¿verdad?
No estoy tratando de generar una onda cuadrada... Necesito manejar pantallas LED en frecuencias más altas. Así que solo estaba probando la velocidad máxima de gpio.
Imagínese si cada instrucción tomara un ciclo (que no lo harán). Eso es 13.9ns por instrucción. Seis instrucciones tomarían 83.3ns lo que le daría 12MHz. Ahora busque cuántos ciclos toma realmente cada una de estas instrucciones y haga los cálculos.
Así que ahora tengo una duda más, en la hoja de datos dice que la velocidad máxima de GPIO es de 50 MHz. ¿Cómo puedo lograrlo?
La primera pregunta, ¿qué es lo que quieres hacer exactamente con este GPIO?
No puede lograrlo si se usa un GPIO y se alterna en el software. Además, creo, tiene que ver con la rapidez con la que cambia el pin y, por lo tanto, cuánto afecta a la EMC.

Respuestas (2)

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)outde 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.

Muchas gracias por la sugerencia. Con esto puedo lograr 11.9MHz. Tengo una duda. En la hoja de datos, he visto que la frecuencia de salida máxima de los pines GPIO es de 50 MHz. Si no es alcanzable, ¿cuál es su uso?
@LigoGeorge El hardware de conducción real está limitado a 50 MHz. (He agregado esto para responder)