Estoy tratando de familiarizarme con las ARM en el ejemplo del dispositivo LPC1110. Y hay cierta confusión sobre la selección de la velocidad en baudios para UART.
Supongo que se está ejecutando en 12MHz
después del reinicio. El manual de LPC111x ( pdf ) dice que debería configurar UARTCLKDIV
primero (según entiendo, es pre-divisor para reloj UART). Lo puse a 1
. Así que creo que UART_PCLK = 12MHz
Ahora necesito cargar el divisor a 16 bits latch U0DLM:U0DLL
. Manual dice que
baud rate = UART_PCLK / (16 * divisor)
También hay un ajustador de divisor fraccional, pero creo que no lo uso.
Entonces el código se ve así:
int divisor = 12000000 / (16 * 9600);
UARTCLKDIV = 1;
U0LCR = 0x83; // enable divisor loading
U0DLM = divisor >> 8; // divisor high byte
U0DLL = divisor & 0xFF; // divisor low byte
U0LCR = 0x03; // disable divisor loading
U0FCR = 0x07;
Y maravillosamente esto no funciona , es decir, veo el desorden en la terminal. Después de algunas búsquedas en Google y experimentos, encontré que funcionará bien si cambio la primera línea a 48MHz
:
int divisor = 48000000 / (16 * 9600);
Así que supuse que PLL podría estar habilitado, pero cuando leí el manual llegué a una conclusión, no lo está. Después de reiniciar, el reloj principal debería funcionar directamente desde el oscilador RC interno. Y utilizo el valor 12000000 MHz al grabar firmware con la herramienta mxli
.
¿Qué puedo extrañar aquí?
P.S. Ejemplo de código n. ° 3 no use el divisor de 16 bits, en su lugar cargue 0x9B
(155) a UARTCLKDIV
. Dicen que esto obtiene una velocidad de 19200 baudios, lo que significa que también se ejecutan a aproximadamente 47.6 MHz
(según tengo entendido).