Autor: Fernando Rafael Filipuzzi
E-mail: fernando_6867@yahoo.com.ar
A continuación expongo un programa sencillo que es un secuencial, lo que hace es escribir 0xff y luego de un tiempo 0x00 en el puerto B. Se anexan los fuentes según como se tenga instalado el ToolChain, iré agregando cosas y corrigiendo los errores a medida que tenga tiempo.
Los datos del sistema donde se instaló son:
Linux hp 2.6.30-2-686 #1 SMP Fri Dec 4 00:53:20 UTC 2009 i686 GNU/Linux Debian 5.0 Lenny
$aptitude install gcc-m68hc1x $aptitude install gdb-m68hc1x
#include "mc9s12ne_regs.h" #include "critical.h" #include "datatypes.h" void activar_leds(void){ int i,j; PORTB.byte = 0xff; for(i =0;i<3000;i++) for(j=0;j<3000;j++); PORTB.byte = 0x00; for(i=0;i<3000;i++) for(j=0;j<3000;j++); } int main(void) { DDRB.byte = 0xff; for(;;) { activar_leds(); } return(0); }He tenido problemas para que inicie en el
main()
cuando contruia con el ToolChain que se instala desde los repositorios de Debian, lo solucioné agregando una función __premain()
antes del main()
que llama a esta última, ver Descargar de los fuentes del ejemplo.
OUTPUT_FORMAT("elf32-m68hc12", "elf32-m68hc12", "elf32-m68hc12") OUTPUT_ARCH(m68hc12) ENTRY(_start) SEARCH_DIR("/usr/local/lib/gcc-lib/m6812-elf/3.3.5-m68hc1x-20050515/m68hc11/mshort") MEMORY { ioports (!x) : org = 0x0000, l = 0x0400 eeprom (!i) : org = 0x, l = 0x data (rwx) : org = 0x0400, l = 0x1c00 text (rx) : org = 0x4000, l = 0x4000 vectors (rx) : org = 0xFF80, l = 0x0080 } PROVIDE (_stack = 0x1bff); vectors_addr = 0xFF80;es importante verificar que exista el camino del directorio
"/usr/local/lib/gcc-lib/m6812-elf/3.3.5-m68hc1x-20050515/m68hc11/mshort"
.
OC = /usr/local/bin/m6812-elf-objcopy CC = /usr/local/bin/m6812-elf-gcc RM = /bin/rm CFLAGS = -v -m68hcs12 -mshort -mrelax -fsigned-char \ -fno-ident -fno-common -fomit-frame-pointer \ -Os -Wall # -g comentar -Os -Wall LDFLAGS = -Wl,-u,-mm68hc12elfb OCFLAGS = -O srec CSRCS=main.c ASRCS=mc9s12ne_vectors.s OBJS=$(CSRCS:.c=.o) AOBJS=mc9s12ne_vectors.o all: main.elf main.s19 download: stty -F /dev/ttyUSB0 raw 112500 hcs12mem -i podex-25 -p /dev/ttyUSB0 \ -o 25MHz -b 115200 -t mc9s12ne64 --read-flash copia.s19 load: stty -F /dev/ttyUSB0 raw 112500 hcs12mem -i podex-25 -p /dev/ttyUSB0 -o 25MHz -b 115200 -t mc9s12ne64 -E -H main.s19 $(OBJS): %.o: %.c $(CC) $(CFLAGS) -c $< main.elf: $(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o main.elf $(OBJS) $(ASRCS) -lgcc -lc main.s19: main.elf $(OC) $(OCFLAGS) main.elf main.s19 clean: $(RM) -f *.elf $(RM) -f *.s19 $(RM) -f *.dmp $(RM) -f $(OBJS) $(AOBJS)el nombre del fichero makefile se le denomina por defecto
makefile
, sino se hizo así luego al construir se debe especificar el nombre de este con la opción -f
, por ejemplo:
usuario@host:~/proyectos/secuencial$make -f nombre_del_fichero_makefile all
Es muy común que no este el puerto serie incluido en las PCs entonces hay que usar algún adaptador usb-rs232 para lo que en Debian el dispositivo es llamado "/dev/ttyUSB0".
usuario@host:~/proyectos/secuencial$su host:/home/usuario/proyectos/secuencial# stty -F /dev/ttyUSB0 speed 115200 baud; line = 0; eof = ^A; min = 1; time = 0; -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke host:/home/usuario/proyectos/secuencial#stty -F /dev/ttyUSB0 raw 115200
host:/home/usuario/proyectos/secuencial# hcs12mem -i podex-25 -p /dev/ttyUSB0 \ -o 25MHz -b 115200 -t mc9s12ne64 -G copia.s19 hcs12mem: Freescale S12 MCU memory loader V1.4.1 (C) 2005-2007 Michal Koniecznytarget info target mcu family osc <25.000000 MHz> BDM12POD serial port baud rate <115200 bps> BDM12POD version <4.7 +MODA/MODB> BDM12POD E-clock <12.500000 MHz> trace delay <0 ms> reset delay <1 ms> BDM status clock S12 part id <0x8201> family memory <64kB> mask <0.1> S12 part security backdoor key S12 register space <1kB> address range <0x0000-0x03FF> S12 RAM size <8kB> space <8kB> align address range <0x2000-0x3FFF> S12 EEPROM not present S12 FLASH module state ROMHM S12 FLASH size <64kB> space <48kB> off-chip/on-chip space <876kB/128kB> S12 FLASH protection all high area low area FLASH read: data [##################################################] FLASH read: data size <49152 B> time <16.30 s> rate <3015 B/s> FLASH read: data file written
host:/home/usuario/proyectos/secuencial# hcs12mem -i podex-25 -p /dev/ttyUSB0 \ -o 25MHz -b 115200 -t mc9s12ne64 -E -H main.s19 hcs12mem: Freescale S12 MCU memory loader V1.4.1 (C) 2005-2007 Michal Koniecznytarget info target mcu family osc <25.000000 MHz> BDM12POD serial port baud rate <115200 bps> BDM12POD version <4.7 +MODA/MODB> BDM12POD E-clock <12.500000 MHz> trace delay <0 ms> reset delay <1 ms> BDM status clock S12 part id <0x8201> family memory <64kB> mask <0.1> S12 part security backdoor key S12 register space <1kB> address range <0x0000-0x03FF> S12 RAM size <8kB> space <8kB> align address range <0x2000-0x3FFF> S12 EEPROM not present S12 FLASH module state ROMHM S12 FLASH size <64kB> space <48kB> off-chip/on-chip space <876kB/128kB> S12 FLASH protection all high area low area FLASH read: data [##################################################] FLASH read: data size <49152 B> time <16.30 s> rate <3015 B/s> FLASH read: data file written
host:/home/usuario/proyectos/secuencial# hcs12mem -f -i podex-25 -p /dev/ttyUSB0 \ -o 25MHz -b 115200 -t mc9s12ne64 -EH main.s19 hcs12mem: Freescale S12 MCU memory loader V1.4.1 (C) 2005-2007 Michal Koniecznytarget info target mcu family osc <25.000000 MHz> BDM12POD serial port baud rate <115200 bps> BDM12POD version <4.7 +MODA/MODB> BDM12POD E-clock <12.500000 MHz> trace delay <0 ms> reset delay <1 ms> BDM status clock S12 part id <0x8201> family memory <64kB> mask <0.1> S12 part security backdoor key S12 register space <1kB> address range <0x0000-0x03FF> S12 RAM size <8kB> space <8kB> align address range <0x2000-0x3FFF> S12 EEPROM not present S12 FLASH module state ROMHM S12 FLASH size <64kB> space <48kB> off-chip/on-chip space <876kB/128kB> S12 FLASH protection all high area low area FLASH erase: memory erased, time <11 ms> RAM load: agent file RAM load: address range <0x3C00-0x3E85> length <0x0286> entry <0x3D0A> RAM load: data [##################################################] error: BDM active wait timed out
host:/home/usuario/proyectos/secuencial# hcs12mem -E -i podex-25 \ -p /dev/ttyUSB0 -o 25MHz -b 115200 -f -t mc9s12ne64 -H main.s19 hcs12mem: Freescale S12 MCU memory loader V1.4.1 (C) 2005-2007 Michal Koniecznytarget info target mcu family osc <25.000000 MHz> BDM12POD serial port baud rate <115200 bps> BDM12POD version <4.7 +MODA/MODB> BDM12POD E-clock <12.500000 MHz> trace delay <0 ms> reset delay <1 ms> BDM status clock S12 part id <0x8201> family memory <64kB> mask <0.1> S12 part security backdoor key S12 register space <2kB> address range <0x7800-0x7FFF> S12 RAM size <8kB> space <16kB> align address range <0x0000-0x1FFF> S12 EEPROM not present S12 FLASH module state ROMHM S12 FLASH size <64kB> space <64kB> off-chip/on-chip space <0kB/1MB> S12 FLASH protection all high area low area error: FLASH protection violation (PVIOL bit set)
host:/home/usuario/proyectos/secuencial# hcs12mem -f -i podex-25 -p /dev/ttyUSB0 \ -o 25MHz -b 115200 -t mc9s12ne64 -H main.s19 hcs12mem: Freescale S12 MCU memory loader V1.4.1 (C) 2005-2007 Michal Koniecznytarget info target mcu family osc <25.000000 MHz> BDM12POD serial port baud rate <115200 bps> BDM12POD version <4.7 +MODA/MODB> BDM12POD E-clock <12.500000 MHz> trace delay <0 ms> reset delay <1 ms> BDM status clock S12 part id <0x8201> family memory <64kB> mask <0.1> S12 part security backdoor key S12 register space <1kB> address range <0x7800-0x7BFF> S12 RAM size <8kB> space <8kB> align address range <0x2000-0x3FFF> S12 EEPROM not present S12 FLASH module state ROMHM S12 FLASH size <64kB> space <48kB> off-chip/on-chip space <876kB/128kB> S12 FLASH protection all high area low area FLASH write: image file FLASH write: image info entry <0x4000> FLASH write: address range <0x4000-0x406F> size <0x0070> FLASH write: address range <0xFF80-0xFFFF> size <0x0080> FLASH write: image [ ] error: FLASH access error (ACCERR bit set)
Lo que hay que verificar es que esté bien configurado el puerto serie, puede depender de los drivers para el caso de un adaptador usb-rs232 y que con lo siguiente no se configure este:
host:/home/usuario/proyectos/secuencial# stty -F /dev/ttyUSB0 speed 115200 baud; line = 0; eof = ^A; min = 1; time = 0; -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke host:/home/usuario/proyectos/secuencial#stty -F /dev/ttyUSB0 raw 112500en windows eso se configura desde el administrador de dispositivos:
Descripción: Prolific USB-to-Serial Comm Port(COM3) Bits por segundo: 115200 Bits de datos: 8 Paridad: Ninguno Bits de parada: 1 Control de flujo: Ningunoluego con esto pude grabar bien la flash con hcs12mem.
Otra cosa también es que no se tenga permisos sobre el fichero /dev/ttyUSB0
, basta con ejecutar hcs12mem como root.
Si estas dos cosas no son, habria que probar comentar con # la línea que dice: "bdm_flash_write agent" del fichero llamado "/usr/local/share/hcs12mem/mc9s12ne64.dat".