LPC1768 Débit en bauds

Athul

LPC1768 Débit en bauds


J’ai essayé de configurer le module UART de LPC1768. La carte est livrée avec un oscillateur à cristal de 12Mhz. Il ne fait rien de plus que de recevoir un personnage et de le transmettre en même temps. J’utilise le simulateur Keil. Ceci est le code,

#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));
    }
}

Je ne configure aucun registre PLL, j’utilise uniquement des valeurs par défaut.

J’ai « référé plusieurs forums pour trouver le débit en bauds,
https://www.google.co.in/search?q=lp1768+pclk&rlz=1C1CHBF_enIN754IN754&oq=lp1768+pclk&aqs=chrome..69i57.5207j0j1&sourceid=chrome&ie=UTF

En référant 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

De #define PLL0CFG_Val 0x00050063,

Le bit 14-0 fournit la valeur M, et la valeur stockée ici est M-1; 0x0063 qui est 99 en décimal, donc M = 100,

Bit 23-16 Fournit la valeur « N », La valeur stockée ici est N – 1; 0x05 = 5 en décimal, donc N = 6

Depuis #define CCLKCFG_Val 0x00000003,

Bit 7-0, sélectionne la valeur de division pour créer l’horloge CPU (CCLK), en mettant une valeur de 3, CCLK = PLLCLK / 4

J’utilise UART2, qui relève de PCLKSEL2,

Depuis #define PCLKSEL2_Val 0x00000000,

lorsqu’il est défini sur 0, PCLK_peripheral = CCLK / 4

POUR trouver la fréquence PLL0, PLL0_clk = (2 * M * FOSC) / N Cr ==> PLL0CLK = (2 * 100 * 12) / 6 ==> PLL0CLK = 400Mhz

Maintenant, CCLK = PPL0CLk / 4 ==> CCLk = 400/4 = 100Mhz

et PCLK = CCLK / 4 = 100/4 = 25Mhz

Pour calculer la DLL, DLL = PCLK / (16 * Baud rate) pour 9600 Bpm, DLL = 25000000 / (16 * 9600) ==> DLL = 162

Mais je ne peux rien transmettre ni recevoir quand j’ai essayé de simuler le programme. Je n’ai que des connaissances limitées en ARM, c’est pourquoi j’ai écrit ma méthode de calcul pour que n’importe qui puisse me corriger si je me trompe.

De plus, dans la fiche technique, ils ont donné un tableau montrant les valeurs de multiplicateur pour PLL0 avec une entrée de 32 kHz
entrez la description de l'image ici

Mais en utilisant cette équation PLL0_clk = (2 * M * FOSC) / N, je n’ai trouvé aucune valeur donnée dans le tableau, par exemple: pour M = 4272 et N = 1, PLL0clk = (2 * 4272 * 32) / 1 = 273408 kHz, 273,408 MHz, mais dans le tableau donné, c’est 279,9698

Merci

Réponses


 mike65535

C’est peut-être parce que le « 32 kHz » est en fait 32,768 kHz

Dave Tweed ♦

Par exemple: 32 768 * 2 * 4272 = 279 969 792. Je ne sais pas d’où vient le facteur supplémentaire de deux, mais cela est probablement expliqué quelque part dans la fiche technique. Notez que j’ai obtenu cela en divisant simplement les deux nombres dans une entrée du tableau: 279,9698 MHz / 4272 = 65536,00187 kHz, ce qui est évidemment une puissance de 2, plus ou moins une petite erreur d’arrondi.

Athul

Merci pour la réponse. C’était ma deuxième question. La première question concernait la configuration de UART2 pour un débit en bauds de 9600. L’oscillateur à cristal externe utilisé est de 12 MHz. J’ai utilisé les équations ci-dessus pour calculer la DLL, mais je n’ai pas pu faire fonctionner l’uart

mike65535

Comment testez-vous l’UART – utilisez-vous un autre port de communication pour l’écouter (de sorte que les débits en bauds, etc., doivent correspondre), ou utilisez-vous une portée?

Athul

Je le simule dans Keil4. Soit recevoir un personnage et l’envoyer pour le donner au registre THR pour le voir. ou en définissantLPC_UART2->THR = 'A'; while(LPC_UART2->LSR & (1<<6));


 Athul

  1. Dans keil4, en mode débogage, afficher-> fenêtres série ==> UART # *

UART # 1 = module UART0 de LPC1768

UART # 2 = module UART1 de LPC1768

UART # 3 = Aucune idée !! ; J’ai essayé cette fenêtre pour UART2 & 3 mais n’a pas fonctionné
je vais le demander dans le forum KEIL

Si je change mon code de cette façon,

#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)));
    }
}

J’ai pu voir les caractères reçus dans la fenêtre UART # 0 de KEIL.

  1. J’ai fait des erreurs dans mon code quand j’ai posé la question,

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

Ça devrait être,

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

entrez la description de l'image ici

 

#en, bauds, débit, LPC1768

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *