STM32F103C8T6 Velocidad máxima de salida IO

1

Según la hoja de datos de STM32F103C8T6, sus pines GPIO tienen una limitación de velocidad de hardware de 50MHz. Necesito alcanzar una velocidad por encima de 10MHz, pero incluso con los códigos de ensamblaje obtengo solo 7.99MHz.

Se está ejecutando a la velocidad máxima recomendada de 72MHz (8MHz Crystal + PLL).

¿Alguien puede guiarme? Por favor revise el siguiente bucle 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");
    
pregunta Ligo George

2 respuestas

2

Tienes un par de mejores opciones para manejar los pines GPIO:

  • Temporizadores. En esta parte, tiene siete temporizadores, la mayoría de los cuales se pueden configurar para configurar / restablecer / alternar patillas en ciertos eventos (como comparar coincidencias y desbordamientos).

  • DMA. Configure una transferencia DMA al registro de restablecimiento / restablecimiento de bits de GPIO y podrá alternar los bits a la velocidad del bus. O puede conectarlo a un temporizador para configurar los bits a la velocidad que desee.

  • Usos creativos de otros periféricos. USART y SPI / I2S parecen candidatos particularmente probables.

respondido por el duskwuff
0

Su 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 puedes exceder los 36 MHz.

Sin embargo, un temporizador puede oscilar el pin en sysclk / 2. (a menudo 72/2 Mhz)

Para obtener 10 MHz en una salida, necesitarías cronometrar el núcleo en un múltiplo de 10 con el PLL, ya que no puedes dividir el reloj entre 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 lograr una pendiente lo suficientemente rápida como para ir más alto.
Puede configurar la velocidad de giro de las salidas, por ejemplo, no sería necesario hacer parpadear un led con pendientes de 10 ns. Pero sería necesario para la memoria externa de alta velocidad.

    
respondido por el Jeroen3

Lea otras preguntas en las etiquetas