Aby mieć możliwość podglądu danych z mikrokontrolera zajmiemy się wprowadzeniem możliwości jego komunikacji z komputerem PC za pomocą przejściówki USB->RS232 opartej na układzie PL2303. Poniżej zdjęcie poglądowe urządzenia.
Układ jest wyposażony w dwie linie transmisji RX oraz TX, które należy podłączyć do odpowiedniego portu szeregowego układu SAM4. Standardowo wyposażony jest on w dwa układy szeregowe UART0 i UART1. W zestawie uruchomieniowym SAM4S XPlained na wyjścia wyprowadzony jest UART1, który posiada przypisane linie transmisji do następujących pinów. Pin PB2 to linia RX, a pin PB3 to linia TX. Piny te znajdują się na złączy J1 na płytce testowej. Poniżej przedstawiono schemat podłączenia.
Pin PB2 linia RX musi być podłączony do lini TX przejściówki, a pin PB3 TX do lini RX. Układ podpisany do komputera, płyta prototypowa również musi być podłączona do komputera za pomocą kabla zasilającego USB, aby zapewnić jej zasilanie.
Teraz przechodzimy do menadżera urządzeń w systemie Windows aby sprawdzić czy mamy zainstalowany prawidłowy sterownik. Po podłączeniu powinniśmy zobaczy nowy port COM, lub nierozpoznane urządzenie.
Aby podłączyć prawidłowo urządzenie musimy zainstalować odpowiedni sterownik.
#include „sam4s16c.h”
#include „stdio.h”
#include „stdlib.h”
#include „string.h”
#define LEDA (1<<10)
#define LEDB (1<<17)
#define LEDA_on PIOC->PIO_SODR = LEDA
#define LEDA_off PIOC->PIO_CODR = LEDA
#define UART_PIO PIOB
#define UART_RX_PIN PIO_PB2
#define UART_TX_PIN PIO_PB3
#define UART UART1
#define UART_PID ID_UART1
#define UART_IRQn UART1_IRQn
#define UART_SPEED (9600ul)
#define __SYSTEM_CLOCK_4MHZ (4000000UL)
#define __SYSTEM_CLOCK_120MHZ (120000000UL)
static uint8_t stan_rs232=0;
static uint32_t licznik = 0;
static char auc_String[20] = „test!\r\n”;
static char* puc_String = (char*)auc_String ;
static void hardware_init( void )
{
// Configure UART
PMC->PMC_PCER0 = (1 << UART_PID) ;
// Assign UART pins to UART
UART_PIO->PIO_ABCDSR[0] &= ~(UART_RX_PIN | UART_TX_PIN) ;
UART_PIO->PIO_ABCDSR[1] &= ~(UART_RX_PIN | UART_TX_PIN) ;
UART_PIO->PIO_PDR = (UART_RX_PIN | UART_TX_PIN) ;
// Configure UART baudrate generator
UART->UART_BRGR = SystemCoreClock / (UART_SPEED * 16) ;
// Configure UART parity
UART->UART_MR = UART_MR_PAR_NO ;
// Enable UART TX + RX
UART->UART_CR = UART_CR_TXEN | UART_CR_RXEN ;
// Enable UART interrupt
UART->UART_IER = UART_IER_RXRDY ;
}
void send_string(char tekst[20] )
{
if (stan_rs232 == 0)
{
strcpy(auc_String,tekst);
stan_rs232 = 1;
}
if ( (UART->UART_SR & UART_SR_TXRDY) == UART_SR_TXRDY )
{
UART->UART_THR = *puc_String ;
puc_String++ ;
// Detect end of string, then reset pointer to start
if ( *puc_String == '\0′ )
{
puc_String = (char*)auc_String ;
stan_rs232 = 0;
}
}
}
void UART0_Handler( void )
{
volatile uint32_t uc_rx ;
if ( (UART->UART_SR & UART_SR_RXRDY) == UART_SR_RXRDY )
{
uc_rx = UART->UART_RHR ;
if ( (UART->UART_SR & UART_SR_TXRDY) == UART_SR_TXRDY )
{
UART->UART_THR = uc_rx ;
}
}
}
void SysTick_Handler( void )
{
if (stan_rs232 == 1)
{
send_string(„0”);
}
}
int main(void)
{
/* Initialize the SAM system */
// Uruchomienie nóżek od LCD
SystemInit();
hardware_init() ;
WDT->WDT_MR=WDT_MR_WDDIS; // Wyłączenie funkcji watchdog
PIOC->PIO_PER = (LEDA | LEDB); // Uruchomienie rejestru PIOC
PIOC->PIO_OER = (LEDA | LEDB); // Ustawia rejestr C jako wyjście
PIOC->PIO_PUDR = (LEDA | LEDB); // Wyłącza rezystroy podciągające
PIOC->PIO_SODR = LEDA;
PIOC->PIO_CODR = LEDB;
SysTick_Config( SystemCoreClock/100UL ) ;
NVIC_EnableIRQ( SysTick_IRQn ) ;
send_string(„Kwiatkowski Dawid\r\n”);
for(uint32_t i=0; i<200000;i++) { }
while (1)
{
PIOC->PIO_SODR = LEDA;
PIOC->PIO_CODR = LEDB;
for(uint32_t i=0; i<400000;i++) { }
send_string(„\r\n”);
PIOC->PIO_SODR = LEDB;
PIOC->PIO_CODR = LEDA;
for(uint32_t i=0; i<400000;i++) {}
int a = licznik ;
char arr[10] =”” ;
itoa(a,arr,10) ;
send_string(arr);
licznik++;
}
}