He estado intentando configurar el módulo UART de LPC1768. El tablero viene con un oscilador de cristal de 12Mhz. No hace nada más que recibir un personaje y transmitirlo al mismo tiempo. Estoy usando el simulador de Keil. Este es el código,
#include <LPC17xx.H>
void uart_init()
{
LPC_PINCON->PINSEL0 = 0X0500000;
LPC_UART2->LCR = 0X83;
LPC_UART2->DLL = 162;
LPC_UART2->LCR = 0X03;
}
int main()
{
uart_init();
while(1)
{
while(LPC_UART2->LSR & (1<<0));
LPC_UART2->THR = LPC_UART2->RBR;
while(LPC_UART2->LSR & (1<<6));
}
}
No estoy configurando ningún registro PLL, solo uso los valores predeterminados.
He referido varios foros para encontrar la velocidad en baudios, enlace
Haciendo referencia a system_LPC17xx.c,
#define CLOCK_SETUP 1
#define SCS_Val 0x00000020
#define CLKSRCSEL_Val 0x00000001
#define PLL0_SETUP 1
#define PLL0CFG_Val 0x00050063
#define PLL1_SETUP 1
#define PLL1CFG_Val 0x00000023
#define CCLKCFG_Val 0x00000003
#define USBCLKCFG_Val 0x00000000
#define PCLKSEL0_Val 0x00000000
#define PCLKSEL1_Val 0x00000000
#define PCONP_Val 0x042887DE
#define CLKOUTCFG_Val 0x00000000
Desde #define PLL0CFG_Val 0x00050063,
El bit 14-0 proporciona el valor M, y el valor almacenado aquí es M-1; 0x0063 que es 99 en decimal, entonces M = 100,
Bit 23-16 Proporciona el valor "N", el valor almacenado aquí es N - 1; 0x05 = 5 en decimal, entonces N = 6
De #define CCLKCFG_Val 0x00000003,
Bit 7-0, selecciona el valor de división para crear el reloj de la CPU (CCLK), al poner un valor de 3, CCLK = PLLCLK / 4
Estoy usando UART2, que se incluye en PCLKSEL2,
Desde #define PCLKSEL2_Val 0x00000000,
cuando se establece 0, PCLK_peripheral = CCLK / 4
para encontrar PLL0 freq, PLL0_clk = (2 * M * FOSC) / N Cr == > PLL0CLK = (2 * 100 * 12) / 6 == > PLL0CLK = 400Mhz
Ahora, CCLK = PPL0CLk / 4 == > CCLk = 400/4 = 100Mhz
y PCLK = CCLK / 4 = 100/4 = 25Mhz
Para calcular DLL, DLL = PCLK / (16 * Velocidad de transmisión) para 9600 Bpm, DLL = 25000000 / (16 * 9600) == > DLL = 162
Pero no puedo transmitir ni recibir nada cuando intento simular el programa Solo tengo un conocimiento limitado de ARM, por eso escribí mi método de cálculo para que cualquiera pueda corregirme si me equivoco.
También, En la hoja de datos, dieron una tabla que muestra valores de multiplicador para PLL0 con una entrada de 32 kHz
Pero usando esta ecuación PLL0_clk = (2 * M * FOSC) / N, no pude encontrar ningún valor dado en la tabla, p.ej: para M = 4272 y N = 1, PLL0clk = (2 * 4272 * 32) / 1 = 273408 kHz, 273.408 Mhz, pero en una tabla dada es 279.9698
Gracias