アームアーキテクチャベースのマイクロコントローラーのリアルタイムクロックをコーディングします
-
19-09-2019 - |
質問
アームアーキテクチャ用のリアルタイムクロックを実装するプログラムを作成する必要があります。例: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のためです。私たちにも入植機能がありますが、私はあなたのためにすべての仕事をしたくありません。 ;)アクセスを容易にするためのカスタムレジスタファイルがありますが、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ハードウェアと話す方法を把握するために、そのプログラムを読んだことをお勧めします。次のステップは、表示要件を解決することです。 2つの明白な選択はどちらかです 7セグメントLEDディスプレイ, 、または LCD.
どちらも、どの負荷が書かれているかについてのよく知られたテクノロジーです。ウィキペディアリンクに従って詳細を確認してください。
腕に関する情報が必要な場合は、これです アームシステム開発者ガイド:システムソフトウェアの設計と最適化 あなたを助けるかもしれません。
私たちは腕のためにこのようなことをしていました。
#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は正確な時間を維持する必要があるほぼすべての電子デバイスに存在します。
この2つのリンクを参照することができます、私はそれがあなたにさらなる理解を与えると確信しています: -
1)。 CMSISを使用したアーム皮質プログラミング: - http://www.firmcodes.com/cmsis/
2)。 ARM7を使用したRTCプログラミング: - http://www.firmcodes.com/microcontrollers/arm/real-time-clock-of-arm7-lpc2148/