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

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,实现跑马灯效果的源代码如下。

c 复制代码
#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(绿、红、蓝)

c 复制代码
#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发送接收到的数据。

cpp 复制代码
#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 error\n");
	}
	//为串口绑定接收回调函数
	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] = '\0';
						rx_length = i;
						break;
					}
				}
				
				printf("长度:%d;字符:%s\n",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
相关推荐
乐吾乐科技2 小时前
乐吾乐大屏可视化组态软件【SQL数据源】
物联网·信息可视化·编辑器·数据可视化·大屏端
骥龙3 小时前
XX汽集团数字化转型:全生命周期网络安全、数据合规与AI工业物联网融合实践
人工智能·物联网·web安全
我在看你呵呵笑3 小时前
GD32VW553-IOT开发板移植适配openharmony
物联网·华为·harmonyos
御控工业物联网4 小时前
御控物联网远程控制水泵启停智能自控解决方案
物联网·智慧水务·水泵远程监控·泵站智能监控·联动控制
EasyControl移动设备管理6 小时前
更智能的零售终端设备管理:合规、安全与高效
物联网·零售·远程管理·mdm(移动设备管理)·租赁行业数字化
代码总长两年半12 小时前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)
stm32·单片机·物联网
TDengine (老段)12 小时前
TDengine 选择函数 Max() 用户手册
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
猫头虎13 小时前
2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
stm32·单片机·嵌入式硬件·物联网·硬件架构·51单片机·硬件工程
中科岩创15 小时前
某排水涵洞结构安全自动化监测
人工智能·物联网·自动化
伴杯猫1 天前
【ESP32-IDF】基础外设开发2:系统中断矩阵
c语言·单片机·嵌入式硬件·mcu·物联网·github