历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2018年11月26日 | TQ2440裸奔程序:串口UART的PC机按键测试程序

2018-11-26 来源:eefocus

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


  // NAME: main.c


  // DESC: TQ2440串口UART测试程序


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

  

  #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初始化:端口使能、功能设定、波特率、设置数据格式


  rGPHCON = (rGPHCON & ~(0xfff<<4)) | (0xaaa<<4);//端口RX[0:2]、TX[0:2]功能


  rGPHUP = rGPHUP | (0x7<<1); //端口GPH[1:3]禁止上拉


  rUFCON0 = 0x0; //禁止FIFO


  rUFCON1 = 0x0; //禁止FIFO


  rUFCON2 = 0x0; //禁止FIFO


  rUMCON0 = 0x0; //禁止AFC


  rUMCON1 = 0x0; //禁止AFC


  //Normal:No parity:One stop:8-bits 中断响应 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; //设置串口端口号


  }


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


  // 串口发送函数


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


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


  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);


  }


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


  // 串口接收函数


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


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


  void uart_tx_empty(void)


  {


  if(0 == uart_port)


  {


  while(!(rUTRSTAT0 & 0x4));//等待Tx为空


  }


  if(1 == uart_port)


  {


  while(!(rUTRSTAT1 & 0x4));//等待Tx为空


  }


  if(2 == uart_port)


  {


  while(!(rUTRSTAT2 & 0x4));//等待Tx为空


  }


  }


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


  char uart_get_ch(void)


  {


  if(0 == uart_port)


  {


  while(!(rUTRSTAT0 & 0x1));//等待Rx被读


  return rURXH0; //读缓存寄存器


  }


  else if(1 == uart_port)


  {


  while(!(rUTRSTAT1 & 0x1));//等待Rx被读


  return rURXH1; //读缓存寄存器


  }


  else if(2 == uart_port)


  {


  while(!(rUTRSTAT2 & 0x1));//等待Rx被读


  return rURXH2; //读缓存寄存器


  }


  return 0;


  }


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


  char uart_get_key(void)


  {


  if(0 == uart_port)


  {


  if(rUTRSTAT0 & 0x1) //Rx被读


  {


  return rURXH0; //读缓存寄存器


  }


  else


  {


  return 0;


  }


  }


  if(1 == uart_port)


  {


  if(rUTRSTAT1 & 0x1) //Rx被读


  {


  return rURXH1; //读缓存寄存器


  }


  else


  {


  return 0;


  }


  }


  if(2 == uart_port)


  {


  if(rUTRSTAT2 & 0x1) //Rx被读


  {


  return rURXH2; //读缓存寄存器


  }


  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将字符串转换为整型值


  result = atoi(string);


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


  }


  else


  {


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


  {


  //判断字符是否为英文字母,当为英文字母a-z或A-Z时,返回非零值,否则返回零。


  if(isalpha(string[i]))


  {


  //isupper 判断字符是否为大写英文字母,当c为大写英文字母,返回非零值,否则返回零。


  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");


  }


  }


  }


推荐阅读

史海拾趣

芯海科技(CHIPSEA)公司的发展小趣事

芯海科技自2003年成立以来,便专注于高精度ADC(模数转换器)芯片的研发。在成立初期,公司面临国际巨头的激烈竞争,但凭借对技术的执着追求,成功打破了国内市场的垄断。公司推出的高精度ADC芯片在电能计量领域得到了广泛应用,为工业领域提供了稳定、可靠的解决方案。这一阶段的成功为芯海科技在电子行业奠定了坚实的基础。

Advance Tapes公司的发展小趣事

为了进一步扩大市场份额,Advance Tapes公司开始积极参与国际展会和交流活动,向全球客户展示其优质的产品和技术实力。同时,公司还加大了对品牌建设的投入,通过广告宣传、赞助活动等方式提升品牌知名度和美誉度。这些努力使得Advance Tapes的胶带产品逐渐在国际市场上占据了一席之地。

ATC [American Technical Ceramics]公司的发展小趣事

随着全球经济的日益一体化,国际合作成为许多公司拓展市场的重要途径。假设ATC在某次国际技术交流会上与一家欧洲知名电子企业达成了合作协议,双方共同开发了一款新型陶瓷电容器。这款电容器不仅性能卓越,而且成本相对较低,因此在全球市场上受到了广泛的欢迎。通过这次合作,ATC不仅提升了自身的技术实力,也进一步拓展了海外市场。

EBK Kruger GmbH & Co KG公司的发展小趣事

为了提升产品质量和满足客户需求,EBK Kruger开始建立严格的质量管理体系。公司引进了国际先进的生产设备和检测设备,并对员工进行了系统的质量培训。通过不懈的努力,EBK Kruger的产品质量得到了显著提升,赢得了客户的广泛赞誉。同时,公司还获得了多项国际质量认证,进一步提升了品牌形象。

DYMO公司的发展小趣事

随着市场需求的不断变化,DYMO公司不断推出新的产品线,以满足不同消费者的需求。除了传统的标签打印机外,DYMO公司还推出了便携式打印机、工业级打印机等多种类型的产品。这些产品不仅功能强大,而且设计精美,深受消费者的喜爱。通过产品线的多样化,DYMO公司进一步巩固了其在标签打印领域的领先地位。

Advanced Milliwave Laboratories Inc公司的发展小趣事

随着技术的不断成熟和产品的不断优化,AML开始积极拓展市场。公司参与了多个国际电子展会,与全球各地的客户建立了联系。通过展示其独特的技术优势和高质量的产品,AML逐渐在微波技术领域建立了良好的品牌形象。同时,AML还加强了与合作伙伴的合作关系,共同开拓市场,实现互利共赢。

问答坊 | AI 解惑

开关电源传导干扰检测

[url=http://www.025021.com/]模块电源[/url] 开关电源 军品电源模块在电力线和开关电源中,电磁干扰 ( EMI: electromagnetic interference)主要表现形式是传导干扰。干扰信号主要是电流和电压谐波分量【1—3】。 电力线、信号线和控制线是传导干 ...…

查看全部问答>

单片机外围芯片PDF文档

本帖最后由 paulhyde 于 2014-9-15 09:07 编辑 资源共享呀。  …

查看全部问答>

基于DSP的小功率光伏并网逆变器的设计

本帖最后由 paulhyde 于 2014-9-15 03:38 编辑 作 者:北京交通大学电气工程学院新能源研究所 杨军 金新民 前言 随着生态环境的日益恶化,人们逐渐认识到必须走可持续发展的道路,太阳能必须完成从补充能源向替代能源的过渡。光伏并网是太 ...…

查看全部问答>

《沙占友精品系列》共11本,PDG格式

包含以下书籍: ★最新万用表妙用100例 ★模拟与数字万用表检测及应用技术 ★数字万用表电路图集 ★数字万用表应用技巧 ★特种集成电源最新应用技术 ★万用表测试元器件大全 ★新编实用数字化测量技术 ★新型单片开关电源的设计与应用 ★新 ...…

查看全部问答>

跪求-48V转+48V或者+27v电路

跪求-48V转换电路,将-48和零线转换为零线和+48或者+27V或者其他正电源。 注设备放在室外,外壳接地。请勿说将-48v和零线对调来使用…

查看全部问答>

有人做过SSL协议吗?

有人搞过SSL协议吗? 希望能和您交流一下,谢谢。…

查看全部问答>

中断问题

今天小弟我看到了中断这一章了, 但是到现在还搞不清楚SWI的一些地方, 特请教各位高手, 谢谢! 问题就是在加载中断这个地方    unsigned Install_Handler(unsigned routine, unsigned *vector) {    vec = (routine - (unsig ...…

查看全部问答>

AN2606错误

AN2606Application noteSTM32F101xx and STM32F103xx system memory boot mode第六页,技术错误。…

查看全部问答>