arm接口2之RTC--S3C2440

还是菜鸟级的arn实践
功能:实时时钟RTC,用uart串口打印出来。
模块分为三块
第一个:uat的实现,包括时钟设置,uart的读写
#include <S3C2440.H>

void init_clock()
{
  rLOCKTIME=0xffffff;
  rMPLLCON=0x44011; //fclk=300M
  rCLKDIVN=3;   //pclk=75,hclk=150
}

void init_uart( void)
{
  rGPHCON=rGPHCON&~(0xf0)|0xa0;
  rGPHUP|=0xc; //上拉电阻不使能
  rULCON0=3; //8数据位,无奇偶校验,1个停止位
  rUCON0=0x245;
  rUFCON0=0;
  rUMCON0=0;
  rUBRDIV0=( int)(75000000/(115200*16))-1;         //PCLK=75M
//波特率为115200 
}
void delay( int count)
{
   for(;count>0;count--)    
    ;
}
void uart_send_byte( char ch)
{
   if(ch=='\0')
  {
     while(!(rUTRSTAT0&2));
    delay(10);
    WrUTXH0('\n');
  }
   else
  {
     while(!(rUTRSTAT0&2));
    delay(10);
    WrUTXH0(ch);
  }
}
void uart_send_str( char *str)
{
   while(*str)
    uart_send_byte(*str++);
}
void uart_send_num(unsigned int num)
{
   if(num/10==0)
    uart_send_byte('0'+num);
   else
  {
    uart_send_num(num/10);
    uart_send_num(num%10);
  }
}
char uart_receive_byte()
{
   while(!(rUTRSTAT0&1));
     return RdURXH0();
}
第二个:RTC的实现,包括初始化和打印
#include <S3C2440.H>
char week[7][4]={ "SUM", "MON", "TUE", "WED", "THS", "FRI", "SAT"};
void uart_send_str( char *str);
void uart_send_byte( char ch);
void uart_send_num( int num);
 //bcd码转16进制
unsigned char bcd_to_dec(unsigned char tem)
{
  unsigned char temp;
  temp=(tem/16)*10+tem%16;
   return temp;
}
//16进制转bcd
unsigned char dec_to_bcd(unsigned char tem)
{
  unsigned char temp;
  temp=((tem/10)<<4)|(tem%10);
   return temp;
}

void init_rtc( void)
{
  rRTCCON=1;

  rBCDSEC=dec_to_bcd(0);
  rBCDMIN=dec_to_bcd(25);
  rBCDHOUR=dec_to_bcd(14);
  rBCDDAY=dec_to_bcd(5);
  rBCDDATE=dec_to_bcd(29);
  rBCDMON=dec_to_bcd(10);
  rBCDYEAR=dec_to_bcd(10);

  rRTCCON=0; //避免修改寄存器的值
}

void display_rtc( void)
{
  unsigned int year;
  unsigned char mon,date,day,hour,min,sec;

  rRTCCON=1;
  year=bcd_to_dec(rBCDYEAR);
   if(year==99)
    year=1999;
   else
    year=year+2000;
  mon=bcd_to_dec(rBCDMON);
  date=bcd_to_dec(rBCDDATE);
  day=bcd_to_dec(rBCDDAY);
  hour=bcd_to_dec(rBCDHOUR);
  min=bcd_to_dec(rBCDMIN);
  sec=bcd_to_dec(rBCDSEC);
    
  uart_send_str( "year:");
  uart_send_num(year);
  uart_send_str( "    mon:");
  uart_send_num(mon);
  uart_send_str( "    date:");
  uart_send_num(date);
  uart_send_str( "    day:");
  uart_send_str(week[day]);
  uart_send_str( "    hour:");
  uart_send_num(hour);
  uart_send_str( "    min:");
  uart_send_num(min);
  uart_send_str( "    sec:");
  uart_send_num(sec);
  uart_send_byte('\n');

  rRTCCON=0;
}

第三:主函数
#include <S3C2440.H>

void uart_send_byte( char ch);
void init_clock( void);
void init_uart( void);
void uart_send_str( char *str);
void delay( int count);
void init_rtc( void);
void display_rtc( void);

int Main()
{
  init_clock();
  init_uart();
  init_rtc();
  uart_send_str( "ready!");
  uart_send_byte('\n');
   while(1)
  {
    display_rtc();
    delay(0x290000);
  }
}

你可能感兴趣的:(职场,ARM,休闲,UART,RTC)