?? main.c
字號:
/* 包含文件 */
#include "def.h"
#include "2410lib.h"
#include "option.h"
#include "2410addr.h"
#include "interrupt.h"
extern unsigned char seg7table[];
/* 表示日期、時間的數(shù)據(jù)結(jié)構(gòu) */
typedef struct ST_DATE
{
short year; // 年
char mon; // 月
char day; // 日
char week_day; // 星期
char hour; // 時
char min; // 分
char sec; // 秒
} st_date;
/* 全局變量 */
int led_index = 0;
int ext0_count = 0;
/* functions */
void rtc_tick_isr(void) __attribute__ ((interrupt("IRQ")));;
void rtc_int_isr(void) __attribute__ ((interrupt("IRQ")));;
#define WDT_ENABLE (0x01<<5)
#define WDT_INT_ENABLE (0x01<<2)
#define WDT_RST_ENABLE (0x01<<0)
#define WDT_CLK_SEL (0X3 <<3) /* 1/128 */
#define WDT_PRE_SCALER ((PCLK/1000000-1) <<8) /* 49 */
/********************************************************************
// Function name : watchdog_init
// Description : 看門狗初始化
// Return type : void
// Argument :
*********************************************************************/
void watchdog_init()
{
rWTCNT = 8448 * 2; /* 設(shè)置看門狗初始值 */
rWTCON = WDT_ENABLE | WDT_RST_ENABLE | WDT_CLK_SEL | WDT_PRE_SCALER; /* 打開看門狗 */ /* 打開看門狗 */
}
/*****************************************************************************
// Function name : rtc_set_date
// Description : 修改實時時鐘當前時間、日期
// Return type : void
// Argument : p_date, 待設(shè)置的日期
*****************************************************************************/
void rtc_set_date(st_date* p_date)
{
rRTCCON = 0x01;
rBCDYEAR = p_date->year;
rBCDMON = p_date->mon;
rBCDDAY = p_date->day;
rBCDDATE = p_date->week_day;
rBCDHOUR = p_date->hour;
rBCDMIN = p_date->min;
rBCDSEC = p_date->sec;
rRTCCON = 0x00;
}
/*****************************************************************************
// Function name : rtc_get_date
// Description : 獲取實時時鐘當前時間、日期
// Return type : void
// Argument : p_date, 返回日期的指針
*****************************************************************************/
void rtc_get_date(st_date* p_date)
{
rRTCCON = 0x01;
p_date->year = rBCDYEAR ;
p_date->mon = rBCDMON ;
p_date->day = rBCDDAY ;
p_date->week_day= rBCDDATE ;
p_date->hour = rBCDHOUR ;
p_date->min = rBCDMIN ;
p_date->sec = rBCDSEC ;
rRTCCON = 0x00;
}
/*****************************************************************************
// Function name : rtc_tick_init
// Description : 初始化S3C2410的TICK定時器
// Return type : void
// Argument : tick, 設(shè)置的TICK頻率(時鐘滴答的周期為 (1+tick)/128秒)
*****************************************************************************/
void rtc_tick_init( char tick )
{
Irq_Request(IRQ_TICK, rtc_tick_isr);
rRTCCON = 0x0; //No reset[3], Merge BCD counters[2], BCD clock select XTAL[1], RTC Control disable[0]
rTICNT = (tick&0x7f)|0x80; /*TICK 中斷使能,周期為(1+tick)/128秒*/
Irq_Enable(IRQ_TICK);
}
/*****************************************************************************
// Function name : rtc_alarm_set
// Description : 設(shè)置S3C2410的告警時間以及方式
// Return type : void
// Argument : p_date, 告警的時間
// mode, 告警模式
*****************************************************************************/
void rtc_alarm_set(st_date* p_date, unsigned char mode)
{
Irq_Request(IRQ_RTC, rtc_int_isr);
rRTCCON = 0x01;
rALMYEAR = p_date->year;
rALMMON = p_date->mon;
rALMDATE = p_date->day;
rALMHOUR = p_date->hour;
rALMMIN = p_date->min;
rALMSEC = p_date->sec;
rRTCALM = mode;
rRTCCON = 0x00;
Irq_Enable(IRQ_RTC);
}
/*****************************************************************************
// Function name : Main
// Description : JXARM9-2410 看門狗實驗主程序
// 完成功能:
// 在實時時鐘實驗的基礎(chǔ)上添加看門狗功能,并在時鐘滴答
// 中斷中實現(xiàn)喂狗處理.
//
// Return type : void
// Argument : void
*****************************************************************************/
void Main(void)
{
int old_index ;
st_date m_date;
/* 配置系統(tǒng)時鐘 */
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(0xa1,0x3,0x1); // FCLK=202.8MHz
/* 中斷初始化 */
Isr_Init();
/* 初始化端口 */
Port_Init();
/* 初始化串口 */
Uart_Init(0,115200);
Uart_Select(0);
/* 打印提示信息 */
PRINTF("\n---看門狗測試程序---\n");
PRINTF("\n請將UART0與PC串口進行連接,然后啟動超級終端程序(115200, 8, N, 1)\n");
PRINTF("\n看門狗測試開始\n");
/* 采用BCD編碼,如2004年需要設(shè)置的值為0x2004 */
m_date.year = 0x2000+0x08;
m_date.mon = 0x04;
m_date.day = 0x03;
m_date.week_day = 0x02 ;
m_date.hour = 0x15 ;
m_date.min = 0x40 ;
m_date.sec = 0x00 ;
/* 修改當前日期和時間 */
rtc_set_date(&m_date);
m_date.sec = 0x05 ;
/* 設(shè)置告警的時間及方式,0x41表示使能RTC告警,以及使能秒時鐘告警 */
rtc_alarm_set(&m_date, 0x41);
rtc_tick_init(127);
/* 打開看門狗復(fù)位功能 */
watchdog_init();
old_index = led_index;
PRINTF("請在2秒內(nèi)喂狗,否則系統(tǒng)將在約2秒后復(fù)位\n\n");
while(1)
{
if(old_index != led_index) /* 每隔一秒更新一次數(shù)據(jù) */
{
rtc_get_date(&m_date);
old_index = led_index;
PRINTF( /* 時鐘數(shù)據(jù)為BCD碼格式,以16進制顯示 */
"\b\b\b\b\b\b\b\b%02x:%02x:%02x", m_date.hour, m_date.min, m_date.sec);
}
};
}
/*****************************************************************************
// Function name : rtc_tick_isr
// Description : TICK中斷處理程序,程序中設(shè)置每秒鐘引發(fā)一次中斷
// 為避免看門狗復(fù)位在此處喂狗
// Return type : int
// Argument : void
*****************************************************************************/
void rtc_tick_isr(void)
{
Irq_Clear(IRQ_TICK); /* 清除TICK中斷 */
*((U8*) 0x10000006) = 0x00;
*(unsigned char*)0x10000004 = seg7table[led_index%10];
led_index++;
/* 喂狗 */
rWTCNT = 8448 * 2;
}
/*****************************************************************************
// Function name : rtc_int_isr
// Description : rtc中斷處理程序,程序中設(shè)置每分鐘的第5秒引發(fā)該中斷
// Return type : int
// Argument : void
*****************************************************************************/
void rtc_int_isr(void)
{
Irq_Clear(IRQ_RTC); /*清除RTC中斷 */
// if(ext0_count&1)
// *(unsigned char*)0x2000000 = 0x0f;
// else
// *(unsigned char*)0x2000000 = 0xff;
ext0_count++;
PRINTF("\r\nAlarm\r\n ");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -