Forum: Mikrocontroller und Digitale Elektronik Freescale M0+ FRDM KL25Z BOARD


von Jan (Gast)


Lesenswert?

Hallo, hat hier jemand mit dem Freedom kl25z von Freescale gearbeitet 
und kann sich vielleicht den Code ansehen. Es ist mit Keil programmiert. 
Das Problem ist, dass ich nicht ganz verstehe, wie das mit dem Clock für 
den UART funktioniert was PLL und FLL ist. und wie man diesen richtig 
einstellt. Der Code funktioniert zwar nur musste ich erst mit den 
Baudraten im Terminal rumprobieren, damits zufällig passt. Eigentlich 
sollte die Baud_Rate mit dem Code 9600 sein. Im Terminal muss ich 300 
einstellen damits läuft. Das liegt sicherlich daran, dass Clock für den 
UART nicht auf 48MHz eingestellt ist.
[c]


 *----------------------------------------------------------------------- 
--
#include <MKL25Z4.H>
#include <stdint.h>
#include <stdio.h>


#define CORE_CLOCK  48000000
#define OVER_SAMPLE 16


void uart0_putchar (char data);
unsigned char uart0_getchar (void);
void LED_Config(void);

const uint32_t led_mask[] = {1UL << 18, 1UL << 19, 1UL << 1};


/*---------------------------------------------------------------------- 
---
  MAIN function
 *----------------------------------------------------------------------- 
--
int main(void)
{

char c=0;
unsigned short baud = 9600;

int divisor = (CORE_CLOCK / OVER_SAMPLE) / baud;
SIM_SCGC4 |= SIM_SCGC4_UART0_MASK; /* Enable the clock to the selected 
UART */
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK; /* Turn on all port clocks */

// Turn on clock to UART0 module and select 48Mhz clock (FLL/PLL source)
SIM_SOPT2 &= ~SIM_SOPT2_UART0SRC_MASK;    // ClockSource
SIM_SOPT2 |= SIM_SOPT2_UART0SRC(2);


PORTA_PCR1 = PORT_PCR_MUX(2);
PORTA_PCR2 = PORT_PCR_MUX(2);

UART0_C2 = 0;
UART0_C1 = 0;
UART0_C3 = 0;
UART0_S2 = 0;



UART0_C4 = UART0_C4_OSR(OVER_SAMPLE - 1);
UART0_BDH = (divisor >> 8) & UART_BDH_SBR_MASK;   // 0x01 in BDH 
reinschreiben
UART0_BDL = (divisor & UART_BDL_SBR_MASK);         // 0x38 in BDL 
reinschreiben
UART0_C2 |= (UART_C2_TE_MASK | UART_C2_RE_MASK  ); /* Enable receiver 
and transmitter */
LED_Config();




   // da itoa einen Zeiger auf den Beginn von s zurueckgibt verkuerzt 
auch:



for(;;)
{


c = uart0_getchar();
uart0_putchar(c);

  // Wenn Null gedrückt dann Toggle LED
  if(c==0x30)
  FGPIOB_PTOR   = led_mask[1];

}
}


// Funktion GETCHAR
unsigned char uart0_getchar (void)
{
/* Warten bis Charakter empfangen wurde */
while (!(UART0_S1 & UART_S1_RDRF_MASK));
/* Return the 8-bit data from the receiver */
return UART0_D;
}

void uart0_putchar (char data)
{
/* Warten bis Speicher verfügbar im FIFO */
while(!(UART0_S1 & UART_S1_TDRE_MASK));
/* Send the character */
UART0_D =  data ;



}

 void LED_Config(void) {

SIM_SCGC5    |= (1UL <<  10) | (1UL <<  12); /* Enable Clock to Port B & 
D */
PORTB_PCR18 = (1UL <<  8);                  /* Pin PTB18 is GPIO */
PORTB_PCR19 = (1UL <<  8);                  /* Pin PTB19 is GPIO */



  FGPIOB_PDOR = (led_mask[0] |
               led_mask[1] );          /* switch Red/Green LED off  */
  FGPIOB_PDDR = (led_mask[0] |
               led_mask[1] );          /* enable PTB18/19 as Output */



}

[/c

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.