Arduino 配置PKE8720DF-C13-F10开发板 —— UART基于中断回送用户输入的8个字符

 目录

1. PKE8720DF-C13-F10开发板UART端口配置 

2. Arduino添加 “UART 回送用户输入的单个字符” Sketch code

3.代码解析

4.连接开发板

(1)材料准备

 (2)电路连接

(3)端口查看

(4)Arduino 编译和烧录

5.实验结果


1. PKE8720DF-C13-F10开发板UART端口配置 

如下图所示,PKE8720DF-C13-F10提供三组UART:

(1)SERIAL1_TX(PB19) ,SERIAL1_RX(PB18);(本文选择这一组)

(2)SERIAL2_TX(PA12) ,SERIAL2_RX(PA13);

(3)LOG_TX(PA7), LOG_RX(PA8)。

PKE8720DF-C13-F10开发板简介 与 配置Arduino开发环境 请参照上一篇文章 :Arduino 配置PKE8720DF-C13-F10开发板——“Blink” 周期性点亮LED灯_zoey_O_o__的博客-CSDN博客

2. Arduino添加 “UART 基于中断回送用户输入的8个字符” Sketch code

由于Arduino 基于board“ AMB25/AMB26 (RTL8720DF) ”没有直接可用的UART Examples,这里我们需要自己新建一个sketch:

 具体code 如下:

#include "device.h"
#include "serial_api.h"
#include "serial_ex_api.h"

#define UART_TX PB_19
#define UART_RX PB_18

#define SRX_BUF_SZ 16

char rx_buf[SRX_BUF_SZ]={0};
volatile uint32_t tx_busy=0;
volatile uint32_t rx_done=0;


void uart_send_string_done(uint32_t id)
{
	serial_t    *sobj = (serial_t*)id;
	tx_busy = 0;
}

void uart_recv_string_done(uint32_t id)
{
	serial_t    *sobj = (serial_t*)id;
	rx_done = 1;
}

void uart_send_string(serial_t *sobj, char *pstr)
{
	int32_t ret=0;

	if (tx_busy) {
		return;
	}
	tx_busy = 1;
	ret = serial_send_stream(sobj, pstr, _strlen(pstr));
	if (ret != 0) {
		DiagPrintf("%s Error(%d)\n", __FUNCTION__, ret);        
		tx_busy = 0;
	}
}

serial_t    sobj;

void setup() {
  // put your setup code here, to run once:  
	serial_init(&sobj,UART_TX,UART_RX);
	serial_baud(&sobj,38400);
	serial_format(&sobj, 8, ParityNone, 1);

    serial_send_comp_handler(&sobj, (void*)uart_send_string_done, (uint32_t) &sobj);
	serial_recv_comp_handler(&sobj, (void*)uart_recv_string_done, (uint32_t) &sobj);

  uart_send_string(&sobj, "\r\n");
}

void loop() {
  // put your main code here, to run repeatedly:
  int ret;
  ret = serial_recv_stream(&sobj, rx_buf, 8);
	if (ret) {
		DiagPrintf(" %s: Recv Error(%d)\n", __FUNCTION__, ret);        
		rx_done = 1;
	}

  	while (1) {
#if 0
		if (!tx_busy) {
        uart_send_string(&sobj, "Hello! World!! :) \r\n");			
		}
#endif
		if (rx_done) {
			uart_send_string(&sobj, rx_buf);
			rx_done = 0;
			ret = serial_recv_stream(&sobj, rx_buf, 8);
            		if (ret) {
               		DiagPrintf(" %s: Recv Error(%d)\n", __FUNCTION__, ret);        
                		rx_done = 1;
            		}
		}
	}
}

3.代码解析

包含的三个头文件 "device.h" ,"serial_api.h" 和 "serial_ex_api.h" 为了调用实现UART功能的函数,可以在源码中查询GitHub - ambiot/ambd_arduino: AmebaD Arduino third-party package SDK

 定义TX,RX的pin 脚:

#define UART_TX PB_19
#define UART_RX PB_18

定义serial对象:

serial_t    sobj;

定义rx_buf和buf_size:

#define SRX_BUF_SZ 16

char rx_buf[SRX_BUF_SZ]={0};

定义tx_busy和rx_done变量:

volatile uint32_t tx_busy=0;
volatile uint32_t rx_done=0;

void uart_send_string_done(uint32_t id)
{
	serial_t    *sobj = (serial_t*)id;
	tx_busy = 0;
}

void uart_recv_string_done(uint32_t id)
{
	serial_t    *sobj = (serial_t*)id;
	rx_done = 1;
}

定义“uart_send_string” 函数:

void uart_send_string(serial_t *sobj, char *pstr)
{
	int32_t ret=0;

	if (tx_busy) {
		return;
	}
	tx_busy = 1;
	ret = serial_send_stream(sobj, pstr, _strlen(pstr));
	if (ret != 0) {
		DiagPrintf("%s Error(%d)\n", __FUNCTION__, ret);        
		tx_busy = 0;
	}
}

由上述两段代码可以看出uart在发送字符串时,tx_busy会被设为1;发送完成后,tx_busy会被设为0;uart_done在接收字符串后会被设为1。

配置 setup函数:

void setup() {
  // put your setup code here, to run once:  
    serial_init(&sobj,UART_TX,UART_RX);
	serial_baud(&sobj,38400);
	serial_format(&sobj, 8, ParityNone, 1);

    serial_send_comp_handler(&sobj, (void*)uart_send_string_done, (uint32_t) &sobj);
	serial_recv_comp_handler(&sobj, (void*)uart_recv_string_done, (uint32_t) &sobj);

    uart_send_string(&sobj, "\r\n");
}

初始化UART设备,serial_send_comp_handler:TX完成回调函数;serial_recv_comp_handler:RX完成回调函数。

 配置loop函数:

void loop() {
  // put your main code here, to run repeatedly:
  int ret;
  ret = serial_recv_stream(&sobj, rx_buf, 8);
	if (ret) {
		DiagPrintf(" %s: Recv Error(%d)\n", __FUNCTION__, ret);        
		rx_done = 1;
	}

  	while (1) {
#if 0
		if (!tx_busy) {
        uart_send_string(&sobj, "Hello! World!! :) \r\n");			
		}
#endif
		if (rx_done) {
			uart_send_string(&sobj, rx_buf);
			rx_done = 0;
			ret = serial_recv_stream(&sobj, rx_buf, 8);
            		if (ret) {
               		DiagPrintf(" %s: Recv Error(%d)\n", __FUNCTION__, ret);        
                		rx_done = 1;
            		}
		}
	}
}

function “serial_recv_stream” 对接收目标长度(本文设置的是8)数据使用中断模式。如果rx_done=1,则将字符串通过uart_send_string回显出来。

4.连接开发板

(1)材料准备

  • 1 块 PKE8720DF-C13-F10开发板
  • 1 根 USB转type-C数据线
  • 1 块 USB转TTL adapter
  • 3 根 杜邦线

 (2)电路连接

UART_TX(_PB_19)连接到USB转TTL adapter上面的RX;

UART_RX(_PB_18)连接到USB转TTL adapter上面的TX;

将USB转TTL adapter上面的GND接到板子上的GND,如下图所示:

(3)端口设置与烧录

请参考上一篇文章:Arduino 配置PKE8720DF-C13-F10开发板 —— UART回送用户输入的单个字符_zoey_O_o__的博客-CSDN博客

5.实验结果

UART 结果从 USB转TTL的adapter(COM24)输出,选择Trace tool来观察实验结果,实验前需要配置如下参数(与code中一致):

 右下窗口为输入的字符,左边窗口为回显的字符,符合实验预期:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值