ARM 아키텍처 기반 마이크로 컨트롤러를위한 실시간 클럭 코딩
-
19-09-2019 - |
문제
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/