¿Cómo habilito el reloj interno de 32MHz en un XMEGA avr en ensamblaje?

2

Este es el código C que uso actualmente para habilitar el reloj de 32MHz:

CCP = CCP_IOREG_gc;
OSC.CTRL = OSC_RC32MEN_bm;
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
CCP = CCP_IOREG_gc;
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;

Pero este código debe compilarse con alguna forma de optimización habilitada (se sugiere -Os ). ¿Hay alguna manera de hacer esto en ensamblado sin las optimizaciones habilitadas?

    
pregunta David Freitag

1 respuesta

2

Claro, si está utilizando Atmel Studio, la forma más sencilla de hacerlo es compilar su proyecto usando -Os y luego ver el contenido del archivo *.lss dentro del directorio debug . Este archivo contiene el código C junto con el código de ensamblaje compilado:

CCP = CCP_IOREG_gc;
3226:   88 ed           ldi r24, 0xD8   ; 216
3228:   84 bf           out 0x34, r24   ; 52
OSC.CTRL = OSC_RC32MEN_bm;
322a:   82 e0           ldi r24, 0x02   ; 2
322c:   80 93 50 00     sts 0x0050, r24
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
3230:   80 91 51 00     lds r24, 0x0051
3234:   81 ff           sbrs    r24, 1
3236:   fc cf           rjmp    .-8         ; 0x3230 <main+0x2c>
CCP = CCP_IOREG_gc;
3238:   88 ed           ldi r24, 0xD8   ; 216
323a:   84 bf           out 0x34, r24   ; 52
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
323c:   91 e0           ldi r25, 0x01   ; 1
323e:   90 93 40 00     sts 0x0040, r25

Usando la información de este archivo, puede modificar su código C a esto:

__asm__ __volatile__("ldi r24, 0xD8");
__asm__ __volatile__("out 0x34, r24");      // CCP = CCP_IOREG_gc;
__asm__ __volatile__("ldi r24, 0x02");
__asm__ __volatile__("sts 0x0050, r24");    // OSC.CTRL = OSC_RC32MEN_bm;
__asm__ __volatile__("lds r24, 0x0051");
__asm__ __volatile__("sbrs r24, 1");        
__asm__ __volatile__("rjmp .-8");           // while(!(OSC.STATUS & OSC_RC32MRDY_bm));
__asm__ __volatile__("ldi r24, 0xD8");
__asm__ __volatile__("out 0x34, r24");      // CCP = CCP_IOREG_gc;
__asm__ __volatile__("ldi   r25, 0x01");
__asm__ __volatile__("sts   0x0040, r25");  // CLK.CTRL = CLK_SCLKSEL_RC32M_gc;

Este ensamblaje en línea se probó trabajando contra un ATXMEGA32A4U sin optimizaciones habilitadas. Alternativamente, podría agregar un archivo de ensamblaje a su proyecto y crear una función en el ensamblador, pero esto no requiere conocimientos de ensamblaje para implementar.

Si está interesado en el conjunto de instrucciones avr, puede encontrar más información aquí .

    
respondido por el David Freitag

Lea otras preguntas en las etiquetas