您的位置 首页 发布

Cortex-M3 (NXP LPC1788)之UART用法

在工作中经常将平台的串口和PC机连接,通过串口打印信息进行程序调试。LPC1788共有5个串口Uart0~Uart4,跟具开发板的资源,将使用Uart2…

在工作中经常将渠道的串口和PC机衔接,经过串口打印信息进行程序调试。LPC1788共有5个串口Uart0~Uart4,跟具开发板的资源,将运用Uart2进行简略的串口输出和输入中止的操作。开发板上运用74HC4052多路开关对UART2的RXD和TXD进行挑选,运用SP3243E进行3.0V到5.5V的RS-232电平转化。检查手册装备好相关的跳线帽,确保DB口上的串口输出选用的是Uart2。

下面介绍Uart相关体系装备和Uart模块的装备。Uart的时钟选用PCLK,咱们装备体系的CCLK为120M,PCLK为60M,后边设置串口的波特率就选用PLCK进行核算。要运用串口2的功用需求使能体系时钟操控PCONP,以及装备GPIO管脚为Uart2的RXD和TXD功用。要完结通讯,咱们需求设置数据的格局,包含传输的波特率,数据长度,中止位,以及校验等,这些数据在线性操控寄存器UnLCR中操控。波特率的产生需求经过分数波特率分频器UnFDR和主分频器DLL,DLM。计数公式如下图。

依据核算,当PLCK=60M,波特率为115200,数据位为8,中止位为1,无校验,则DLL = 22, DLM =0, DivAddVal =1, MulVal = 2 ,线性操控寄存器中的值为0x3。

要经过串口发送数据时,只需求把要发送的数据写入发送坚持寄存器UnTHR,体系就会经过移位寄存器将数据经过串口发送。为了了解体系的发送状况,还需求线性状况寄存器UnLSR,例如程序中运用该该寄存器的第5位判别发怂坚持寄存器是否为空,避免数据溢出。

假如需求进行串口的中止操作,还需求对串口中止进行装备,如串口中止使能寄存器UnIER和串口中止标识寄存器UnIIR。程序中运用到了串口2的接纳中止,为此在中止使能设置寄存器ISER中使能UART2中止,在串口中止使能寄存器UnIER中使能串口的接纳中止,该中止一起使能了字符接纳超时中止。UART2的RXD管脚接纳到数据将存放在FIFO中,程序中装备接纳FIFO的触发条件为1个字节,即有接纳到数据就触发。中止触发后,咱们能够依据中止标识寄存器UnIIR判别到底是串口的接纳中止,超时中止,发送中止等。进入中止今后,接纳中止和超时中止,都能够经过读取接纳缓存寄存器UnRBR进行中止复位,使下次中止能够产生。

下面的程序比如,程序开端打印菜单,PC串口软件发送一个字节数据给开发板,开发板接纳到数据后将读取UnRBR前后的中止标识寄存器IIR的值,以及接纳到的值发送回给PC。假如是0x5a或许0xa5还能够翻开或许封闭LED指示灯。

  1. #defineCCLK120000000
  2. #definePCLK60000000
  3. #definerFIO1DIR(*(volatileunsigned*)(0x20098020))
  4. #definerFIO1MASK(*(volatileunsigned*)(0x20098030))
  5. #definerFIO1PIN(*(volatileunsigned*)(0x20098034))
  6. #definerFIO1SET(*(volatileunsigned*)(0x20098038))
  7. #definerFIO1CLR(*(volatileunsigned*)(0x2009803c))
  8. #definerISER0(*(volatileunsigned*)(0xE000E100))
  9. #definerCLKSRCSEL(*(volatileunsigned*)(0x400FC10C))//时钟源挑选寄存器
  10. #definerPLL0CON(*(volatileunsigned*)(0x400FC080))//PLL0操控寄存器
  11. #definerPLL0CFG(*(volatileunsigned*)(0x400FC084))//PLL0装备寄存器
  12. #definerPLL0STAT(*(volatileunsigned*)(0x400FC088))//PLL0状况寄存器
  13. #definerPLL0FEED(*(volatileunsigned*)(0x400FC08C))//PLL0馈送寄存器
  14. #definerPLL1CON(*(volatileunsigned*)(0x400FC0A0))
  15. #definerPLL1CFG(*(volatileunsigned*)(0x400FC0A4))
  16. #definerPLL1STAT(*(volatileunsigned*)(0x400FC0A8))
  17. #definerPLL1FEED(*(volatileunsigned*)(0x400FC0AC))
  18. #definerCCLKSEL(*(volatileunsigned*)(0x400FC104))//CPU时钟挑选寄存器
  19. #definerUSBCLKSEL(*(volatileunsigned*)(0x400FC108))//USB时钟挑选寄存器
  20. #definerPCLKSEL(*(volatileunsigned*)(0x400FC1A8))//外设时钟寄存器
  21. #definerPCON(*(volatileunsigned*)(0x400FC0C0))
  22. #definerPXCONP(*(volatileunsigned*)(0x400FC0C4))
  23. #definerSCS(*(volatileunsigned*)(0x400FC1A0))//体系操控和状况寄存器
  24. #definerCLKOUTCFG(*(volatileunsigned*)(0x400FC1C8))
  25. #definerIOCON_P0_10(*(volatileunsigned*)(0x4002C028))
  26. #definerIOCON_P0_11(*(volatileunsigned*)(0x4002C02C))
  27. #definerPCONP(*(volatileunsigned*)(0x400FC0C4))
  28. #definerU2LCR(*(volatileunsigned*)(0x4009800C))
  29. #definerU2FDR(*(volatileunsigned*)(0x40098028))
  30. #definerU2DLL(*(volatileunsigned*)(0x40098000))
  31. #definerU2DLM(*(volatileunsigned*)(0x40098004))
  32. #definerU2TER(*(volatileunsigned*)(0x40098030))
  33. #definerU2THR(*(volatileunsigned*)(0x40098000))
  34. #definerU2RBR(*(volatileunsigned*)(0x40098000))
  35. #definerU2FCR(*(volatileunsigned*)(0x40098008))
  36. #definerU2IIR(*(volatileunsigned*)(0x40098008))
  37. #definerU2LSR(*(volatileunsigned*)(0x40098014))
  38. #definerU2IER(*(volatileunsigned*)(0x40098004))
  39. #definerU2ACR(*(volatileunsigned*)(0x40098020))
  40. voidUART2_IRQHandler()
  41. {
  42. unsignedintintId;
  43. chartmp_char;
  44. intId=rU2IIR&0xf;
  45. rU2THR=intId;
  46. if(intId==0xc||intId==0x4)//RDA或许CTI中止
  47. {
  48. rU2LCR&=~(0x1<<7);//DLAB=0
  49. tmp_char=rU2RBR&0xff;
  50. rU2THR=tmp_char;
  51. }
  52. intId=rU2IIR&0xf;
  53. rU2THR=intId;
  54. if(tmp_char==0xa5)
  55. rFIO1PIN|=(1<<18);
  56. elseif(tmp_char==0x5a)
  57. rFIO1PIN&=~(1<<18);
  58. }
  59. voidSystemInit()
  60. {
  61. rSCS&=~(0x1<<4);//频率12M
  62. rSCS|=(0x1<<5);//使能主振荡器
  63. while(0==(rSCS&(0x1<<6)));//等候主振荡器安稳
  64. rCLKSRCSEL=0x1;
  65. rPLL0CFG=0x9;//装备CCLK=120M
  66. rPLL0CON=0x01;
  67. rPLL0FEED=0xAA;
  68. rPLL0FEED=0x55;
  69. while(0==(rPLL0STAT&(0x1<<10)));
  70. rCCLKSEL=(0x1|(0x1<<8));
  71. rPCLKSEL=0x2;//装备PCLK=60M
  72. rCLKOUTCFG=0x0|(0xb<<4)|(0x1<<8);
  73. }
  74. voidInit_Uart2()
  75. {
  76. rPCONP|=0x1<<24;//使能UART2功率操控
  77. rIOCON_P0_10=(rIOCON_P0_10&(~0x7))|0x1;//P0.10P0.11做UART2的发送和接纳管脚
  78. rIOCON_P0_11=(rIOCON_P0_11&(~0x7))|0x1;
  79. rU2LCR|=0x1<<7;//DLAB=1
  80. rU2FDR=1|2<<4;//波特率设置115200
  81. rU2DLM=0;
  82. rU2DLL=22;
  83. rU2LCR&=~(0x1<<7);//DLAB=0
  84. rU2LCR|=0x3;//8位数据位,无校验,1个中止位
  85. rU2TER|=0x1<<7;//使能串口2的发送
  86. rU2IER|=0x1;//使能串口2的接纳中止
  87. rU2FCR|=0x1;//复位FIFO,设置接纳1个字符触发中止
  88. rU2FCR|=0x1<<1|0x1<<2;
  89. rISER0|=0x1<<7;//使能串口2中止
  90. }
  91. voidUart2SendC(charc)
  92. {
  93. rU2THR=c&0xff;
  94. while(!(rU2LSR&(0x1<<5)));//等候rU2THR中的数据发送完结,避免数据溢出
  95. }
  96. voidUart2SendS(char*s)
  97. {
  98. while(*s)
  99. {
  100. Uart2SendC(*s);
  101. s++;
  102. }
  103. }
  104. intmain(void)
  105. {
  106. charstr[]={“\n\r1,DisplaytheU2IIR[3:0]+Data+U2IIR[3:0]\n\r2,Send0x5a—>TurnontheLED\n\r3,Send0xa5—>TurnofftheLED\n\r”};
  107. rFIO1DIR|=(1<<18);//GPIO1.18->OUTPUT
  108. Init_Uart2();
  109. Uart2SendS(str);
  110. while(1);
  111. }

运转成果如下图所示

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/265711.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部