3587|0

87

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

LPC1500+IAR开发环境之串口收发 [复制链接]

前面的《LPC1500+IAR开发环境之LED灯》文章讲了下IAR下如何编译并调试LPC1549的例程,接下来我们就自然而然的要进行串口测试,通信往往是单片机测试必不可少的内容。这次我们打开“periph_uart_rom_polling”这个例程,下面有example,lib和output三个文件夹:

  重点来看example文件夹下的代码,里面有三个文件,iar_startup_lpc15xx.s,sysinit.c,uart_rom_polling.c  .其中iar_startup_lpc15xx.s是LPC1549启动设置的汇编代码,这个不需要改动,sysinit.c设置系统的时钟,有变化的代码是uart_rom_polling.c,我们看一下这个C文件中的main()函数。
  1. int main(void)
  2. {
  3.      SystemCoreClockUpdate();
  4.      Board_Init();
  5.      Init_UART0_PinMux();
  6.      Board_LED_Set(0, false);
复制代码
第一句是更新系统内核时钟,具体怎么操作的,我们要去看库文件的源代码,结合寄存器来理解。Board_Init();是板子相关的初始化函数,Init_UART0_PinMux();这句代码用来初始化我们的串口引脚,这里从名称上看是串口0的复用脚,我推测对应的脚是板上的isp_tx和isp_rx

接下来设置串口函数setupUART();上面的一句注释告诉了我们这个函数的功能,就是分配一个串口的句柄,设置串口的参数,并且初始化这个串口。这个函数的定义在本文件的第82行,可以看到里面定义了串口的模式和时钟,话说这也是我第一次看到串口使用句柄的,应该是为了以后的操作系统服务的。
  1. static void setupUART()
  2. {
  3.         uint32_t ret_value;

  4.         /* 115.2KBPS, 8N1, ASYNC mode, no errors, clock filled in later */
  5.         UART_CONFIG_T cfg = {
  6.                 0,                                /* U_PCLK frequency in Hz */
  7.                 115200,                /* Baud Rate in Hz */
  8.                 1,                                /* 8N1 */
  9.                 0,                                /* Asynchronous Mode */
  10.                 NO_ERR_EN        /* Enable No Errors */
  11.         };

  12.         /* Initialize UART0 */
  13.         Chip_UART_Init(LPC_USART0);

  14.         Chip_Clock_SetUARTFRGDivider(1);

  15.         /* Perform a sanity check on the storage allocation */
  16.         if (LPC_UARTD_API->uart_get_mem_size() > sizeof(uartHandleMEM)) {
  17.                 /* Example only: this should never happen and probably isn't needed for
  18.                    most UART code. */
  19.                 errorUART();
  20.         }

  21.         /* Setup the UART handle */
  22.         uartHandle = LPC_UARTD_API->uart_setup((uint32_t) LPC_USART0, (uint8_t *) &uartHandleMEM);
  23.         if (uartHandle == NULL) {
  24.                 errorUART();
  25.         }

  26.         /* Need to tell UART ROM API function the current UART peripheral clock
  27.              speed */
  28.         cfg.sys_clk_in_hz = Chip_Clock_GetSystemClockRate();

  29.         /* Initialize the UART with the configuration parameters */
  30.         ret_value = LPC_UARTD_API->uart_init(uartHandle, &cfg);
  31.         LPC_SYSCTL->FRGCTRL = ret_value;

  32. }
复制代码


  我们在这里只需要改波特率,数据位和停止校验位等等就OK了,这里我们不做改动。
  串口设置完了之后,开发板就要发送测试信息了,这里使用“putLineUART”进行发送。

  1. static void putLineUART(const char *send_data)
  2. {
  3.         UART_PARAM_T param;

  4.         param.buffer = (uint8_t *) send_data;
  5.         param.size = strlen(send_data);

  6.         /* Polling mode, do not append CR/LF to sent data */
  7.         param.transfer_mode = TX_MODE_SZERO;
  8.         param.driver_mode = DRIVER_MODE_POLLING;

  9.         /* Transmit the data */
  10.         if (LPC_UARTD_API->uart_put_line(uartHandle, ¶m)) {
  11.                 errorUART();
  12.         }
  13. }
复制代码
这里函数里面定义了一个名为param,UART_PARAM_T型的结构体,buffer成员存储需要发送的字符串,size成员记录字符串的长度。设置发送模式为TX_MODE_SZERO,即不需要回车或者换行符就发送字符串。还有相对应的其它两种发射模式,一种是回车换行符发送,一种是回车发送,估计我们也用得比较少。还有发送的驱动模式,这个暂时也不太了解。最后是调用API函数进行发送数据。  接收数据部分和发射对应。
  下面的功能代码就是实现这个测试的步骤,当我们发送任何除“ESC”键的字符(对应的ascll码是27),开发板都会回发我们的字符。如果发送ESC字符,main函数就会打印“ESC key received, exiting”,整个main函数就执行结束了。

   分析完代码,我们上开发板做一下测试。用uart-ttl小板连接开发板的串口,具体连接如下图,注意两个板TX和RX交叉互联。
   
   在IAR里面编译完代码,将periph_uart_rom_polling.bin文件下载进开发板。打开超级终端,配置好对应的串口
   
   开发板上电后,终端上会打印出测试的字样,我们随便输入32个字符进入echo模式,终端上会提示String was truncated, input data longer than receive buffer***
Byte receive with echo
  然后我们可以输入测试的字符,这里就是输入“hello.EEworld!”,按“ESC”键后退出,如果要重新测试,则要复位开发板。
  


此帖出自NXP MCU论坛

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表