前面的《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()函数。
- int main(void)
- {
- SystemCoreClockUpdate();
- Board_Init();
- Init_UART0_PinMux();
- Board_LED_Set(0, false);
复制代码 第一句是更新系统内核时钟,具体怎么操作的,我们要去看库文件的源代码,结合寄存器来理解。Board_Init();是板子相关的初始化函数,Init_UART0_PinMux();这句代码用来初始化我们的串口引脚,这里从名称上看是串口0的复用脚,我推测对应的脚是板上的isp_tx和isp_rx
接下来设置串口函数setupUART();上面的一句注释告诉了我们这个函数的功能,就是分配一个串口的句柄,设置串口的参数,并且初始化这个串口。这个函数的定义在本文件的第82行,可以看到里面定义了串口的模式和时钟,话说这也是我第一次看到串口使用句柄的,应该是为了以后的操作系统服务的。
- static void setupUART()
- {
- uint32_t ret_value;
- /* 115.2KBPS, 8N1, ASYNC mode, no errors, clock filled in later */
- UART_CONFIG_T cfg = {
- 0, /* U_PCLK frequency in Hz */
- 115200, /* Baud Rate in Hz */
- 1, /* 8N1 */
- 0, /* Asynchronous Mode */
- NO_ERR_EN /* Enable No Errors */
- };
- /* Initialize UART0 */
- Chip_UART_Init(LPC_USART0);
- Chip_Clock_SetUARTFRGDivider(1);
- /* Perform a sanity check on the storage allocation */
- if (LPC_UARTD_API->uart_get_mem_size() > sizeof(uartHandleMEM)) {
- /* Example only: this should never happen and probably isn't needed for
- most UART code. */
- errorUART();
- }
- /* Setup the UART handle */
- uartHandle = LPC_UARTD_API->uart_setup((uint32_t) LPC_USART0, (uint8_t *) &uartHandleMEM);
- if (uartHandle == NULL) {
- errorUART();
- }
- /* Need to tell UART ROM API function the current UART peripheral clock
- speed */
- cfg.sys_clk_in_hz = Chip_Clock_GetSystemClockRate();
- /* Initialize the UART with the configuration parameters */
- ret_value = LPC_UARTD_API->uart_init(uartHandle, &cfg);
- LPC_SYSCTL->FRGCTRL = ret_value;
- }
复制代码
我们在这里只需要改波特率,数据位和停止校验位等等就OK了,这里我们不做改动。
串口设置完了之后,开发板就要发送测试信息了,这里使用“putLineUART”进行发送。
- static void putLineUART(const char *send_data)
- {
- UART_PARAM_T param;
- param.buffer = (uint8_t *) send_data;
- param.size = strlen(send_data);
- /* Polling mode, do not append CR/LF to sent data */
- param.transfer_mode = TX_MODE_SZERO;
- param.driver_mode = DRIVER_MODE_POLLING;
- /* Transmit the data */
- if (LPC_UARTD_API->uart_put_line(uartHandle, ¶m)) {
- errorUART();
- }
- }
复制代码 这里函数里面定义了一个名为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”键后退出,如果要重新测试,则要复位开发板。