Файл: Embedded system development and labs for ARM (R. Muresan, 2005).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.06.2025

Просмотров: 2355

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Embedded Systems Development and Labs; The English Edition

int Uart_GetIntNum(void)

{

char str[30]; char *string=str; int base=10;

int minus=0; int lastIndex; int result=0; int i;

Uart_GetString(string);

if(string[0]=='-')

{

minus=1;

string++;

}

if(string[0]=='0' && (string[1]=='x' || string[1]=='X'))

{

base=16;

string+=2;

}

lastIndex=strlen(string)-1;

if( string[lastIndex]=='h' || string[lastIndex]=='H' )

{

base=16;

string[lastIndex]=0; lastIndex--;

}

if(base==10)

{

result=atoi(string); result=minus ? (-1*result):result;

}

else

{

for(i=0;i<=lastIndex;i++)

{

175

Embedded Systems Development and Labs; The English Edition

if(isalpha(string[i]))

{

if(isupper(string[i])) result=(result<<4)+string[i]-'A'+10;

else

result=(result<<4)+string[i]-'a'+10;

}

else

{

result=(result<<4)+string[i]-'0';

}

}

result=minus ? (-1*result):result;

}

return result;

}

Exercises

(1)Write a program that displays the characters received from serial port on the LCD.

(2)Based on the sample program in this Lab, add an error detection function.

4.5 Real Time Clock (RTC) Lab

4.5.1 Purpose

● Get familiar with the hardware functionally of the Real Time Clock and its programming functions. ● Master S3C44B0X RTC programming methods.

4.5.2 Lab Equipment

● Hardware: Embest S3CEV40 hardware platform, Embest Standard/Power Emulator, PC. ● Software: Embest IDE 2003, Windows 98/2000/NT/XP operation system.

4.5.3 Content of the Lab

Learn the functionality and the usage of the S3CEV40 RTC module. Write programs that use the RTC. Modify the setting of time and date. Display the current system clock time through the serial port.

4.5.4 Principles of the Lab 1. Real Time Clock

The RTC unit is a specific module (or separate IC) that can provide date/time, data storage, and other functions. It is often used as timer resource and parameter storage circuit in computer systems. The communication

176

Embedded Systems Development and Labs; The English Edition

between the CPU and the RTC normally uses simple serial protocols such as IIC, SPI, MICROWARE, CAN, etc. These serial ports have 2-3 lines that include synchronization and synchronism.

2. S3C44B0X Real-Time Timer

The RTC (Real Time Clock) unit is a peripheral device inside the S3C44B0X. The function diagram is shown in Figure 4-12. The backup battery can operate the RTC (Real Time Clock) unit while the system power is off. The RTC can transmit 8-bit data to CPU as BCD (Binary Coded Decimal) values using the STRB/LDRB ARM operation. The data include second, minute, hour, date, day, month, and year. The RTC unit works with an external 32.768 KHz crystal and also can perform the alarm function.

Figure 4-12 S3CEV40 RTC Module Function Diagram

The following are the features of the RTC (Real Time Clock) unit:

BCD number: second, minute, hour, date, day, month, year

Leap year generator

Alarm function: alarm interrupt or wake-up from power down mode.

Year 2000 problem is removed.

Independent power pin (VDDRTC)

Supports millisecond tick time interrupt for RTOS kernel time tick.

Round reset function

1) Read/Write Registers

Bit 0 of the RTCCON register must be set in order to read and write the register in RTC block. To display the sec., min., hour, date, month, and year, the CPU should read the data in BCDSEC, BCDMIN, BCDHOUR, BCDDAY, BCDDATE, BCDMON, and BCDYEAR registers, respectively, in the RTC block. However, a one second deviation may exist because multiple registers are read. For example, suppose that the user reads the registers from BCDYEAR to BCDMIN, and the result is is 1959(Year), 12(Month), 31(Date), 23(Hour) and

177


Embedded Systems Development and Labs; The English Edition

59(Minute). If the user reads the BCDSEC register and the result is a value from 1 to 59(Second), there is no problem, but, if the result is 0 sec., the year, month, date, hour, and minute may be changed to 1960(Year), 1(Month), 1(Date), 0(Hour) and 0(Minute) because of the one second deviation that was mentioned. In this case (when BCDSEC is zero), the user should re-read from BCDYEAR to BCDSEC.

2) Backup Battery Operation

The RTC logic can be driven by the backup battery, which supplies the power through the RTCVDD pin into RTC block, even if the system’s power is off. When the system is off, the interfaces of the CPU and RTC logic are blocked, and the backup battery only drives the oscillator circuit and the BCD counters in order to minimize power dissipation.

3) Alarm Function

The RTC generates an alarm signal at a specified time in the power down mode or normal operation mode. In normal operation mode, the alarm interrupt (ALMINT) is activated. In the power down mode the power management wakeup (PMWKUP) signal is activated as well as the ALMINT. The RTC alarm register, RTCALM, determines the alarm enable/disable and the condition of the alarm time setting.

4) Tick Time Interrupt

The RTC tick time is used for interrupt request. The TICNT register has an interrupt enable bit and the count value for the interrupt. The count value reaches '0' when the tick time interrupt occurs. Then the period of interrupt is as follow:

Period = (n+1 ) / 128 second

n : Tick time count value (1-127)

This RTC time tick may be used for RTOS (real time operating system) as kernel time tick. If the RTC is used to generate the time ticks, the time related function of RTOS would always be synchronized in real time.

5) Round Reset Function

The round reset function can be performed by the RTC round reset register, RTCRST. The round boundary (30, 40, or 50 sec) of the second carry generation can be selected, and the second value is rounded to zero in the round reset. For example, when the current time is 23:37:47 and the round boundary is selected to 40 sec, the round reset changes the current time to 23:38:00.

NOTE 1: All RTC registers have to be accessed by the byte unit using the STRB, LDRB instructions or char type pointer.

NOTE 2: For a complete description of the registers bits please check the “S3C44BOX User’s Manual”.

4.5.5 Lab Design

1. Hardware Circuit Design

The real-time peripheral circuit is shown in Figure 4-13.

178

Embedded Systems Development and Labs; The English Edition

EXTAL1

VDD33

CRYSTAL

D9

XTAL1

32.768k

1N4148

X2

R72

10K

VDDRTC

C47

C46

15P

15P

GND

BAT1

C54

104

BATTERY

GND

Figure 4-13 Real-Time Peripheral Circuit

2. Software Design

1) Timer Settings

The timer setting program implements functions such as detecting timer work status, verifying the setup data. For detailed implementations, please refer to Section 4.5.7 “Timer Setting Control Program” and to the “S3C44BOX User’s Manual”.

2) Time Display

The time parameters are transferred through the serial port 0 to the hyper terminal. The display content includes year, month, day, hour, minute, second. The parameters are transferred as BCD code. The users can use the serial port communication program (refer to Section 4.4 “Serial Port Communication Lab”) to transfer the time parameters.

The following presents the C code of the RTC display control program:

void Display_Rtc(void)

{

Read_Rtc();

Uart_Printf(" Current Time is %02x-%02x-%02x %s",year,month,day,date[weekday]); Uart_Printf(" %02x:%02x:%02x\r",hour,min,sec);

}

void Read_Rtc(void)

{

//Uart_Printf("This test should be excuted once RTC test(Alarm) for RTC initialization\n"); rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset

while(1)

{

179


Embedded Systems Development and Labs; The English Edition

if(rBCDYEAR == 0x99) year = 0x1999;

else

year = 0x2000 + rBCDYEAR; month=rBCDMON; day=rBCDDAY; weekday=rBCDDATE; hour=rBCDHOUR; min=rBCDMIN; sec=rBCDSEC;

if(sec!=0)

break;

}

rRTCCON = 0x0; // R/W disable(for power consumption), 1/32768, Normal(merge), No reset

}

4.5.6 Operation Steps

1)Prepare the Lab environment. Connect the Embest Emulator to the target board. Connect the target board UART0 to PC serial port using the serial cable that comes with the Embest development system.

2)Run the PC Hyper Terminal (set to 115200 bits per second, 8 data bits, none parity, 1 stop bits, none flow control).

3) Connect the Embest Emulator to the target board. Open the RTC_test.ews project file located in …\EmbestIDE\Examples\Samsung\S3CEV40\RTC_test directory. After compiling and linking, connect to the target board and download the program.

(4)Watch the main window of the hyper terminal, the following information is shown: RTC Working now. To set time (Y/N)?: y

(5)User can select “y” for timer settings. When a wrong item is introduced, a prompt will ask to input it again. The prompt information is as following:

Current day is (200d, 1e, 27, TUE). To set day (yy-mm-dd w): 2003-11-07 5

Current time is (1f:08:18). To set time (hh : mm : ss) : 15 : 10 : 00

(6)At last the hyper terminal will display:

2003,11,07,FRI

15:10:14

(7) After understanding and learning the contents of the lab perform the Lab exercises.

4.5.7 Sample Programs

1. Environments and Function Declare char RTC_ok;

int year;

int month,day,weekday,hour,min,sec;

180


Embedded Systems Development and Labs; The English Edition

int Test_Rtc_Alarm(void); void Rtc_Init(void);

void Read_Rtc(void); void Display_Rtc(void); void Test_Rtc_Tick(void);

void Rtc_Int(void) __attribute__ ((interrupt ("IRQ"))); void Rtc_Tick(void) __attribute__ ((interrupt ("IRQ")));

2.Time Tick Control Program void Test_Rtc_Tick(void)

{

pISR_TICK=(unsigned)Rtc_Tick; rINTMSK=~(BIT_GLOBAL|BIT_TICK); sec_tick=1;

rTICINT = 127+(1<<7); //START

}

void Rtc_Tick(void)

{

rI_ISPC=BIT_TICK; Uart_Printf("\b\b\b\b\b\b\b%03d sec",sec_tick++);

}

3.Timer Configuration Control Program

char check_RTC(void)

{

char RTC_alr = 0; /* //check RTC code

char yn = 0x59;

while((yn ==0x0d)|(yn ==0x59)|(yn ==0x79)|(RTC_alr ==0))

{

Uart_Printf("\n RTC Check(Y/N)? ");

yn = Uart_Getch();

if((yn == 0x4E)|(yn == 0x6E)|(yn == 0x59)|(yn == 0x79)) Uart_SendByte(yn); if((yn == 0x0d)|(yn == 0x59)|(yn == 0x79))

{

RTC_alr = Test_Rtc_Alarm(); Display_Rtc();

}

else break;

181

Embedded Systems Development and Labs; The English Edition

if (RTC_alr) break;

}

*/

RTC_alr = Test_Rtc_Alarm(); Display_Rtc();

return RTC_alr;

}

char USE_RTC(void)

{

char yn,tmp,i,N09=1; char num0 = 0x30;//"0"; char num9 = 0x39;//"9"; char schar[] ={0,'-',' ',':'};

char sDATE[12];//xxxx-xx-xx x char sTIME[8];//xx:xx:xx

if(check_RTC())

{

Uart_Printf("\n RTC Working now. To set time(Y/N)? "); yn = Uart_Getch();

if((yn == 0x4E)|(yn == 0x6E)|(yn == 0x59)|(yn == 0x79)) Uart_SendByte(yn); if((yn == 0x0d)|(yn == 0x59)|(yn == 0x79)) //want to set time?

{

///////////////////////////////////////////////////////////////////////////////////

do{

Uart_Printf("\nCurrent day is (%04x,%02x,%02x, %s). To set day(yy-mm-dd w): "\ ,year,month,day,date[weekday]);

Uart_GetString(sDATE); if(sDATE[0] == 0x32)

{

if((sDATE[4] == schar[1] )&(sDATE[7] == schar[1] )&(sDATE[10] == schar[2] ))

{

if((sDATE[11] >0)|(sDATE[11] <8))

{

i=0; N09 = 0; while(i<12)

{

if((i !=4)|(i !=7)|(i !=10))

{

if((sDATE[i] < num0 )&(sDATE[i] > num9))

182

}
i++;

Embedded Systems Development and Labs; The English Edition

{N09 = 1; break; }

}

if(N09 == 0)

break;//all right

}

// if date 1 - 7

}

// if "-" or " "

}

// if 32 (21th century)

N09 = 1;

Uart_Printf("\n Wrong value!! To set again(Y/N)? ");

yn = Uart_Getch();

//want to set DATE again?

if((yn == 0x4E)|(yn == 0x6E)|(yn == 0x59)|(yn == 0x79)) Uart_SendByte(yn);

}while((yn == 0x0d)|(yn == 0x59)|(yn == 0x79));

if(N09 ==0)

{

rRTCCON

= 0x01;

// R/W enable, 1/32768, Normal(merge), No reset

rBCDYEAR = ((sDATE[2]<<4)|0x0f)&(sDATE[3]|0xf0);//->syear;

rBCDMON

= ((sDATE[5]<<4)|0x0f)&(sDATE[6]|0xf0);//->smonth;

rBCDDAY

= ((sDATE[8]<<4)|0x0f)&(sDATE[9]|0xf0);//->sday;

tmp

= ((sDATE[11]&0x0f)+1);

if(tmp ==8) rBCDDATE = 1;// SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7

else

rBCDDATE = tmp;

rRTCCON

= 0x00;

// R/W disable

}else Uart_Printf("\n\n Use Current DATE Settings.\n");

///////////////////////////////////////////////////////////////////////////////////

do{

Uart_Printf("\nCurrent time is (%02x:%02x:%02x). To set time(hh:mm:ss): "\ ,hour,min,sec);

Uart_GetString(sTIME);

if((sTIME[2] == schar[3] )&(sTIME[5] == schar[3]))

{

i=0; N09 = 0; while(i<8)

{

if((i !=2)|(i !=5))

{

if((sTIME[i] < num0 )&(sTIME[i] > num9)) { N09 = 1;

183


Embedded Systems Development and Labs; The English Edition

break; }

}

i++;

}

if(N09 == 0)

{

tmp = ((sTIME[0]<<4)|0x0f)&(sTIME[1]|0xf0); if((tmp >0)&(tmp <0x24))

{

sTIME[2] = tmp;//->shour;

tmp = ((sTIME[3]<<4)|0x0f)&(sTIME[4]|0xf0); if(tmp <=0x59)

{

sTIME[5] = tmp;//->smin;

tmp = ((sTIME[6]<<4)|0x0f)&(sTIME[7]|0xf0); if(tmp <=0x59)

break;//all right

}//if min < 59

}//if 0 < hour < 24

}//if num 0-9

}

N09 = 1;

Uart_Printf("\n Wrong value!! To set again(Y/N)? "); yn = Uart_Getch(); //want to set Time again?

if((yn == 0x4E)|(yn == 0x6E)|(yn == 0x59)|(yn == 0x79)) Uart_SendByte(yn); }while((yn == 0x0d)|(yn == 0x59)|(yn == 0x79));

if(N09 ==0)

{

rRTCCON

= 0x01;

// R/W enable, 1/32768, Normal(merge), No reset

rBCDHOUR = sTIME[2]; //->shour;

rBCDMIN

= sTIME[5]; //->smin;

rBCDSEC

= ((sTIME[6]<<4)|0x0f)&(sTIME[7]|0xf0); //->ssec;

rRTCCON

= 0x00;

// R/W disable

}else Uart_Printf("\n\n Use Current TIME Settings.\n"); }else{

Uart_Printf("\n Use Current Settings...\n"); return 1;

} /* end if want to set? */ }else{

Uart_Printf("\n Please check RTC or maybe it's Wrong. \n");

184

Embedded Systems Development and Labs; The English Edition

return 0;

} /* end if(check_RTC) */

}

4.5.8 Exercises

Write a program detecting RTC clock (alarm) function.

4.6 8-SEG LED Display Lab

4.6.1 Purpose

● Get familiar with LED display and its control method.

● Get better understanding of the memory access principles presented in the Section 4.1 Lab.

4.6.2 Lab Equipment

● Hardware: Embest S3CEV40 hardware platform, Embest Standard/Power Emulator, PC. ● Software: Embest IDE 2003, Windows 98/2000/NT/XP operation system.

4.6.3 Content of the Lab

Write a program that displays 0-9, A-F to the 8-SEG LED.

4.6.4 Principles of the Lab 1. 8-SEG LED

In embedded system, the 8-SEG LED is often used to display digitals and characters. The 8-SEG LED displays are simple and durable and offer clear and bright displays at low voltage.

1) Architecture

The 8-SEG LED consists of 8 irradiant diodes. 8-SEG LED can display all the numbers and part of English characters.

2) Types

The 8-SEG LED displays are of two types. One is the common anode type where all the anodes are connected together and the other is the common cathode type where all the cathodes are connected together.

3) Work Principles

Using the common anode type, when the control signal for one segment is low, the related LED will be lit. When a character needs to be displayed, a combination of LEDs must be on. Using the common cathode type, the LED will be on when the control signal is high.

The following is the commonly used character segment coding:

185