目录
1. PKE8720DF-C13-F10开发板UART端口配置
2. Arduino添加 “UART 回送用户输入的单个字符” Sketch code
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中一致):
右下窗口为输入的字符,左边窗口为回显的字符,符合实验预期: