2

ARM アーキテクチャ用のリアルタイム クロックを実装するプログラムを作成する必要があります。例: LPC213x

時、分、秒が表示されます。私はARMについて何も知らないので、始めるのに苦労しています。

以下のコードが機能しません

// ...

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;
}
4

4 に答える 4

3

LPC213x のこのボードの説明によると、「リアルタイム クロック - リアルタイム クロックの使用方法を示します」というサンプル プログラムが付属しています。これは、ボードがリアルタイム クロック ハードウェアを備えていることも意味します。これにより、はるかに簡単になります。

そのプログラムを読んで、RTC ハードウェアと対話する方法を理解することをお勧めします。次のステップは、表示要件を解決することです。明らかな 2 つの選択肢は、7 セグメント LED ディスプレイまたはLCDです。

どちらもよく知られたテクノロジーであり、負荷について書かれています。詳細については、Wikipedia のリンクをたどってください。

于 2009-11-09T09:19:25.713 に答える
1

ARM に関する情報が必要な場合は、この ARM システム開発者ガイド: システム ソフトウェアの設計と最適化が役立ちます。

ARM では、このようなことを行っていました。

    #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;
    }
于 2009-11-09T09:31:24.643 に答える
1

以上が LPC2468 の説明です。setTime 関数もありますが、すべての作業を私が行うわけではありません。;) 簡単にアクセスできるようにカスタム レジスタ ファイルがありますが、LPC のマニュアルを見れば、それらがどこで相関しているかは明らかです。値を適切な場所にシフトし、ビット単位の操作を行うだけです。例えば:

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

時間構造:

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 機能:

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;
}

システム制御ブロックの機能:

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

void scb_ClockStop(module_t module) {
  PCONP.R &= ~((uint32_t)1 << module);
}
于 2009-11-11T16:48:40.373 に答える
0

リアルタイム クロック (RTC) は、現在の時刻を追跡するコンピューター クロック (ほとんどの場合、集積回路の形式) です。この用語は、多くの場合、パーソナル コンピューター、サーバー、および組み込みシステムのデバイスを指しますが、RTC は、正確な時間を維持する必要があるほとんどすべての電子デバイスに存在します。

この2つのリンクを参照してください。さらに理解を深めることができると確信しています:-

1)。CMSIS を使用した ARM Cortex プログラミング:- http://www.firmcodes.com/cmsis/

2)。ARM7 を使用した RTC プログラミング:- http://www.firmcodes.com/microcontrollers/arm/real-time-clock-of-arm7-lpc2148/

于 2015-01-27T06:04:08.340 に答える