LPC1768 Velocidad de transmisión

1

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

    
pregunta Athul

2 respuestas

2

Puede ser porque "32kHz" es en realidad 32.768 kHz

    
respondido por el mike65535
0
  1. En keil4, en modo de depuración, ver- > ventanas en serie == > UART # *

UART # 1 = módulo UART0 de LPC1768

UART # 2 = módulo UART1 de LPC1768

UART # 3 = ¡No tengo idea! ; Probé esta ventana para UART2 & 3 pero no funcionó Te lo preguntaré en el foro de KEIL

Si cambio mi código de esta manera,

#include <LPC17xx.H>

void uart_init()
{
    LPC_PINCON->PINSEL0 |= 5 << 4; //uart 0
//  LPC_PINCON->PINSEL0 |= 5 << 20; //uart 2
//  LPC_PINCON->PINSEL0 |= 1 << 30; //uart 1
//  LPC_PINCON->PINSEL1 |= 0x01; //uart 1
//  LPC_PINCON->PINSEL0 |= 0X0A; //uart 3
    LPC_UART0->LCR = 0X83;
    LPC_UART0->DLL = 162;
    LPC_UART0->LCR = 0X03;
}

int main()
{
    uart_init();

    while(1)
    {
        while(!(LPC_UART0->LSR & (1<<0)));
        LPC_UART0->THR = LPC_UART0->RBR;
        while(!(LPC_UART0->LSR & (1<<5)));
    }
}

Podría ver los caracteres recibidos en la ventana UART # 0 de KEIL.

  1. Cometí algunos errores en mi código cuando hice la pregunta,

while((LPC_UART0->LSR & (1<<0))); LPC_UART0->THR = LPC_UART0->RBR; while((LPC_UART0->LSR & (1<<5)));

Debería ser,

while(!(LPC_UART0->LSR & (1<<0))); LPC_UART0->THR = LPC_UART0->RBR; while(!(LPC_UART0->LSR & (1<<5)));

    
respondido por el Athul

Lea otras preguntas en las etiquetas