Frage

Ich muss ein Programm schreiben, um Echtzeituhr für die ARM -Architektur zu implementieren. Beispiel: LPC213X

Es sollte Stunde und Sekunden angezeigt. Ich habe keine Ahnung von Arm, also habe ich Probleme mit dem Einstieg.

Mein folgender Code funktioniert nicht

// ...

int main (void) {
    int hour=0;
    int min=0;
    int sec;
    init_serial(); /* Init UART */
    Initialize();
    CCR=0x11;
    PCONP=0x1815BE; 
    ILR=0x1;         //  Clearing Interrupt

    //printf("\nTime is %02d:%02x:%02d",hour,min,sec);

    while (1) { /* Loop forever */
    }
}

void Initialize()
{
VPBDIV=0x0;
//CCR=0x2; 
//ILR=0x3; 
HOUR=0x0;
SEC=0x0;
MIN=0x0;


ILR = 0x03; 
CCR = (1<<4) | (1<<0); 

VICVectAddr13 = (unsigned)read_rtc; 
VICVectCntl13 |= 0x20 | VIC_RTC; 
VICIntEnable |= (1 << VIC_RTC);

}
/* Interrupt Service Routine*/
__irq void read_rtc() 
{
int hour=0;
int min=0;
int sec;
ILR=0x1;         //  Clearing Interrupt
hour=(CTIME0 & MASKHR)>>16;
min= (CTIME0 & MASKMIN)>>8;
sec=CTIME0 & MASKSEC;

printf("\nTime is %02d:%02x:%02d",hour,min,sec);

//VICVectAddr=0xff;
VICVectAddr = 0;
}
War es hilfreich?

Lösung

Dies ist alles für den LPC2468. Wir haben auch eine SetTime -Funktion, aber ich möchte nicht die ganze Arbeit für Sie erledigen. ;) Wir haben benutzerdefinierte Registerdateien zur einfachen Zugriff. Wenn Sie sich jedoch das LPC -Handbuch ansehen, ist es offensichtlich, wo sie korrelieren. Sie müssen nur die Werte an den richtigen Ort verschieben und bitweise Operationen ausführen. Zum Beispiel:

#define RTC_HOUR       (*(volatile RTC_HOUR_t *)(RTC_BASE_ADDR + (uint32_t)0x28))

Zeitstrümpfe:

typedef struct {
  uint8_t  seconds;        /* Second value - [0,59] */
  uint8_t  minutes;        /* Minute value - [0,59] */
  uint8_t  hour;           /* Hour value - [0,23] */
  uint8_t  mDay;           /* Day of the month value - [1,31] */
  uint8_t  month;          /* Month value - [1,12] */
  uint16_t year;           /* Year value - [0,4095] */
  uint8_t  wDay;           /* Day of week value - [0,6] */
  uint16_t yDay;           /* Day of year value - [1,365] */
} rtcTime_t;

RTC -Funktionen:

void rtc_ClockStart(void) {
  /* Enable CLOCK into RTC */
  scb_ClockStart(M_RTC);
  RTC_CCR.B.CLKSRC = 1;
  RTC_CCR.B.CLKEN  = 1;
  return;
}

void rtc_ClockStop(void) {
  RTC_CCR.B.CLKEN = 0;
  /* Disable CLOCK into RTC */
  scb_ClockStop(M_RTC);
  return;
}

void rtc_GetTime(rtcTime_t *p_localTime) {
  /* Set RTC timer value */
  p_localTime->seconds = RTC_SEC.R;
  p_localTime->minutes = RTC_MIN.R;
  p_localTime->hour    = RTC_HOUR.R;
  p_localTime->mDay    = RTC_DOM.R;
  p_localTime->wDay    = RTC_DOW.R;
  p_localTime->yDay    = RTC_DOY.R;
  p_localTime->month   = RTC_MONTH.R;
  p_localTime->year    = RTC_YEAR.R;
}

Systemsteuerungsblockfunktionen:

void scb_ClockStart(module_t module) {
  PCONP.R |= (uint32_t)1 << module;
}

void scb_ClockStop(module_t module) {
  PCONP.R &= ~((uint32_t)1 << module);
}

Andere Tipps

Entsprechend Diese Boardbeschreibung für den LPC213X, Es wird mit einem Beispielprogramm namens "Echtzeituhr-zeigt, wie die Echtzeituhr verwendet werden kann". Dies impliziert auch, dass das Board in Echtzeit-Uhr-Hardware verfügt, was es viel einfacher macht.

Ich schlage vor, Sie lesen sich über dieses Programm nach, um herauszufinden, wie Sie mit der RTC -Hardware sprechen können. Der nächste Schritt wäre, die Anzeigeanforderungen zu lösen. Die beiden offensichtlichen Entscheidungen sind entweder 7-Segment-LED-Anzeigen, oder an LCD.

Beide sind bekannte Technologien darüber, welche Lasten geschrieben wurden, folgen Sie den Wikipedia-Links, um mehr herauszufinden.

Wenn Sie Informationen über Arm benötigen, dann ist dies Anleitung des ARM -Systementwicklers: Entwerfen und Optimieren von Systemsoftware kann Ihnen helfen.

Früher haben wir so etwas für Arm gemacht.

    #include "LPC21xx.h"
    void rtc()
    {
         *IODIR1 = 0x00FF0000;
             // Set LED ports to output
         *IOSET1 = 0x00020000;
         *PREINT = 0x000001C8;
            // Set RTC prescaler for 12.000Mhz Xtal
         *PREFRAC = 0x000061C0;
         *CCR = 0x01;
        *SEC = 0;
        *MIN = 0;
        *HOUR= 0;
    }

Eine Echtzeituhr (RTC) ist eine Computeruhr (meistens in Form einer integrierten Schaltung), die die aktuelle Zeit im Auge behält. Obwohl sich der Begriff häufig auf die Geräte in PCs, Servern und eingebetteten Systemen bezieht, sind RTCs in nahezu jedem elektronischen Gerät vorhanden, das eine genaue Zeit behalten muss.

Sie können diesen beiden Link verweisen. Ich bin sicher, dass Sie ein weiteres Verständnis erhalten:-

1). ARM Cortex-Programmierung mit CMSIS:- http://www.firmcodes.com/cmsis/

2). RTC-Programmierung mit ARM7:- http://www.firmcodes.com/microcontrollers/arm/real-time-clock-of-arm7-lpc2148/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top