在线时间954 小时
UID336767
注册时间2011-12-29
NXP金币725
TA的每日心情 | 开心 2018-7-23 21:04 |
---|
签到天数: 103 天 连续签到: 1 天 [LV.6]常住居民II
金牌会员
 
- 积分
- 16706
- 最后登录
- 1970-1-1
|
本帖最后由 lkl0305 于 2016-11-15 23:02 编辑
UART串口在单片机中是非常重要的资源。而且现在有很多外设模块采用串口与MCU通信。这次分享一下我对LPC824lite串口的使用的体会。
在LPC82X的MCU中有3个串口。分别是UART0、UART1、UART2。
他们所包含的寄存器如下,相对还是比较简单的,当然,如果使用库编程,这些寄存器很多还是不需要过多了解,用到那个不清楚再看不迟。
由于LPC824lite默认使用UART1映射到虚拟串口,所以为了测试学习,我采用UART0。
当然首先要选择那个I/O引脚作为UART。
由于LPC824lite具有开关矩阵功能,可以将功能映射到任意I/O,比较方便,这里我选择了P0.18和P0.19。
首先要关闭默认的功能,查了一下数据手册,可以看到P0.18和P0.19默认给了ADC7和ADC8。
因此使用下面函数关闭相关功能
可以看到U0的引脚可以映射到P0.0-P0.28任意引脚
使用如下函数映射到18和19引脚
比照这相关虚拟串口首先对UART0进行初始化
在主函数调用相关阻塞方式输出测试字符串。
链接硬件,并将程序下载到开发板中
可以看出使用虚拟串口输出的信息。
自己写的UART0的测试输出也是正确的。
这里简单所以下需要用到的一些库函数
首先是UART的允许/使能函数
这个是禁止/是能TX发送功能
下面是初始化函数,当然还有一些其他的函数,这里就不过多说了。
在使用UART发送接收数据使用的函数经常用到,库中提供了比较多,而且成对出现,分别是:
这个是非阻塞方式下的发送和接收若干字节函数,由于是非阻塞方式,在使用时一般配合中断使用
下面是阻塞方式下的发送和接收函数,接收和发送指定字节的数据后函数才返回,这里注意没有设定超时时间。
下面这个是LPC824lite库中特有的,串行发送和接收数据时,使用环形数据缓冲区方式,也是一种常用的方法。
在使用库函数进行串口操作时,一定要选择好相应的函数,比如阻塞与非阻塞,是否采用环形缓冲器等。
最后上一下测试程序:
- #if defined (__USE_LPCOPEN)
- #if defined(NO_BOARD_LIB)
- #include "chip.h"
- #else
- #include "board.h"
- #endif
- #endif
- #include <cr_section_macros.h>
- // TODO: insert other include files here
- #include "delay/delay.h"
- // TODO: insert other definitions and declarations here
- const uint8_t txBuffer[] = "Hello, world! this is a test of UART0!\r\n";
- /***********************************************************
- * 设置P0.18和P0.19为USART0的引脚
- * 配置为数据位8,停止位1,无校验,波特率115200bps,
- ***********************************************************/
- void Uart0_Init(void)
- {
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
- Chip_SWM_DisableFixedPin(SWM_FIXED_ADC7);
- Chip_SWM_DisableFixedPin(SWM_FIXED_ADC8);
- Chip_Clock_SetUARTClockDiv(1);
- Chip_SWM_MovablePinAssign(SWM_U0_TXD_O, 18);
- Chip_SWM_MovablePinAssign(SWM_U0_RXD_I, 19);
- Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
- Chip_UART_Init(LPC_USART0);
- Chip_UART_ConfigData(LPC_USART0, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1);
- Chip_Clock_SetUSARTNBaseClockRate((115200 * 6 * 16), true);
- Chip_UART_SetBaud(LPC_USART0, 115200);
- Chip_UART_Enable(LPC_USART0);
- Chip_UART_TXEnable(LPC_USART0);
- }
- int main(void) {
- #if defined (__USE_LPCOPEN)
- // Read clock settings and update SystemCoreClock variable
- SystemCoreClockUpdate();
- #if !defined(NO_BOARD_LIB)
- // Set up and initialize all required blocks and
- // functions related to the board hardware
- Board_Init();
- // Set the LED to the state of "On"
- Board_LED_Set(0, true);
- #endif
- #endif
- // TODO: insert code here
- DelayInit(SystemCoreClock);
- Uart0_Init();
- // Force the counter to be placed into memory
- volatile static int i = 0 ;
- // Enter an infinite loop, just incrementing a counter
- while(1) {
- Chip_UART_SendBlocking(LPC_USART0, txBuffer, sizeof(txBuffer));
- DEBUGSTR("Hello, world!\r\n");
- DelayMs(2000);
- i++ ;
- }
- return 0 ;
- }
复制代码
|
|