W800/W801开发版入门(二)——串口通信UART

2024-05-21 16:56:35 浏览数 (1)

UART简介

通用异步收发传输器,即为UART(Universal Asynchronous Receiver/Transmitter),是一种常见的数据通信协议,用于在计算机和外部设备之间传输数据。UART通信是一种异步通信方式,它通过串行数据传输,允许设备之间以逐位的方式交换信息,并且UART是通用的,因为其的传输速度、数据速度和其他的参数是可配置的。

在UART中,字母"A"代表"异步",表示UART通信不依赖于共享的时钟信号来同步数据传输,而是使用特殊的起始位和停止位来标志数据字的开头和结尾,以便发送器和接收器能够协调数据传输。采用这种异步通信方式使UART非常适用于各种设备之间的数据传输,特别是在需要不同速率的设备之间进行通信时。UART通信较为简单和灵活,可以在很多低速或嵌入式应用中使用。

程序实例

跑马灯实现

w801开发板有7个led灯,分别表示为WM_IO_PB_05/25/26/18/17/16/11,实现跑马灯效果的源代码如下。

代码语言:javascript复制
#include "wm_include.h"

int led[7]={WM_IO_PB_05,WM_IO_PB_25,WM_IO_PB_26,WM_IO_PB_18,WM_IO_PB_17,WM_IO_PB_16,WM_IO_PB_11};

void UserMain(void)
{
	#if DEMO_CONSOLE
		CreateDemoTask(); 
	#endif
	// w801测试板用WM_IO_PB_05/25/26/18/17/16/11
	// W800测试板:PB00是绿,PB01是红,PB02是蓝

	//初始IO
	for(int i=0;i<7;i  ) {
		tls_gpio_cfg(led[i],WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
	}
	
	int i=0;
	while (1){		
		tls_gpio_write(led[i],0); // 0表示灯亮,1表示灯灭
		delay(1000 * 1000);
		tls_gpio_write(led[i],1);
		i  ;
		i %= 7;
	}
}

W800开发板有3个灯,组合成RGB灯,可以组合成多种色彩,分别为WM_IO_PB_00,WM_IO_PB_01,WM_IO_PB_02(绿、红、蓝)

代码语言:javascript复制
#include "wm_include.h"

int led[3]={WM_IO_PB_00,WM_IO_PB_01,WM_IO_PB_02};

void UserMain(void)
{
  
	#if DEMO_CONSOLE
		CreateDemoTask(); 
	#endif
	// w801测试板用WM_IO_PB_05/25/26/18/17/16/11
	// W800测试板:PB00是绿,PB01是红,PB02是蓝

	//初始IO
	for(int i=0;i<3;i  ) {
		tls_gpio_cfg(led[i],WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
	}
	
	int i=0;
	while (1){		
		tls_gpio_write(led[i],0); // 0表示灯亮,1表示灯灭
		delay(1000 * 1000);
		tls_gpio_write(led[i],1);
		i  ;
		i %= 3;
	}
}

UART通信实例

该实例中,开发板通过串口接收到数据,并通过URAT串口0发送接收到的数据。

代码语言:javascript复制
#include "wm_include.h"
#include <string.h>

//定义一个信号量
tls_os_sem_t * sem_rx = NULL;
// 存储收到数据的长度
u16 rx_length = 0;
char rx_fifo_buf[1024] = {0};

// 接收回调函数
s16 my_uart_rx_callback(u16 len, void* user_data) {
	// 释放被获取的信号量
	tls_os_sem_release(sem_rx);
	// 将接收到字符累加
	rx_length  = len;
    return WM_SUCCESS;
}

void UserMain(void){
	printf("n user task n");
	#if DEMO_CONSOLE
		CreateDemoTask();
	#endif
	// 选择待使用的引脚及具体的复用功能
	/* UART0_RX-PB20  UART0_TX-PB19 */
	wm_uart1_rx_config(WM_IO_PB_20);
	wm_uart1_tx_config(WM_IO_PB_19);

	//配置uart参数
	tls_uart_options_t opt;
	opt.baudrate = UART_BAUDRATE_B115200; //波特率
	opt.paritytype = TLS_UART_PMODE_DISABLED; //无奇偶校验
	opt.stopbits = TLS_UART_ONE_STOPBITS; //一个停止位
	opt.charlength = TLS_UART_CHSIZE_8BIT; //数据长度
	opt.flow_ctrl = TLS_UART_FLOW_CTRL_NONE; //没有流控制
	
	if (WM_SUCCESS != tls_uart_port_init(TLS_UART_0, &opt, 0))
	{
		printf("uart0 init errorn");
	}
	//为串口绑定接收回调函数
	tls_uart_rx_callback_register((u16) TLS_UART_0, (s16(*)(u16, void*))my_uart_rx_callback, NULL); 
	
	//用于判断信号量是否成功获取
	tls_os_status_t os_status  = TLS_OS_ERROR;
	
	//创建信号量,用于回调函数和线程之间通信
	tls_os_sem_create(&sem_rx, 0);
	
	// 接收数据长度
	u16_t rx_len = 0;
	
	while(1) {
		os_status = tls_os_sem_acquire(sem_rx, 20);
		if(os_status) {
			if(rx_length > 0) {				
				rx_len = tls_uart_read(TLS_UART_0, rx_fifo_buf, rx_length);//串口0接收到的数据
				
				// 去除接收到的字符中的换行符
				for (int i = 0; i < rx_len; i  ) {
					if (rx_fifo_buf[i] == 'r' || rx_fifo_buf[i] == 'n') {
						rx_fifo_buf[i] = '';
						rx_length = i;
						break;
					}
				}
				
				printf("长度:%d;字符:%sn",rx_length,rx_fifo_buf);
				rx_length = 0;
				tls_uart_write(TLS_UART_0, rx_fifo_buf, rx_len); //串口0发送数据
			}
		}
	}
}

参考

  1. W801芯片产品规格书_V2.0.pdf
  2. W801_寄存器手册_V3.0.pdf
  3. W801芯片设计指导书V3.1.pdf

0 人点赞