Problema de generación de la señal GPIO del descubrimiento STM32F4

0

Estoy intentando generar una señal para interactuar con un controlador Nintendo 64 usando mi STM32F4-DISC1 (STM32F429). La señal que estoy intentando generar por ahora es solo 1us alta seguida por 1us baja (repetición ad infinitum).

Hay dos problemas a los que me enfrento:

  1. Parece que no consigo que funcione la sincronización correcta. El reloj principal debe ser de 180 MHz (según lo informado por la función "obtener relojes", perdoné el nombre completo). Esto debería significar que hay 180 ciclos por microsegundo, ¿verdad? Pero cuando configuro el GPIO a alto, espere 180 ciclos (180 nops) y luego lo establezca a bajo nuevamente, 3.5us han pasado. ¿Qué me estoy perdiendo aquí?

  2. La señal que estoy generando usando el siguiente código funciona bien después de un tiempo, pero no al principio. Si lo observo con un analizador lógico, la primera captura siempre tendrá este aspecto:

    Comopuedeverarriba,laseñalesaltasoloporuntiempomuycorto(alrededorde0.17us).Sinembargo,sinmodificarelcódigo,soloalcapturardenuevo,laseñalcambiaaesto:

    Enamboscasos,elcódigonohacambiadoyespera180ciclos.Siesrelevante,estoyusandoOpenBenchLogicAnalyzeraunafrecuenciademuestreode200MHz.

Códigodeinicialización

Códigodegeneracióndeseñal

Nota: 0xE0001004 es la dirección del contador de ciclos, que se actualiza automáticamente. Por lo tanto, no es necesario modificar r6 en el ciclo de espera.

También tenga en cuenta que he intentado la espera usando diferentes técnicas, incluyendo solo usar 180 NOP. Esto tuvo principalmente el mismo resultado.

    
pregunta fresskoma

1 respuesta

4

Esto iba a ser un comentario, pero luego me di cuenta de que necesito escribir más de lo que permite una ventana de comentarios. Así que esto será un 50% de comentarios y un 10% de respuestas y un 40% de incógnitas.

Estoy bastante familiarizado con asm en AVR y en PIC y cuántos ciclos toma cada instrucción. Así que puedo hacer conjeturas informadas sobre cómo se comportará su programa asm.

El hecho de que incluso tengas períodos de 3.5 µs es extraño por el aspecto de tu código.

Aquí hay un par de cosas que no puedo entender:

  • No está 100% seguro de que # 0xe0001000 sea DWT BASE , ¿por qué no está seguro? ¿No es eso algo de lo que deberías estar seguro?
  • Desea esperar 180 ciclos, sin embargo, cada vez que realiza un bucle en su espera , ejecuta 6 instrucciones, 4 de las cuales creo que son 1 ciclo por instrucción. Y los otros 2 son 2 ciclos por instrucción. Eso es 8 ciclos. Incluso llamas a nop dos veces seguidas ..
  • Nunca incrementas r6 en tu bucle de esperar , nunca usas la instrucción str para actualizar el conteo de ciclos. Esto significa que, de acuerdo con su código, ni siquiera puede abandonar el ciclo esperar porque nunca cambia nada.

De acuerdo con su analizador lógico, usted deja el bucle, lo que no debería poder hacer. Esto significa que, ya sea:

  • Esta pregunta es una broma y jaja, buena broma.
  • O hay una interrupción en el fondo que cambia r6 o el conteo de ciclos, y usted no lo sabe.
  • O lo sabes y decidiste no compartirlo con nosotros.
  • O el temporizador de vigilancia está activando y sacándote del circuito.
  • O este no es tu código real.
  • O la instrucción CMP está al revés y se está yendo al instante, como se muestra en su primer gráfico del analizador lógico, luego el STM se vuelve sensible y entiende que desea una onda cuadrada y hace su mejor esfuerzo y solo puede obtener un cuadrado Onda con un periodo de 3.5 µs. Pobre ser sensible, solo está haciendo lo mejor que puede. Nunca te olvidaré, tú eres STM sensible.
  • O simplemente soy tonto.

Si desea hacer ondas cuadradas con un período de 2 µs, use los temporizadores adecuados. Esto significa que durante el tiempo que está esperando, puede hacer otros procesos. Si desea contar todo en bucles, entonces efectivamente está congelando la CPU, en comparación con el uso de interrupciones.

Dado que esto se conectará con un famoso controlador Nintendo 64, ¿no hay alguna biblioteca para esto? Por qué mirar, hay uno para Arduino.

Mi consejo para ti es que:

  • Transfiera la biblioteca de Arduino a STM32F429, o puerto esta biblioteca.
  • Coloque el STM32F429 en una caja y utilícelo cuando necesite un microcontrolador de 180 MHz. Adquiera un Arduino y use la biblioteca y llámelo un día, hay toneladas de clones de arduino por ahí.
  • Publique su código actual en formato texto (no como una imagen).
  • Investigue cómo usar interrupciones en STM32F429.
respondido por el Harry Svensson

Lea otras preguntas en las etiquetas