Uso un SAMD21 sin un cristal externo, usando su oscilador interno de 32 kHz y lo transformo con DFLL a 48 MHz.
El procesador se despierta normalmente con GCLK0 en 1 MHz, así que primero activo GCLK1 con 32 kHz, le enciendo el procesador para que pueda apagar y reconfigurar GCLK0 a DFLL 48 MHz, y luego volver a encender el procesador a GCLK0. (este es el mismo método que usa el Arduino Zero, con la única excepción de que usa el resonador externo de 32k, mientras que yo uso el interno)
Ahora tengo GCLK0 ejecutándose en 48 MHz y manejando la CPU. También uso el reloj genérico 2 en 1 MHz para PWM, UART y otras cosas. Hasta ahora tan bueno. Lo depuro con SWD, con el uso de una placa XPlained Pro donde el microcontrolador se ha quitado y las líneas de SWD van directamente a mi placa.
Todo funcionó bien. Hasta que quise configurar el reloj genérico 3.
REG_GCLK_GENCTRL = 0x000003; // disable gclk3 to allow changes
REG_GCLK_GENDIV = 0x000103; // set division to 1
REG_GCLK_GENCTRL = 0x010603; // activate gclk3 with 8 MHz
Después de cargar el software, el microcontrolador dejó de responder y ya no puedo acceder a él a través de SWD. Tenía una tabla de repuesto, y también la probé tontamente. Lo mismo sucedió.
El error dice
error: no se pudo activar la interfaz, pero se encontró un DAP con ID 0x ....
Sugiere borrar el flash y nombra el sueño profundo como una posible causa. Puedo borrar el flash con éxito. Sin embargo, ninguna otra operación es posible.
Mi primera suposición fue que, de alguna manera, arruiné la configuración del reloj, la CPU necesita un reloj en marcha para poder acceder a través de SWD, y no puede hacerlo por falta de un resonador. Así que saqué el resonador del XPlainedPro y lo instalé en mi tablero de la misma manera que estaba en el XPlainedPro, incluido su condensador.
No resolvió mi problema.
He visto este error en algunos subprocesos, pero generalmente se trata de que JTAG no funciona mientras SWD continúa funcionando.
¿Existe una forma de guardar mis controladores o están bloqueados?