Tengo un pequeño lío con la configuración de reloj de un Kinetis MK66, a raiz de estar usando el bootloader uTasker. Después de muchas pruebas, conseguí que me funcione el bootloader en un MK66, porque con la configuración para Teensy 3.6 no funcionaba bien.
Ahora intento hacerlo funcionar en un MK64 y vuelvo a tener problemas de configuración del bootoader, en teoría debería de funcionar si selecciono la configuración para un Teensy 3.5, pero no es así, hace cosas muy raras y no carga el firmware, o lo hace a veces y bloqueando la ejecución.
Bueno, el problema del uTasker es otro tema. La cuestión es que mirando la configuración del reloj, me encuentro con cosas que no me cuadran.
Teensy 3.6 instala un cuarzo de 16Mhz, y en el listado de configuración del reloj en Arduino (Teensyduino), me deja seleccionar entre otras, 180Mhz. No entiendo como sacan los 180Mhz, a partir de 16Mhz, configurando el divisor y el multiplicador del PLL, no me salen las cuentas. El problema, es el de siempre con un entorno como el de Arduino, hay cosas que están por ahí ocultas y no las puedes ver, a menos que empieces a indagar a ver donde se esconden.
En los fuentes de uTasker, para que me funcionara el bootloader con un cuarzo de 16Mhz (originalmente estaba a 12Mhz para una placa FRDM-K66), configuré el reloj con estos parámetros. Funciona, si, pero ahora me he dado cuenta de que probablemente lo he overclockeado a 240Mhz (16/2= 8Mhz*30 = 240Mhz). Segun la lista de clocks disponibles para Teensy 3.6, este puede funcionar overclockeado a 192Mhz, 216Mhz y 240Mhz, seguramente eso explica que me funcione, pero no entiendo como configuran el reloj para 180Mhz con cuarzo de 16Mhz.
#define CRYSTAL_FREQUENCY 16000000 // 16 MHz crystal
#define CLOCK_DIV 2
#define CLOCK_MUL 30 // the PLL multiplication (x16 to x47 possible) [PLL output range 90..180MHz]
#define OSC_LOW_GAIN_MODE
#define _EXTERNAL_CLOCK CRYSTAL_FREQUENCY
#define BUS_CLOCK_DIVIDE 2 // 120/2 to give 60MHz (max. 60MHz)
#define FLEX_CLOCK_DIVIDE 2 // 120/2 to give 60MHz (max. 60MHz)
#define FLASH_CLOCK_DIVIDE 5
#define SYSTEM_CLOCK_DIVIDE 1 // 1 to 16 - usually 1
#define USB_CRYSTAL_LESS