Programando Atmel SAM MCU utilizando SAM-BA

0

Soy completamente nuevo en los microcontroladores Atmel ARM y más allá de una sola clase hace un par de años y algunos retoques de arduino, nuevos en el mcu "apropiado" en general.

Por lo tanto, estoy teniendo problemas con las tareas más simples, es decir, crear un simple programa de parpadeo de LED y programarlo en el chip.

El MCU es un ATSAM3X8E, montado en un arduino debido (pero no estoy usando ningún software arduino, estoy tratando de tratarlo como un simple panel de ruptura para el MCU).

Estoy usando un proyecto de ejemplo que viene con Atmel studio 7 llamado clock_example11 (que aparentemente está hecho para el arduino debido a que la configuración de la placa debería estar bien?) excepto que solo intenté modificar el LED parpadeante en el pin 14 del puerto B . Se construye aparentemente bien.

Entonces intenté programarlo por USB, usando el software SAM-BA 2.15. Comienzo el programa, me conecto al chip con éxito (con el preajuste de la placa "at91sam3x8-ek"), selecciono el archivo .bin incorporado como el nombre del archivo de envío en la pestaña flash y lo envío a la dirección 0x80000, que si entiendo es el inicio del flash y es desde donde se inicia el chip si configuro el arranque desde el bit de flash. Luego envío el archivo y, cuando intento comparar la memoria con el archivo enviado, coincide, de modo que el flash se programó correctamente, parece. Luego ejecuto el script "boot from flash" e incluso "select flash0 for boot" por si acaso.

Pero, no pasa nada. El LED no parpadea. Y no sé a dónde ir desde aquí. No sé cuáles de los pasos que hice, si no todos, están equivocados. ¿Alguien me puede dar algunos consejos? Aquí está el archivo fuente principal:

#include "asf.h"

/* Global ul_ms_ticks in milliseconds since start of application */
volatile uint32_t ul_ms_ticks = 0;

/**
 * \brief Wait for the given number of milliseconds (using the ul_ms_ticks generated
 * by the SAM microcontroller system tick).
 *
 * \param ul_dly_ticks  Delay to wait for, in milliseconds.
 */
static void mdelay(uint32_t ul_dly_ticks)
{
    uint32_t ul_cur_ticks;

    ul_cur_ticks = ul_ms_ticks;
    while ((ul_ms_ticks - ul_cur_ticks) < ul_dly_ticks) {
    }
}

/**
 * \brief Handler for System Tick interrupt.
 *
 * Process System Tick Event and increments the ul_ms_ticks counter.
 */
void SysTick_Handler(void)
{
    ul_ms_ticks++;
}

/**
 * \brief Initialize the clock system and blink a LED at a constant 1 Hz frequency.
 *
 * \return Unused (ANSI-C compatibility).
 */
int main(void)
{
    sysclk_init();
    board_init();

    /* Setup SysTick Timer for 1 msec interrupts */
    if (SysTick_Config(sysclk_get_cpu_hz() / 1000)) {
        while (1) {  /* Capture error */
        }
    }

    while (1) {
        ioport_toggle_pin_level(IOPORT_CREATE_PIN(PIOA,14));
        mdelay(500);
    }
}

EDITAR: Creo que mi código fue el problema, porque ahora pude programar el chip. Para el registro, modifiqué la función principal a esto: enlace

    
pregunta GrixM

1 respuesta

4

Algo que noté es que tienes la siguiente línea para cambiar el estado:

ioport_toggle_pin_level(IOPORT_CREATE_PIN(PIOA,14));

Aunque técnicamente no hay nada de malo en que la mayoría de los ejemplos de Atmel definen el puerto en conf_board.h , por lo que si no ha cambiado, es probable que también haya perdido la configuración del puerto como salida. Intente agregar lo siguiente para configurar el puerto como una salida y es probablemente una mejor práctica definir el nombre del puerto en una definición:

#define LED IOPORT_CREATE_PIN(PIOA,14)
ioport_set_pin_dir(LED, IOPORT_DIR_OUTPUT);

Luego en tu código principal:

ioport_toggle_pin_level(LED);

Independientemente de si funciona, no vale la pena echar un vistazo a algunos de los códigos generados por ASF en los subdirectorios del proyecto para familiarizarse con el lugar donde Atmel suele colocar la configuración del puerto y el código de inicialización. Puede haber otros pines definidos como salidas que a su placa no le gustan. No pude encontrar un esquema para el Arduino Due pero también podría valer la pena averiguar qué frecuencia de cristal usa, puede ser lo suficientemente diferente como para que el código de inicialización del reloj seleccione una frecuencia que sea demasiado alta para funcionar.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas