57 系列_串口外设的使用说明
📎 原始文档:https://www.kdocs.cn/l/caO9b3DX8pW7 TOC \o "1-3" \h \u HYPERLINK \l _Toc19618 一、概述 PAGEREF _Toc19618 \h 2
HYPERLINK \l _Toc6229 二、SDK中带DMA串口的相关配置 PAGEREF _Toc6229 \h 3
HYPERLINK \l _Toc30548 三、DMA串口程序例程 PAGEREF _Toc30548 \h 4
HYPERLINK \l _Toc3645 四、普通串口程序例程 PAGEREF _Toc3645 \h 5
HYPERLINK \l _Toc32579 五、串口开发过程可能遇到的问题 PAGEREF _Toc32579 \h 6
HYPERLINK \l _Toc22178 1、使用串口模块测试过程中接收不稳定,一直收到奇奇怪怪的数据 PAGEREF _Toc22178 \h 6
HYPERLINK \l _Toc11807 2、 特殊串口接受数据频率较高时(大概10ms以下),会异常中断 PAGEREF _Toc11807 \h 6
HYPERLINK \l _Toc14351 3、 特殊串口接收1k或者更大的数据,概率性收不全 PAGEREF _Toc14351 \h 7
HYPERLINK \l _Toc11644 4、 串口测试主控没有接收到数据。 PAGEREF _Toc11644 \h 8
HYPERLINK \l _Toc1582 5、 Dev_open串口的时候打印@@@@@@ PAGEREF _Toc1582 \h 10
HYPERLINK \l _Toc14620 6、 长时间老化通信测试,出现概率跑飞,说明如图5.10: PAGEREF _Toc14620 \h 10
HYPERLINK \l _Toc29044 7、 带DMA的串口接收数据的三种方式: PAGEREF _Toc29044 \h 11
HYPERLINK \l _Toc31858 8、 多串口input_channel如何配置 PAGEREF _Toc31858 \h 12
一、概述
57系列IC 串口总共有4组,其中串口0、串口1支持DMA方式,串口2、串口3则只支持普通中断方式,如图1.1 没有DMA功能的串口是没有相关DMA寄存器的。
图1.1
注意:
1、本文档是基于AC57xx_release_sdk_V3.0.3 SDK 提供57系列芯片使用串口外设的demo,其他57系列SDK版本基本适用;硬件环境基于AC5701_V1.1开发顶板。
2、关于串口寄存器等详细信息请联系助理或者代理申请《AC570X用户手册v1.0》。
二、SDK中带DMA串口的相关配置
请用户参照如下配置,结合硬件和自身需求进行修改:
app_config.h相关配置,如图2.1:
图2.1
板级文件配置,如图2.2,图2.3:
图2.2

图2.3
三、DMA串口程序例程
参照第二章节完成基础配置后请添加带DMA的特殊串口例程文件到工程,见附件一:
EMBED Package
附件一
按照图3.1步骤加入该demo到工程并按照图3.2添加逻辑代码之后,全保存然后编译下载到开发板。接入串口调试工具将会看到“spec_uart demo.”字符串,然后用户通过串口工具向开发板发送任意字符串看到开发板所接收的打印,则代表开发板特殊串口功能正常。

图3.1 图3.2
四、普通串口程序例程
添加如下例程文件到工程,关于配置以及描述见demo附件文件附件二。
EMBED Package
附件二
加入该demo到工程之后,全保存然后编译下载到开发板。接入串口调试工具将会看到“general_uart_task demo.”字符串,然后用户通过串口工具向开发板发送任意字符串看到开发板所接收的打印,则代表开发板特殊串口功能正常。
五、串口开发过程可能遇到的问题
1、使用串口模块测试过程中接收不稳定,一直收到奇奇怪怪的数据
检查开发板与模块是否共地。
特殊串口接受数据频率较高时(大概10ms以下),会异常中断 加大uart_circlebuf或者接收频率降低即可。
特殊串口接收1k或者更大的数据,概率性收不全 接收buffer要跟板级文件设置的串口buffer长度需要相应加大。
app_config.h相关配置如图5.1:
图5.1
板级文件相关配置如图5.2:
图5.2
spec_uart.c相关配置如图5.3:
图5.3
- 串口测试主控没有接收到数据。 首先应确保硬件通路的连接是没问题的,然后则需要怀疑是GPIO被复用导致的串口功能被抢占。下面请根据如下步骤解除GPIO被复用的状态:
以5701芯片为例,其引脚描述见《AC5701A Datasheet V1.0_20190615.pdf》, 应用场景使用UART0、PA7做RX为例,则该GPIO可能会被sensor0 B组、UART0 TX、SD2 A组所占用,如图5.4。
图5.4
sensor0 B组、SD2 A组均需要通过检查板级设备表、设备结构体去,做相应的修改或者屏蔽,以确保其不会占用PA7,如图5.5。
图5.5
设置IOMC3寄存器BIT3解除UART0对gpio的占用,然后重新映射PA7为串口0的RX功能脚,如图5.6:
图5.6
以上操作已经能解除了串口的复用情况了,如果还收取不到串口数据,此时应当检查uart_input_ch的配置,带DMA串口检查如图5.7,普通串口检查如图5.8:
图5.7
图5.8
最后如果是寄存器方式实现的串口,检查中断优先级和cpu_id,参考如图5.9:
图5.9
串口TX输出没有数据:请检查outputchannel是否被其他外设复用,打印IOMC1寄存器对比手册可以定位到哪个外设占用;
Dev_open串口的时候打印@@@@@@ name = uart1就没往下跑了;请检查板级配置outputchannel是否和其他外设有冲突。
长时间老化通信测试,出现概率跑飞,说明如图5.10:

图5.10
7. 带DMA的串口接收数据的三种方式: 第一种 接收启用阻塞方式,该方式底层将使用信号量管理线程,操作系统线程效率较高,推荐使用,配置如图5.11。
图5.11
第二种 串口接收完指定长度才返回的方式,该方式建议同时开启接收阻塞方式使用,配置如图5.12。
图5.12
第三种方式就是非阻塞方式,只需要设置前面两种为失能状态即可进入非阻塞接收。
此种方式相比前面两种操作系统线程效率较低。
- 多串口input_channel如何配置 设置uart1的input_channel为2。uart3的input_channel为3。
Uart1实际上输入测试发现不可用,板级配置如下图8.1:。
图8.1
底层设置代码如下图8.2,input_channel为2,对应就是配置好了cap_input_channel。

图8.2
但是UART底层没有选择cap_input_channel作为串口IO输入的相关逻辑。
导致输入映射测试异常,解决办法:
打开uart1设备后配置IOMC3[6:4]为110b即可(选择cap_input_channel作为串口IO输入),寄存器描述如图8.4。
| 1. uart_dev_handle = dev_open("uart1", 0);
2. ASSERT(uart_dev_handle != NULL, "open uart err");
3.// IOMC3 &= ~(0x70);//选择wkup0_input_channel作为串口1输入
4.// IOMC3 |= (0x40);
5. IOMC3 &= ~(0x70);//选择cap_input_channel作为串口1输入
6. IOMC3 |= (0x60);
7.// IOMC3 &= ~(0x70);//选择irflt_input_channel作为串口1输入
8.// IOMC3 |= (0x50);
9.// IOMC3 &= ~(0x70);//选择uart_input_channel作为串口1输入
10.// IOMC3 |= (0x70); | | --- |

图8.4
杰理科技
2023年2月2日