⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 思创S3C44B0黄金开发板一个简化版本的BOOTLOADER
💻 C
📖 第 1 页 / 共 2 页
字号:
//***************************************************************************

/****************************************************************************
【功能说明】向串行口发送一个数据,ch为0向UART0发送,ch为1向UART1发送
****************************************************************************/
void Uart_SendByte(U8 ch,int data)
{
  if(ch == 0)
  {
    if(data == '\n')
    {
      while(!(rUTRSTAT0 & 0x2));
      
      //改动延时时间1--10
      Delay(10);    //由于超级终端反应较慢,有一个微小延迟
      WrUTXH0('\r');
    }
    while(!(rUTRSTAT0 & 0x2));    //等待知道THR变空
    //改动延时时间1--10
    Delay(10);
    rUTXH0 = data;
    }
  else
  {
    if(data == '\n')
    {
      while(!(rUTRSTAT1 & 0x2));
      //改动延时时间1--10
      Delay(10);    //由于超级终端反应较慢,有一个微小延迟
      rUTXH1 = '\r';
    }
    while(!(rUTRSTAT1 & 0x2));    //等待知道THR变空
    //改动延时时间1--10
    Delay(10);
    rUTXH1 = data;
    } 
}   
//***************************************************************************

/****************************************************************************
【功能说明】向串行口发送一个字符串,ch为0向UART0发送,ch为1向UART1发送
****************************************************************************/
void Uart_SendString(U8 ch,char *pt)
{
    while(*pt)    Uart_SendByte(ch,*pt++);
}
//***************************************************************************

/****************************************************************************
【功能说明】以标准格式printf向串行口发送一个字符串
ch为0向UART0发送,ch为1向UART1发送。(如果不用vsprintf代码会减小很多!)
****************************************************************************/
void Uart_Printf(U8 ch,char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    Uart_SendString(ch,string);
    va_end(ap);
}
//***************************************************************************

/****************************************************************************
【功能说明】定时器初始化,让PE7、6、5、4输出PWM信号
****************************************************************************/
void Timer_Pwm(void)
{
  rPCONE = 0xaa6b;    
  //PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1、0 RXD0 TXD0 FOUT
  rPUPE |= 0xf0;    //TOUT4、3、2、1、0设置成不上拉,其他引脚上拉

  rTCFG0 = 0x28f8f8f;   //死区长度为2;    Prescaler0/1/2=8f,8f,8f
  //定时器输入时钟频率计算公式 = MCLK/{prescaler+1}/{divider value}
  rTCFG1 = 0x0;   // Interrupt; Devider value = 1/2
  //定时器时钟 = (MCLK/prescaler+1)/2

  rTCNTB0 = 20000;    //决定TOUT 0引脚PWM输出信号的频率
  rTCNTB1 = 32000;    //决定TOUT 1引脚PWM输出信号的频率
  rTCNTB2 = 43000;    //决定TOUT 2引脚PWM输出信号的频率
  rTCNTB3 = 53000;    //决定TOUT 3引脚PWM输出信号的频率
  rTCNTB4 = 64000;    //决定TOUT 4引脚PWM输出信号的频率

  rTCMPB0 = 12000;    //决定TOUT 0引脚PWM输出高电平的信号宽度(rTCMPB0<rTCNTB0)
  rTCMPB1 = 18000;    //决定TOUT 1引脚PWM输出高电平的信号宽度(rTCMPB1<rTCNTB1)
  rTCMPB2 = 25000;    //决定TOUT 2引脚PWM输出高电平的信号宽度(rTCMPB2<rTCNTB2)
  rTCMPB3 = 28000;    //决定TOUT 3引脚PWM输出高电平的信号宽度(rTCMPB3<rTCNTB3)
  rTCMPB4 = 36000;    //决定TOUT 4引脚PWM输出高电平的信号宽度(rTCMPB4<rTCNTB4)

//  rTCON = 0xaaaa0a;   //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
//  rTCON = 0x999909;   //开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
//  rTCON = 0xeeee0e;   //自动重装,输出取反打开,更新TCNTBn、TCMPBn,死区控制器关闭
//  rTCON = 0xdddd0d;   //开始PWM输出(不使用死区控制器,上升沿会非常陡峭,是标准矩形波)
//  rTCON = 0xaaaa1a;   //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器打开
//  rTCON = 0x999919;   //开始PWM输出(使用死区控制器,上升沿会变得平滑,适用于功率器件控制)

  //Delay(7500);    //延时若干个100us
  rTCON = 0xaaaa0a;   //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
  rTCON = 0x999900;   //停止蜂鸣器的叫声
//  rTCON = 0x0;    //停止定时器
  rPCONE = 0xaa6b;    //
  //PE8-P0的引脚功能依次为:ENDIAN TOUT4、3、2、1 OUTPUT RXD0 TXD0 FOUT
}
//***************************************************************************

/****************************************************************************
【功能说明】让PE7输出占空比可以数控的PWM信号,经平滑滤波后用作DAC输出
****************************************************************************/
void Tout5_Pwm(void)
{
  U8 m,n;
  for(m = 0; m < 0xff; m++)
  {
    rTCMPB4 = m;    //决定TOUT 4引脚PWM输出高电平的信号宽度(rTCMPB4<rTCNTB4)
    //rTCON = 0xaaaa0a;   //自动重装,输出取反关闭,更新TCNTBn、TCMPBn,死区控制器关闭
    //rTCON = 0x999900;   //停止蜂鸣器的叫声
    for(n = 0; n < 50;)   n++;
  }
}
//***************************************************************************

/****************************************************************************
【功能说明】液晶模块控制器初始化,外接DMF50081(320×240)液晶模块
****************************************************************************/
void Lcd_Init(void)
{
  rPCOND=0xaaaa;
  rLCDCON1=(2)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
    //下降沿装载视频数据,禁止视频输出,LCD FIFO清空;行、帧信号取反;
    //4位单扫描模式;WDLY=8clk,WLH=8clk,CLKVAL_SL=38
  rLCDCON2=(239)|(79<<10)|(10<<21);
    //垂直点数为240,水平点数320=(80字),LINEBLANK=10
  rLCDSADDR1= (0x0<<27) | ( ((U32)Bmp>>22)<<21 ) | M5D((U32)Bmp>>1);
    // 黑白模式, LCDBANK, LCDBASEU
  rLCDSADDR2= (1<<29) | (M5D((U32)Bmp + ((320/8)*(240)))>>1) | (MVAL<<21);
  rLCDSADDR3= (320/16) | ( 0<<9 );   
  rLCDCON1=(1)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
}
//***************************************************************************

/****************************************************************************
【功能说明】液晶显示屏全屏填充某一个8位二进制数
****************************************************************************/
void Lcd_Fill(U8 m)
{
  U16 i;
  for(i = 0; i < 9600; i++)   Bmp[i] = m;
} 
//***************************************************************************

/****************************************************************************
【功能说明】实时时钟初始化
****************************************************************************/
void Rtc_Init(void)
{
    rRTCCON = 0x01; //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768

    rBCDYEAR = RTC_YEAR0;   //年
    rBCDMON  = RTC_MONTH0;    //月
    rBCDDAY  = RTC_DAY0;    //日
    rBCDDATE = RTC_DATE0;   //星期
    rBCDHOUR = RTC_HOUR0;   //小时
    rBCDMIN  = RTC_MIN0;    //分
    rBCDSEC  = RTC_SEC0;    //秒
}
//***************************************************************************

/****************************************************************************
【功能说明】显示实时时钟
****************************************************************************/
void Display_Rtc(void)
{
  U16 year;
  U8 month,day,weekday,hour,min,sec;
  U8 m,n;

  rRTCCON = 0x01;   //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
  year = 2000 + rBCDYEAR;

  month = rBCDMON;
  m = month>>4;   n = month&0x0f;
  month = m*10 + n;   //BCD码转十进制

  day = rBCDDAY;
  m = day>>4;   n = day&0x0f;
  day = m*10 + n;   //BCD码转十进制

  weekday = rBCDDATE;

  hour = rBCDHOUR;
  m = hour>>4;    n = hour&0x0f;
  hour = m*10 + n;    //BCD码转十进制
  
  min = rBCDMIN;
  m = min>>4;   n = min&0x0f;
  min = m*10 + n;   //BCD码转十进制

  sec = rBCDSEC;
  m = sec>>4;   n = sec&0x0f;
  sec = m*10 + n;   //BCD码转十进制
  
  rRTCCON = 0x00;   //RTC读写禁止(降低功率消耗),选择BCD时钟、计数器,无复位,1/32768

  Uart_Printf(0,"Date:/%02d/%02d/%04d %02d:%02d:%02d\n",month,day,year,hour,min,sec);
}
//***************************************************************************

/****************************************************************************
【功能说明】实时时钟定时报警
****************************************************************************/
void Rtc_Alarm(void)  
{
  rALMYEAR = RTC_YEAR1 ;    //年
  rALMMON = RTC_MONTH1;   //月
  rALMDAY = RTC_DAY1;   //日
  rALMHOUR = RTC_HOUR1;   //小时
  rALMMIN = RTC_MIN1;   //分
  rALMSEC = RTC_SEC1;     //秒

  rRTCALM=0x7f;   //全局警报使能控制,年、月、日、星期、时分秒警报使能控制
}
//***************************************************************************

/****************************************************************************
【功能说明】模数转换初始化
****************************************************************************/
void ADC_Init(void)
{
  rCLKCON = rCLKCON | (1<<12);
  rADCCON = 0x1|(0<<2);   
  Delay(100);             
  rADCPSR = 10;   
}
//***************************************************************************

/****************************************************************************
【功能说明】ADC某一通道进行转换,返回转换的数据
****************************************************************************/
U16 Read_Adc(unsigned char ain)
{
  int i;
  rADCCON = 0x1|(ain<<2); //设置AD转换通道
  while(rADCCON & 0x1); //避免标志FLAG错误
    while(!(rADCCON & 0x40));   //等待AD转换结束
  for(i = 0; i < rADCPSR; i++);   //避免第二次标志FLAG错误
  return rADCDAT;   //返回AD转换值
}
//***************************************************************************

#define                delay  Delay

#define BASE  ((volatile unsigned char *)(0x60a0000))

void readreg()
{
    unsigned char c[]={0x21,0x41,0xa1,0xe1};
    int i,j;
    volatile unsigned char *p =(volatile unsigned char *)(BASE);
        
   {
     for (i=0; i<4; i++) {
      *(volatile unsigned char *)(p) = c[i];
      Uart_Printf(0,"\nReg%c:",'A'+i);
      for (j=0;j<16;j++) {
        if (j&1) {
          Uart_Printf(0,"%02X ",(int)(*(volatile unsigned char *)(p+j+0x20-1)));  
        } else  {
          Uart_Printf(0,"%02X ",(int)(*(volatile unsigned char *)(p+j)));
        }
      }
      Uart_Printf(0,"\n");
     }
   }

}

//
// Init the net controller
// NET base is 0x300
// CPU    8019as
//  A1    A1
//  A2    A2
//  A3    A3
//  A4    A4
//  A5    A0
//
int Net_Init()
{
  //
  // Reset MAC
  //
  *(BASE+0x1e) = *(BASE+0x1e + 0x20);

  Delay(60);

  //
  // Set power status & msic
  //
  *(BASE+0x00) = 0xc1;
  *(BASE+0x20) = 0xc0;
  *(BASE+0x04) = 0x80;
  *(BASE+0x24) = 0x00;
  *(BASE+0x06) = 0x70;
  *(BASE+0x26) = 0xFF;
 	
 	//
 	// Write MAC 
 	//
  *(BASE+0x00) = 0x41;
  *(BASE+0x20) = 'H';
  *(BASE+0x02) = 'E';
  *(BASE+0x22) = 'L';
  *(BASE+0x04) = 'L';
  *(BASE+0x24) = 'O';
  *(BASE+0x06) = '!';

  return 1;
}

void FlashNonCache(int n)
{
    static unsigned int oldvalue;
    if (n) {
      oldvalue  = rNCACHBE0;
      rNCACHBE0 = 0x20000000;
    } else {
      rNCACHBE0 = oldvalue;
    }
}

    
typedef (*FUNC)(void);
int Burn(void);
void Shell(void);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -