문제

ARM 아키텍처의 실시간 시계를 구현하기 위해 프로그램을 작성해야합니다. 예 : LPC213X

시간 1 분, 초를 표시해야합니다. 나는 팔에 대해 전혀 모른다. 그래서 시작하는 데 어려움이있다.

아래 코드는 작동하지 않습니다

// ...

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;
}
도움이 되었습니까?

해결책

이것은 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);
}

다른 팁

에 따르면 LPC213X에 대한이 보드 설명, "실시간 시계-실시간 시계 사용 방법을 보여줍니다"라는 예제 프로그램이 제공됩니다. 이것은 또한 보드에 실시간 시계 하드웨어가있어 훨씬 쉽게 만들 수 있음을 의미합니다.

RTC 하드웨어와 대화하는 방법을 알아 내기 위해 그 프로그램을 읽어 보는 것이 좋습니다. 다음 단계는 디스플레이 요구 사항을 해결하는 것입니다. 두 가지 명백한 선택도 마찬가지입니다 7- 세그먼트 LED 디스플레이, 또는 LCD.

둘 다 어떤 부하가 작성되었는지 잘 알려진 기술입니다. Wikipedia 링크를 따라 자세한 내용을 알아보십시오.

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

실시간 시계 (RTC)는 현재 시간을 추적하는 컴퓨터 클럭 (대부분 통합 회로 형태)입니다. 이 용어는 종종 개인용 컴퓨터, 서버 및 임베디드 시스템의 장치를 말하지만 RTC는 정확한 시간을 유지 해야하는 거의 모든 전자 장치에 존재합니다.

이 두 링크를 참조 할 수 있습니다. 추가 이해를 제공 할 것이라고 확신합니다.

1). CMSIS를 사용한 ARM 피질 프로그래밍 :- http://www.firmcodes.com/cmsis/

2). ARM7을 사용한 RTC 프로그래밍 :- http://www.firmcodes.com/microcontrollers/arm/Real-time-clock-of-arm7-lpc2148/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top