前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >W800/W801开发版入门(二)——串口通信UART

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

作者头像
鳄鱼儿
发布2024-05-21 16:56:35
1240
发布2024-05-21 16:56:35
举报

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 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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • UART简介
  • 程序实例
    • 跑马灯实现
      • UART通信实例
      • 参考
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档