He tenido problemas para depurar el módulo DSU en un SAM D20 ( hoja de datos ). Me refiero a utilizarlo para calcular CRC32 para un programa que estoy cargando a través de un cargador de arranque personalizado (el cargador de arranque no es el mío).
Aquí está el código:
// enable DSU module - enable its clocks
PM->AHBMASK.reg |= PM_AHBMASK_DSU;
PM->APBBMASK.reg |= PM_APBBMASK_DSU;
// enable writes to DSU
PAC1->WPCLR.reg = 0x02;
// configure Addr and Length registers
DSU->DATA.reg = 0xFFFFFFFFUL;
DSU->ADDR.reg |= DSU_ADDR_ADDR(address);
DSU->LENGTH.reg = DSU_LENGTH_LENGTH(nbytes/4); // length should be in words
DSU->STATUSA.bit.DONE = 1; // clear the done bit
DSU->CTRL.bit.CRC = 1; // begin CRC calculation
// wait until done
while(!DSU->STATUSA.bit.DONE);
// read CRC out of Data register
volatile uint32_t crc = (DSU->DATA.reg) ^ 0xFFFFFFFFUL;
return crc;
Donde address
y nbytes
corresponden al programa que estoy cargando. Los nombres de las variables provienen de la biblioteca ASF, pero se explican por sí mismos sobre lo que significan en la hoja de datos.
el problema es que no coincidirá con un CRC32 generado previamente desde el módulo zlib de Python:
crc32 = zlib.crc32(bindata, 0xFFFFFFFF) & 0xFFFFFFFF
Me gustaría saber qué preguntas hacer, pero no estoy acostumbrado a depurar un sistema de hardware. Entonces, ¿qué podría estar mal?
EDITAR: Finalmente lo descubrí. El registro de direcciones debe configurarse con una dirección WORD:
DSU->ADDR.reg |= DSU_ADDR_ADDR(address >> 2);
Espero que esto ayude a alguien eventualmente.