IO más rápido en ARM Cortex-M3 (Sam3x8e) que PIO_SODR y PIO_CODR?

2

Tengo un programa C muy simple que alterna un pin en una placa Cortex-M3 (SAM3X8E) con una velocidad de reloj de 84MHz. Construí esto usando Atmel Studio 6.1.

#include <asf.h>

int main (void)
{
    board_init();
    PIOB->PIO_PER = PIO_PB27;  //Enable PIO
    PIOB->PIO_OER = PIO_PB27;  //Set to OUTPUT
    PIOB->PIO_PUDR = PIO_PB27; //Disable the pull up resistor

    while(1) {
        PIOB->PIO_SODR = PIO_PB27; //Enable output
        PIOB->PIO_CODR = PIO_PB27; //Disable output
    }
}

Ahora, cuando cargue esto en la placa y conecto un osciloscopio al pin, veo la señal pulsando a unos 700 kHz. Pensé que la velocidad del ciclo hubiera sido mucho más rápida con este código minimalista.

¿Es posible obtener una frecuencia GPIO superior a un MHz utilizando esta configuración? ¿Es mi entorno de compilación el que no produce un código óptimo? ¿Es posible obtener GPIO más rápido usando otra técnica?

    
pregunta W Devauld

3 respuestas

6

No conozco la familia SAM3X, pero el IDE de Atmel Studio y la familia UC3 de Atmel.

Intente agregar el módulo de reloj a su proyecto, configúrelo a través del archivo config_clock.h, luego agregue una llamada sysclk_init () a su main y debería ir mucho más rápido.

Los relojes SAM3X por defecto a 4 MHz si no me equivoco.

    
respondido por el Tom L.
0

Intente usar el acceso directo al puerto y no como lo hizo a través de la estructura PIO. También habilite el indicador OWER para sus pines PIO y escriba su estado directamente en REG_PIOX_ODSR , lo que le ahorra instrucciones adicionales y mejora la velocidad general de su código. Su código podría parecerse a esto:

int main (void)
{
    board_init();
    sysclk_init();
    PIOB->PIO_PER = PIO_PB27;  //Enable PIO
    PIOB->PIO_OER = PIO_PB27;  //Set to OUTPUT
    PIOB->PIO_OWER = PIO_PB27; //Enable direct bit set

    while(1) {
        REG_PIOB_ODSR = (~(REG_PIOB_ODSR & PIO_PB27)) & PIO_PB27; //Enable output
    }
}

Si desea ir aún más rápido, intente usar interrupciones de temporizador que puedan manejar velocidades de hasta la mitad de la velocidad de reloj de la CPU en el caso de la sam3x hasta 42MHz

    
respondido por el Fabian Fahrenholz
-2

Recuerde que el bucle while en sí también tendría algún impacto. Una buena manera de minimizar el impacto de esto es duplicar la acción (en realidad, establecer los pines) unos cientos de veces.

    
respondido por el Warren Hodgkinson

Lea otras preguntas en las etiquetas