TQ2440 naked program: PC key test program for serial UART

Publisher:数字探险家Latest update time:2018-11-26 Source: eefocusKeywords:TQ2440 Reading articles on mobile phones Scan QR code
Read articles on your mobile phone anytime, anywhere

  //=========================================


  // NAME: main.c


  // DESC: TQ2440 serial port UART test program


  //=========================================

  

  #include "def.h"


  #include "option.h"


  #include "2440addr.h"


  #include


  #include


  #include


  #include


  #include


  //======================================================


  static volatile int uart_port = 0;


  void uart_init(int pclk,int buad,int ch)


  {


  //UART initialization: port enable, function setting, baud rate, data format setting


  rGPHCON = (rGPHCON & ~(0xfff<<4)) | (0xaaa<<4); //Port RX[0:2], TX[0:2] function


  rGPHUP = rGPHUP | (0x7<<1); //Port GPH[1:3] disable pull-up


  rUFCON0 = 0x0; //Disable FIFO


  rUFCON1 = 0x0; //Disable FIFO


  rUFCON2 = 0x0; //Disable FIFO


  rUMCON0 = 0x0; //Disable AFC


  rUMCON1 = 0x0; //Disable AFC


  //Normal:No parity:One stop:8-bits interrupt response UART clock: PCLK


  rULCON0 = (rULCON0 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));


  rUCON0 = (rUCON0 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));


  rUBRDIV0 = ((int)(pclk/16./buad+0.5)-1);


  rULCON1 = (rULCON1 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));


  rUCON1 = (rUCON1 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));


  rUBRDIV1 = ((int)(pclk/16./buad+0.5)-1);


  rULCON2 = (rULCON2 & ~0xff) | ((0x0<<6)|(0x0<<3)|(0x0<<2)|(0x3));


  rUCON2 = (rUCON2 & ~0x3ff) | ((0x1<<9)|(0x1<<6)|(0x1<<2)|(0x1));


  rUBRDIV2 = ((int)(pclk/16./buad+0.5)-1);


  uart_port = ch; //Set the serial port number


  }


  //******************************************************


  //Serial port sending function


  //******************************************************


  //======================================================


  void uart_send_byte(int data)


  {


  if(0 == uart_port)


  {


  if(data == 'n')


  {


  while(!(rUTRSTAT0 & 0x2));


  rUTXH0 = 'n';


  }


  while(!(rUTRSTAT0 & 0x2));


  rUTXH0 = data;


  }


  else if(1 == uart_port)


  {


  if(data == 'n')


  {


  while(!(rUTRSTAT1 & 0x2));


  rUTXH1 = 'n';


  }


  while(!(rUTRSTAT1 & 0x2));


  rUTXH1 = data;


  }


  else if(2 == uart_port)


  {


  if(data == 'n')


  {


  while(!(rUTRSTAT2 & 0x2));


  rUTXH2 = 'n';


  }


  while(!(rUTRSTAT2 & 0x2));


  rUTXH2 = data;


  }


  }


  //======================================================


  void uart_send_string(char *string)


  {


  while(*string)


  {


  uart_send_byte(*string++);


  }


  }


  //======================================================


  void uart_printf(char *fmt,...)


  {


  va_list ap;


  char string[256];


  va_start(ap,fmt);


  vsprintf(string,fmt,ap);


  uart_send_string(string);


  va_end(ap);


  }


  //******************************************************


  //Serial port receiving function


  //******************************************************


  //======================================================


  void uart_tx_empty(void)


  {


  if(0 == uart_port)


  {


  while(!(rUTRSTAT0 & 0x4));//Wait for Tx to be empty


  }


  if(1 == uart_port)


  {


  while(!(rUTRSTAT1 & 0x4));//Wait for Tx to be empty


  }


  if(2 == uart_port)


  {


  while(!(rUTRSTAT2 & 0x4));//Wait for Tx to be empty


  }


  }


  //======================================================


  char uart_get_ch(void)


  {


  if(0 == uart_port)


  {


  while(!(rUTRSTAT0 & 0x1));//Wait for Rx to be read


  return rURXH0; //Read cache register


  }


  else if(1 == uart_port)


  {


  while(!(rUTRSTAT1 & 0x1));//Wait for Rx to be read


  return rURXH1; //Read cache register


  }


  else if(2 == uart_port)


  {


  while(!(rUTRSTAT2 & 0x1));//Wait for Rx to be read


  return rURXH2; //Read cache register


  }


  return 0;


  }


  //======================================================


  char uart_get_key(void)


  {


  if(0 == uart_port)


  {


  if(rUTRSTAT0 & 0x1) //Rx is read


  {


  return rURXH0; //Read cache register


  }


  else


  {


  return 0;


  }


  }


  if(1 == uart_port)


  {


  if(rUTRSTAT1 & 0x1) //Rx is read


  {


  return rURXH1; //Read cache register


  }


  else


  {


  return 0;


  }


  }


  if(2 == uart_port)


  {


  if(rUTRSTAT2 & 0x1) //Rx is read


  {


  return rURXH2; //Read cache register


  }


  else


  {


  return 0;


  }


  }


  return 0;


  }


  //======================================================


  void uart_get_string(char *string)


  {


  char *string1 = string;


  char c = 0;


  while((c = uart_get_ch())!='r')


  {


  if(c == 'b')


  {


  if((int)string1 < (int)string)


  {


  uart_printf("bb");


  string--;


  }


  }


  else


  {


  *string++ = c;


  uart_send_byte(c);


  }


  }


  *string = '�';


  uart_send_byte('n');


  }


  //======================================================


  int uart_get_intnum(void)


  {


  char str[30];


  char *string = str;


  int base = 10;


  int minus = 0;


  int result = 0;


  int last_index;


  int i;


  uart_get_string(string);


  if(string[0] == '-')


  {


  minus = 1;


  string++;


  }


  if(string[0] == '0' && (string[1] == 'x' || string[1] == 'X'))


  {


  base = 16;


  string = string + 2;


  }


  last_index = strlen(string)-1;


  if(last_index < 0)


  {


  return -1;


  }


  if(string[last_index] == 'h' || string[last_index] == 'H')


  {


  base = 16;


  string[last_index] = 0;


  last_index--;


  }


  if(base == 10)


  {


  //atoi converts the string into an integer value


  result = atoi(string);


  result = minus ? (-1*result) : result;


  }


  else


  {


  for(i=0;i<=last_index;i++)


  {


  //Judge whether the character is an English letter. If it is an English letter az or AZ, return a non-zero value, otherwise return zero.


  if(isalpha(string[i]))


  {


  //isupper determines whether the character is an uppercase English letter. When c is an uppercase English letter, it returns a non-zero value, otherwise it returns zero.


  if(isupper(string[i]))


  {


  result = (result<<4) + string[i]-'A'+10;


  }


  else


  {


  result = (result<<4) + string[i]-'a'+10;


  }


  }


  else


  {


  result = (result<<4) + string[i]-'0'+10;


  }


  }


  result = minus ? (-1*result) : result;


  }


  return result;


  }


  //======================================================


  int uart_get_intnum_gj(void)


  {


  char string[16];


  char *p_string = string;


  char c;


  int i = 0;


  int data = 0;


  while((c = uart_get_ch()) != 'r')


  {


  if(c == 'b')


  {


  p_string--;


  }


  else


  {


  *p_string++ = c;


  }


  //uart_send_byte(c);


  }


  *p_string = '�';


  i=0;


  while(string[i] != '�')


  {


]  data = data*10;


  if(string[i]


  {


  return -1;


  }


  data = data +(string[i]-'0');


  i++;


  }


  return data;


  }


  //******************************************************


  void Main(void)


  {


  uart_init(50000000,115200,0);


  while(1)


  {


  if('-' == uart_get_ch())


  {


  uart_printf("+n");


  }


  if('+' == uart_get_key())


  {


  uart_printf("-n");


  }


  }


  }


Keywords:TQ2440 Reference address:TQ2440 naked program: PC key test program for serial UART

Previous article:TQ2440 naked program: serial UART printf test program
Next article:ARM9: How to port linux2.6.38 kernel to TQ2440

Recommended ReadingLatest update time:2024-11-23 03:36

Porting uboot-2012.04.01 to TQ2440
Development Environment Host development environment: Ubuntu 12.04 BootLoader: u-boot-2012.04.01 kernel:linux-2.6.30.4 CPU: s3c2440 Development board: TQ2440 Cross-compilation toolchain: arm-linux-gcc 4.3.3 step For specific transplantation steps, please refer to https://www.bilibili.com/video/BV1Pt411n7cv I did it
[Microcontroller]
Porting uboot-2012.04.01 to TQ2440
Latest Microcontroller Articles
Change More Related Popular Components

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
circle

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号