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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.