LPC1768. Подключение BT GPS к uart-у. Updated

Давно, когда у меня еще не было телефона с GPS, но был ноутбук, купил я себе такую вот вещь.



Вещь прикольная, полезная, но, сейчас не нужная и долго валялась у меня в столе. Сейчас встала у меня проблема получения точного времени и синхронизации нескольких устройств от головного. Способов решения проблемы я перепробовал несколько, оставил вариант ручной установки посредством веб-формы, но хотелось автоматизма. Когда нить я таки подключу контроллер к большому инету и допилю SNTP, но на текущий момент, в качестве временного/постоянного решения сойдет и GPS, тем более, он уже есть. Тут даже есть свои плюсы, полная бесплатность данных и аккумулятор в GPS, сохраняет идущие часы, даже если не видит спутников.

В качестве тестов, я подключил GPS от внешнего, зарядного разъема, в котором кроме + и — еще и присутствуют заместо USB D+, D-, обычные RX, TX, уровня +3.3 вольта. Подключил к UART3 на скорости 38400 и вывожу уже готовое время по UART0.


#include "LPC17xx.h"
#include "stdio.h"
#include "string.h"

#define BUFSIZE		0x80

uint32_t UART3Count = 0;

uint8_t *c;

uint8_t CTime[7];
uint8_t TStatus[2];

uint8_t IRQbuf[BUFSIZE];
uint8_t GPSbuf[BUFSIZE];

void Delay (uint32_t counter) 
{  
  while (counter--);
}

void Delay_ms (uint16_t ms) 
{  
	const uint16_t i = 12000;
	while (ms)
	{
	Delay (i);
	ms--;
	}
}

int UART_putChar (uint8_t ch) 
{
	while (!(LPC_UART0->LSR & 0x20));
	return (LPC_UART0->THR = ch);
}

void UART_putString (uint8_t *s) 
{
	while (*s != 0) 
	{
		UART_putChar(*s++);
	}
}

void DeInitUart0 (void)
{
	LPC_SC->PCONP &= ~(1<<3);
	LPC_PINCON->PINSEL0 &= ~(3 << 4);
        LPC_PINCON->PINSEL0 &= ~(3 << 6); 
}

void DeInitUart3 (void)
{
	LPC_SC->PCONP &= ~(1<<25);
	LPC_PINCON->PINSEL0 &= ~(3 << 0);  
        LPC_PINCON->PINSEL0 &= ~(3 << 2);
}

void InitUart0_115200 (void)
{
	DeInitUart0 ();

	LPC_SC->PCONP |= (1<<3);
	LPC_PINCON->PINSEL0 |= (1 << 4);	
        LPC_PINCON->PINSEL0 |= (1 << 6);

	LPC_UART0->LCR    = 0x83;         
	LPC_UART0->DLL    = 9;           
	LPC_UART0->FDR    = 0x21;     
	LPC_UART0->DLM    = 0;              
	LPC_UART0->LCR    = 0x03;        
}

void InitUart3_38400 (void)
{
	DeInitUart3 ();

	LPC_SC->PCONP |= (1<<25);
	LPC_PINCON->PINSEL0 |= (2 << 0);  
        LPC_PINCON->PINSEL0 |= (2 << 2);   

	LPC_UART3->LCR    = 0x83;          
	LPC_UART3->DLL    = 26;           
	LPC_UART3->FDR    = 0x21;          
	LPC_UART3->DLM    = 0;            
	LPC_UART3->LCR    = 0x03;          
	LPC_UART3->FCR	   = 0x07;		
	NVIC_EnableIRQ(UART3_IRQn);
	LPC_UART3->IER = 0x07;
}

void UART3_IRQHandler (void) 
{
	uint8_t IIRValue, LSRValue;
	uint8_t Dummy = 0;
	
	IIRValue = LPC_UART3->IIR;
    
	IIRValue >>= 1;		
	IIRValue &= 0x07;			
 
	if ( IIRValue == 0x02 )
	{
		IRQbuf[UART3Count] = LPC_UART3->RBR;
		UART3Count++;
		if ( UART3Count == BUFSIZE )
		{
			UART3Count = 0;		
		}				
	}
	else
	{
		Dummy = LPC_UART3->RBR;							
		return;
	}
}

int main (void)
{
	SystemInit ();
	InitUart0_115200 ();
	InitUart3_38400 ();
	UART_putString ("Starting\n\n");

	while (1)
	{
		Delay_ms (5000);
	
		strncpy(GPSbuf, IRQbuf, BUFSIZE);
		c = strstr(GPSbuf, "$GPRMC");
		strncpy(CTime, c+7, 6);
		strncpy(TStatus, c+18, 1);
		switch (TStatus[0])
		{
			case 0x56: UART_putString ("No trust:  ");
			case 0x41: UART_putString ("Trust:  ");
			break;
		}
		UART_putString (CTime);
		UART_putString ("\n\n");
	}	
}


Изменил код. Теперь это RTOS. Время берется и синхронизируется с модулем GPS раз в 5 секунд. Время и дата выводится на LCD и шлется на UART0 в таком виде:

Starting…

LEDs Inited

RTC Inited

SerNr: 0x146D3300 BlockNr:0x001E0000 RdLen: 0x0400 WrLen: 0x0400

2012839936 bytes free.

SD/MMC Inited

TCP/IP Inited

OS Starting…

Task — TIMER_HTTP Started
Task — GPS_HTTP Started
Task — LCD_PRINT Started
Task — UART0_PRINT Started
Task — LIFE_LED Started
Task — HTTP Started

OS Started

10/05/2011 20:15:05


#include "LPC17xx.h"
#include "RTL.h"
#include "File_Config.h"
#include "stdio.h"
#include "string.h"

#define EVT_RTC_SEC 0x0100
#define EVT_LCD_PRINT 0x0101
#define EVT_UART0_PRINT 0x0102
#define EVT_LIFE_LED 0x0103

#define IER_RBR		0x01
#define IER_THRE	0x02
#define IER_RLS		0x04

#define IIR_PEND	0x01
#define IIR_RLS		0x03
#define IIR_RDA		0x02
#define IIR_CTI		0x06
#define IIR_THRE	0x01

#define LSR_RDR		0x01
#define LSR_OE		0x02
#define LSR_PE		0x04
#define LSR_FE		0x08
#define LSR_BI		0x10
#define LSR_THRE	0x20
#define LSR_TEMT	0x40
#define LSR_RXFE	0x80

#define BUFSIZE		0x100

uint32_t UART3Count = 0;
uint8_t UART3TxEmpty = 1;
uint32_t UART3Status;
uint8_t IRQbuf[BUFSIZE];
uint8_t GPSbuf[BUFSIZE]; 

const unsigned long led_mask[] = { 1UL<<23 };

uint64_t tcp_stack[1024/8];
uint64_t lcd_print_stack[1024/8];
uint64_t gps_print_stack[1024/8];

uint32_t retv;
uint8_t outBuf[100];

uint8_t PrintTime[8];
uint8_t PrintDate[10];

MMCFG SDCardCfg;

typedef struct {
    uint32_t RTC_Sec; 
    uint32_t RTC_Min;  
    uint32_t RTC_Hour;  
    uint32_t RTC_Mday;
    uint32_t RTC_Mon;    
    uint32_t RTC_Year;  
    uint32_t RTC_Wday; 
    uint32_t RTC_Yday;  
} RTCTime;

RTCTime CurrentTime;
RTCTime GPSTime;
uint8_t TStatus[2];
uint32_t MaxYear = 2020;
uint32_t MinYear = 2010;
uint32_t CurYear;
uint32_t CurMon;
uint32_t CurDay;

OS_TID t_GPS_TIME;
OS_TID t_UART0_PRINT;
OS_TID t_LCD_PRINT;
OS_TID t_LIFE_LED;
OS_TID t_TIMER_HTTP;
OS_TID t_HTTP;

void Delay (uint32_t counter) 
{  
  while (counter--);
}

void InitLEDs (void)
{
	LPC_GPIO1->FIODIR = (1<<23);
}

void LEDon (unsigned int num)
{
	LPC_GPIO1->FIOPIN |= led_mask[num];
}

void LEDoff (unsigned int num)
{
	LPC_GPIO1->FIOPIN &= ~led_mask[num];
}

void RTCSetTime (RTCTime Time)
{
	LPC_RTC->SEC = Time.RTC_Sec;
	LPC_RTC->MIN = Time.RTC_Min;
	LPC_RTC->HOUR = Time.RTC_Hour;
	LPC_RTC->DOM = Time.RTC_Mday;
	LPC_RTC->DOW = Time.RTC_Wday;
	LPC_RTC->DOY = Time.RTC_Yday;
	LPC_RTC->MONTH = Time.RTC_Mon;
	LPC_RTC->YEAR = Time.RTC_Year;   
}

RTCTime RTCGetTime (void)
{
	RTCTime LocalTime;
 
	LocalTime.RTC_Sec = LPC_RTC->SEC;
	LocalTime.RTC_Min = LPC_RTC->MIN;
	LocalTime.RTC_Hour = LPC_RTC->HOUR;
	LocalTime.RTC_Mday = LPC_RTC->DOM;
	LocalTime.RTC_Wday = LPC_RTC->DOW;
	LocalTime.RTC_Yday = LPC_RTC->DOY;
	LocalTime.RTC_Mon = LPC_RTC->MONTH;
	LocalTime.RTC_Year = LPC_RTC->YEAR;
	return ( LocalTime );   
}

void RTC_IRQHandler (void)
{
	LPC_RTC->ILR |= 0x01;
}

void DeInitRTC (void)
{
	LPC_SC->PCONP &=~(1 << 9);
}

void InitRTC (void)
{
	DeInitRTC ();
	LPC_SC->PCONP |= (1 << 9);
	if ( LPC_RTC->RTC_AUX & (0x1<<4) )
	{
		LPC_RTC->RTC_AUX |= (0x1<<4);
	}
	LPC_RTC->AMR = 0;
	LPC_RTC->CIIR = 1; 
	LPC_RTC->CCR = 0x10;
	LPC_RTC->CCR |= 0x01;
	//NVIC_EnableIRQ(RTC_IRQn) ;
}

void RTCStart (void)
{
	LPC_RTC->CCR |= 0x01;
}

void RTCStop (void)
{  
	LPC_RTC->CCR &= ~0x01;
} 

void WriteByte4 (uint32_t b)
{
	LPC_GPIO2->FIODIR |= 0x3F;
	LPC_GPIO2->FIOCLR = 0xF; 
	LPC_GPIO2->FIOSET = (b & 0xF);
	LPC_GPIO2->FIOSET = 0x20;
	Delay (800);
	LPC_GPIO2->FIOCLR = 0x20;
	Delay (800);
	LPC_GPIO2->FIOSET = 0xF;  
}

void WriteByte (uint32_t b)
{
	WriteByte4 (b>>4);
	WriteByte4 (b);
}

void WriteCommand (uint32_t c)
{
	LPC_GPIO2->FIOCLR = 0x10;
	WriteByte (c);
}

void WriteData (uint32_t d)
{
	LPC_GPIO2->FIOSET = 0x10;
	WriteByte (d);
}

void ClrLCD (void)
{
	WriteCommand (0x01);
}

void InitLCD (void)
{
	Delay(10000000);
	LPC_GPIO2->FIODIR |= 0x3F;
	LPC_GPIO2->FIOCLR = 0x1F; 
	WriteByte4(0x30);
	Delay(10000000);
	WriteByte4(0x30);
	Delay(10000000);
	WriteByte4(0x30);
	Delay (100000);
	WriteByte4(0x20);
	Delay (100000);
	WriteCommand (0x20);
	Delay (100000);
	WriteCommand (0x28);
	Delay (100000);
	WriteCommand (0x0C);
	Delay (100000);
	WriteCommand (0x06);
	Delay (100000);
	WriteCommand (0x01);
	Delay (100000);
}

void LCDputc (uint8_t c)
{
	WriteData(c);	
}

void LCDputs (uint8_t *s)
{
	while (*s) 
	{
    	LCDputc (*s++);
	}	
}

LCDgotoxy (uint32_t x, uint32_t y) 
{ 
	uint32_t c;

	c = --x;
	if (--y) 
	{
		c |= 0x40;
	}
	WriteCommand (c | 0x80);  
}

void DeInitUart0 (void)
{
	LPC_SC->PCONP &= ~(1<<3);
	LPC_PINCON->PINSEL0 &= ~(3 << 4);
    LPC_PINCON->PINSEL0 &= ~(3 << 6); 
}

void DeInitUart3 (void)
{
        LPC_SC->PCONP &= ~(1<<25);
        LPC_PINCON->PINSEL0 &= ~(3 << 0);  
        LPC_PINCON->PINSEL0 &= ~(3 << 2);
}


void InitUart3_38400 (void)
{
        DeInitUart3 ();

        LPC_SC->PCONP |= (1<<25);
        LPC_PINCON->PINSEL0 |= (2 << 0);  
        LPC_PINCON->PINSEL0 |= (2 << 2); 
        LPC_UART3->LCR    = 0x83;          
        LPC_UART3->DLL    = 26;           
        LPC_UART3->FDR    = 0x21;          
        LPC_UART3->DLM    = 0;            
        LPC_UART3->LCR    = 0x03;          
        LPC_UART3->FCR     = 0x07;              
        NVIC_EnableIRQ(UART3_IRQn);
        LPC_UART3->IER = 0x07;
}

void UART3_IRQHandler (void) 
{
        uint8_t IIRValue, LSRValue;
        uint8_t Dummy = 0;
        
        IIRValue = LPC_UART3->IIR;
    
        IIRValue >>= 1;         
        IIRValue &= 0x07; 
		
		if ( IIRValue == IIR_RLS )	
  		{
			LSRValue = LPC_UART3->LSR;
			if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
			{  	  
	  			UART3Status = LSRValue;
	  			Dummy = LPC_UART3->RBR;						
	  			return;
			}
			if ( LSRValue & LSR_RDR )			
			{ 	  
	  			IRQbuf[UART3Count] = LPC_UART3->RBR;
                UART3Count++;
                if ( UART3Count == BUFSIZE )
                {
                        UART3Count = 0;         
                } 	
			}
  		}
  		else if ( IIRValue == IIR_RDA )	
  		{		
			IRQbuf[UART3Count] = LPC_UART3->RBR;
                UART3Count++;
                if ( UART3Count == BUFSIZE )
                {
                        UART3Count = 0;         
                } 
  		}
  		else if ( IIRValue == IIR_CTI )	
  		{
			UART3Status |= 0x100;	
  		}
  		else if ( IIRValue == IIR_THRE )
  		{  
			LSRValue = LPC_UART3->LSR;									
			if ( LSRValue & LSR_THRE )
			{
	  			UART3TxEmpty = 1;
			}
			else
			{
	 			 UART3TxEmpty = 0;
			}
  		}
}


void InitUart0_115200 (void)
{
	DeInitUart0 ();
	LPC_SC->PCONP |= (1<<3);
	LPC_PINCON->PINSEL0 |= (1 << 4);             	
    LPC_PINCON->PINSEL0 |= (1 << 6);
	LPC_UART0->LCR    = 0x83;                          
	LPC_UART0->DLL    = 9;                             
	LPC_UART0->FDR    = 0x21;                          
	LPC_UART0->DLM    = 0;                           
	LPC_UART0->LCR    = 0x03;                          
}

int UART_putChar0 (uint8_t c) 
{
	while (!(LPC_UART0->LSR & 0x20));
	return (LPC_UART0->THR = c);
}

void UART_putString0 (uint8_t *s) 
{
	while (*s != 0) 
	{
		UART_putChar0 (*s++);
	}
}

__task void f_GPS_TIME (void) 
{
	uint8_t SecStr[3];
	uint8_t MinStr[3];
	uint8_t HourStr[3];
	uint8_t DayStr[3];
	uint8_t MonStr[3];
	uint8_t YearStr[5];
	uint32_t SecD;
	uint32_t MinD;
	uint32_t HourD;
	uint32_t DayD;
	uint32_t MonD;
	uint32_t YearD;	
	uint8_t *c;
	uint8_t *s;
	uint8_t n = 0;	

	while (1)
	{
	strncpy(GPSbuf, IRQbuf, BUFSIZE);
	c = strstr (GPSbuf, "$GPRMC");
	s = strchr (c , 0x2C);

	strncpy(HourStr, s+1, 2);
	strncpy(MinStr, s+3, 2);
	strncpy(SecStr, s+5, 2);
	strncpy(TStatus, s+12, 1);
	SecD = atoi(SecStr);
	if ((SecD != NULL) || (SecD >= 0) || (SecD < 60))
	{
		GPSTime.RTC_Sec = SecD;	
	}
	MinD = atoi(MinStr);
	if ((MinD != NULL) || (MinD >= 0) || (MinD < 60))
	{
		GPSTime.RTC_Min = MinD;
	}
	HourD = atoi(HourStr);
	if ((HourD != NULL) || (HourD >= 0) || (HourD < 24))
	{
		HourD = HourD + 4;
		if (HourD > 24)
		{			
			GPSTime.RTC_Hour = (24 - HourD);
		}
		else
		{
			GPSTime.RTC_Hour = HourD;
		} 	
	}
	n = 0;
	while (n<8)
	{ 
   	s = strchr (s+1, 0x2C);
	n++;
	}
	strncpy(DayStr, s+1, 2);
	strncpy(MonStr, s+3, 2);
	strncpy(YearStr, s+5, 2);
	DayD = atoi(DayStr);
	if ((DayD != NULL) || (31 <=DayD > 0))
	{
		GPSTime.RTC_Mday = DayD;
	}
	MonD = atoi(MonStr);
	if ((MonD != NULL) || (12 <= MonD > 0))
	{
		GPSTime.RTC_Mon = MonD;
	}
	YearD = (atoi(YearStr) + 2000);
	if ((YearD != NULL) || (2020 < YearD > 2010))
	{
		GPSTime.RTC_Year = YearD;
	}
	RTCSetTime (GPSTime);
	
	os_dly_wait (1000);
	} 
}

__task void f_LCD_PRINT (void) 
{
	uint8_t i = 0;

	while (1) 
	{
		CurrentTime = RTCGetTime();
		sprintf(PrintTime, "%02d:%02d:%02d", CurrentTime.RTC_Hour, CurrentTime.RTC_Min, CurrentTime.RTC_Sec);
		sprintf(PrintDate, "%02d/%02d/%04d", CurrentTime.RTC_Mday, CurrentTime.RTC_Mon, CurrentTime.RTC_Year);
		
		LCDgotoxy (4,1);
		LCDputs (PrintDate);		
		LCDgotoxy (5,2);
		LCDputs (PrintTime);
		if (i)
		{
		LCDgotoxy (10,2);
		LCDputs (" ");
		}
		i=!(i);
		os_evt_set (EVT_UART0_PRINT, t_UART0_PRINT);
		os_dly_wait (100);
	}
}

__task void f_UART0_PRINT (void) 
{
	while (1) 
	{
		os_evt_wait_or (EVT_UART0_PRINT, 0xffff);
		
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		UART_putChar0 (0x08);
		
		UART_putString0 (PrintDate);
		UART_putString0 ("  ");
		UART_putString0 (PrintTime);
								
		os_evt_set (EVT_LIFE_LED, t_LIFE_LED);
	}
}

__task void f_LIFE_LED (void) 
{
	uint8_t i = 1;
	while (1) 
	{
		os_evt_wait_or (EVT_LIFE_LED, 0xffff); 
		if (i)
		{
			LEDon(0);
			i=!i;
		}
		else
		{
			LEDoff(0);
			i=!i;
		}        
    }
}

__task void f_TIMER_HTTP (void) 
{
	os_itv_set (10);
	while (1) 
	{
		os_itv_wait ();
		timer_tick ();
	}
}

__task void f_HTTP (void) 
{
	while (1) 
	{
		main_TcpNet ();
		os_tsk_pass ();
	}
}

__task void init (void) 
{	
	os_tsk_prio_self (100);	
	
	t_TIMER_HTTP = os_tsk_create (f_TIMER_HTTP, 99);
	UART_putString0 ("\nTask - TIMER_HTTP Started\n");
	t_GPS_TIME = os_tsk_create_user (f_GPS_TIME, 50, &gps_print_stack, sizeof(gps_print_stack));
	UART_putString0 ("Task - GPS_HTTP Started\n");
	t_LCD_PRINT = os_tsk_create_user (f_LCD_PRINT, 4, &lcd_print_stack, sizeof(lcd_print_stack));
	UART_putString0 ("Task - LCD_PRINT Started\n");
	t_UART0_PRINT = os_tsk_create (f_UART0_PRINT, 3);
	UART_putString0 ("Task - UART0_PRINT Started\n");
	t_LIFE_LED = os_tsk_create (f_LIFE_LED, 2);
	UART_putString0 ("Task - LIFE_LED Started\n");
	t_HTTP = os_tsk_create_user (f_HTTP, 1, &tcp_stack, sizeof(tcp_stack));
	UART_putString0 ("Task - HTTP Started\n");
	
	UART_putString0 ("\nOS Started\n\n"); 
	os_tsk_delete_self (); 
}



int main (void)
{
	SystemInit ();
	InitUart0_115200 ();
	InitUart3_38400 ();
	UART_putString0 ("\n\nStarting ... \n\n");

	InitLCD ();
	LCDgotoxy (2,1);
	LCDputs ("Starting ...");

	InitLEDs ();
	UART_putString0 ("LEDs Inited\n");

	InitRTC ();
	CurrentTime = RTCGetTime();
	CurYear = CurrentTime.RTC_Yday; 
	CurMon = CurrentTime.RTC_Mon;
	CurDay = CurrentTime.RTC_Mday;
	if (MinYear > CurYear)
	{
		
		LPC_RTC->SEC = 0;
		LPC_RTC->MIN = 0;
		LPC_RTC->HOUR = 1;
		LPC_RTC->DOM = 1;
		LPC_RTC->MONTH = 1;
		LPC_RTC->YEAR = 2011; 
		
	}
	if (MaxYear < CurYear)
	{
		
		LPC_RTC->SEC = 0;
		LPC_RTC->MIN = 0;
		LPC_RTC->HOUR = 1;
		LPC_RTC->DOM = 1;
		LPC_RTC->MONTH = 1;
		LPC_RTC->YEAR = 2011; 
		
	}
	if (CurMon ==0)
	{
		
		LPC_RTC->SEC = 0;
		LPC_RTC->MIN = 0;
		LPC_RTC->HOUR = 1;
		LPC_RTC->DOM = 1;
		LPC_RTC->MONTH = 1;
		LPC_RTC->YEAR = 2011; 
		
	}
		if (CurDay ==0)
	{
		
		LPC_RTC->SEC = 0;
		LPC_RTC->MIN = 0;
		LPC_RTC->HOUR = 1;
		LPC_RTC->DOM = 1;
		LPC_RTC->MONTH = 1;
		LPC_RTC->YEAR = 2011; 
		
	}
	
	UART_putString0 ("\nRTC Inited\n\n");

	while ((retv = finit ()) != 0) 
	{    
    	if (retv == 1) 
		{
			UART_putString0 ("SD/MMC Init Failed\n");
			UART_putString0 ("Insert Memory card and press key...\n");
		}
    	else 
		{
			UART_putString0 ("SD/MMC Card is Unformatted\n");
			if (fformat ("M:SD_CARD") != 0) 
			{
    			UART_putString0 ("SD Memory Card format failed.\n");
  			}
  			else 
			{
    			UART_putString0 ("SD Memory Card formatted.\n");
  			}

		}
	}

	mmc_read_config (&SDCardCfg);
	sprintf (outBuf, "SerNr:  0x%08X", SDCardCfg.sernum);
  	UART_putString0 (outBuf);
  	sprintf (outBuf, " BlockNr:0x%08X", SDCardCfg.blocknr);
  	UART_putString0 (outBuf);
  	sprintf (outBuf, " RdLen:  0x%04X", SDCardCfg.read_blen);
  	UART_putString0 (outBuf);
  	sprintf(outBuf, " WrLen:  0x%04X", SDCardCfg.write_blen);
  	UART_putString0 (outBuf);
	sprintf(outBuf, "\n\n%d bytes free.\n", ffree("M:"));
	UART_putString0 (outBuf);
	UART_putString0 ("\nSD/MMC Inited\n");

	init_TcpNet ();
	UART_putString0 ("\nTCP/IP Inited\n");

	UART_putString0 ("\nOS Starting ...\n");
	ClrLCD (); 
	os_sys_init(init);

}



  • +2
  • 30 апреля 2011, 12:46
  • lexanet

Комментарии (26)

RSS свернуть / развернуть
Простите, а с какой точностью Вам надо синхронизировать время? Этот способ Вам вряд ли даст точность больше 0.1с. Для нормальной точности в GPS чипах есть выход 1PPS — попробуйте разобрать приёмник и найти его. У третьего сирфа точность 1мкс.
0
Мне вполне хватит точности на основном устройстве до минут, а оно уже разошлет на все остальные и синхронизирует до секунды.
0
А можно выложить исходник с RTOS?
P/S/ Купил платку с LPC1768 и столкнулся с проблемой почти полного отсутствия материла по нему.
0
  • avatar
  • Jek
  • 25 мая 2012, 12:48
В knowlegebase у NXP достаточно инфы. Правда по англицки :)
0
Тфу ты. Неправильно выразился. Мало информации по Kail-у. Хотел было купить книгу Микроконтроллеры ARM7 семейств LPC2300/2400. Вводный курс разработчика + CD да пока думал, уже успел скан книги скачать )). Потом нашёл 32-битные микроконтроллеры NXP с ядром Cortex-M3 семейства LPC17xx. Полное руководство. Но она только готовится к печати (((. Вобщем гдебы почитать про Среду разработки Keil uVision4??
0
В F1.
0
в родном хелпе и на сайте keil.com. не? ;)
а на русском и не встречал даже…
главное редькина не читай. аппетит испортишь. ;)
0
Дык в том то и прикол что на русском хочется… хотя бегло читаю на англ ( пропуская иногда 1-3 слов ^_^). А насчёт книжки, она как бы есть и как бы нет (((((
dodeca.ru/books/228/
0
забудь сразу. даже не читая можно сказать, что Г редкое будет. на аффтара посмотри.
0
А чем оный автор так отличился?
Я из похожего тока буржуя какого-то читал, про LPC2000. Тот вроде вполне толковый.
0
сомнительного «качества» компиляция переводов док с явными ошибками и просто жуткие «примеры кода». на электрониксе просто громадная тема посвящена предыдущему «труду» еще про SAM7.
а тревор мартин (угадал? ;) ) нормально пишет.
0
Да, скорее всего. Синенькая такая книга.
0
Я сильно сомневаюсь, что там есть углубленная информация по средствам uV (например, по программированию эмуляторов внешней среды для отладчика — ЕМНИП там такое есть). Обычно ограничиваются «вот кнопка открыть, вот кнопка скомпилировать, а тут отобразится текст примера, когда вы его откроете».
А в остальном там и так все очевидно, IDE она и есть IDE.
0
Ну в принципе да, оно и так всё понятно. Но по началу после CodeVisionAVR структуры типа LPC_SC->PCONP |= (1 << 21); или LPC_GPIO2->FIOPIN = byte >> 8; вгоняли в полный ступор, но потом как то привык…
0
дык, эттааа… оно к кейлу (почти) никакого отношения не имеет. ;)
0
Это CMSIS, детка! В плане кейл-специфик изучать надо скорее стартап файлы и синтаксис инлайн(и не очень инлайн)-асма.
0
ну дык блин если есть в кайле, значит компилятор эту фигню понимает, следовательно это хоть как то должно относится к кайлу. А так, даже просто светодиод вкл-выкл это надо что то как то так
LPC_GPIO2->FIOPIN |= led_mask[num];
Изучаю лпс по тем примерам какие дали…
0
оно и в иаре есть, и в гцц.
это относится к Сям, а не к конкретному компилятору.
букварь (K&R) в помощь.
0
K&R 3-е издание
более свежих в онлайне не видел.
0
Лучший учебник по KEIL-у — это его собственные примеры, которых море в папке: C:\Keil\ARM\Boards\Keil. Конкретно для LPC1768 — C:\Keil\ARM\Boards\Keil\MCB1700. Не ищите, никаких книг не надо. Там и работа с периферией, и работа с кейловской RTOS. Никакая книга так подробно и по шагам не раскажет как работать с камнем.
0
То Jek. Не совсем понял Вашей просьбы. Какой исходник Вы просите?
0
Да пытался повторить сабж с RTOS. Вроде все библиотеки закинул, но не компилится… в общем сижу разбираю рабочие примеры )
0
в общем сижу разбираю рабочие примеры )
это лучший путь к пониманию. ;)
благо у кейла примеры вполне адекватны и понятны…
0
И отлично закомментированы.
0
Какая ошибка?
0
всё бы ничего, но после какого то момента плата начинает сильно глючить… Например, прошил часы + glcd, сбросил плату кнопкой ресет, всё ок, через 5 мину нажимаю ресет, всё сбрасывается и часы не идут, делаю выкл\вкл питания (батарейки на борту нету) буфер заполняется фигнёй и не меняется, потом плата вообще может не запуститься… в общем хоть китайская платка немного глючная оказалась ((( плюс у джостика на плате 2 позиции не работают… и как я полагаю SD тоже ((((((((
0
  • avatar
  • Jek
  • 25 мая 2012, 21:50
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.