学会Zynq(25)UART的基本使用方法 - 物联网开发 - 深圳网站建设,微信APP开发,网店装修,艺之都网络公司官网

物联网开发



学会Zynq(25)UART的基本使用方法

点击数:42019-04-01 16:59:03 来源: 深圳网站建设,微信APP开发,网店装修,艺之都网络公司官网

SDK程序设计
Vivado中配置Zynq时启用开发板提供的UART接口。SDK中user_uart.h文件代码如下:

#ifndef SRC_USER_UART_H_
#define SRC_USER_UART_H_

#include "xparameters.h"
#include "xuartps.h"
#include "xil_printf.h"
#include "sleep.h"

#define UART_DEVICE_ID                  XPAR_XUARTPS_0_DEVICE_ID

int Uart_Send(XUartPs* Uart_Ps, u8 *sendbuf, int length);
int Uart_Init(XUartPs* Uart_Ps, u16 DeviceId);

#endif /* SRC_USER_UART_H_ */

user_uart.c文件的代码如下:

#include "user_uart.h"

// UART格式
XUartPsFormat uart_format =
{
9600,
//XUARTPS_DFT_BAUDRATE,   //默认波特率 115200
XUARTPS_FORMAT_8_BITS,
XUARTPS_FORMAT_NO_PARITY,
XUARTPS_FORMAT_1_STOP_BIT,
};

//--------------------------------------------------------------
//                     UART初始化函数
//--------------------------------------------------------------
int Uart_Init(XUartPs* Uart_Ps, u16 DeviceId)
{
int Status;
XUartPs_Config *Config;

/*  初始化UART设备    */
Config = XUartPs_LookupConfig(DeviceId);
if (NULL == Config) {
return XST_FAILURE;
}
Status = XUartPs_CfgInitialize(Uart_Ps, Config, Config->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}

/*  UART设备自检  */
Status = XUartPs_SelfTest(Uart_Ps);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}

/*  设置UART模式与参数   */
XUartPs_SetOperMode(Uart_Ps, XUARTPS_OPER_MODE_NORMAL); //正常模式
XUartPs_SetDataFormat(Uart_Ps, &uart_format);    //设置UART格式

return XST_SUCCESS;
}

//--------------------------------------------------------------
//                     UART数据发送函数
//--------------------------------------------------------------
int Uart_Send(XUartPs* Uart_Ps, u8 *sendbuf, int length)
{
int SentCount = 0;

while (SentCount < length) {
SentCount += XUartPs_Send(Uart_Ps, &sendbuf[SentCount], 1);
}

return SentCount;
}

main.c文件的代码如下:

#include "user_uart.h"

XUartPs Uart_Ps; /* The instance of the UART Driver */

int main(void)
{
int Status;
u8 sendbuf[] = "Hello World! ";
/* 串口初始化 */
Status = Uart_Init(&Uart_Ps, UART_DEVICE_ID);
if (Status == XST_FAILURE) {
xil_printf("Uartps Failed ");
return XST_FAILURE;
}

while (1)
{
sleep(1);
Uart_Send(&Uart_Ps, sendbuf, 14);
}

return Status;
}

SDK Terminal中添加串口,波特率设置为程序制定的9600,运行程序,将看到每隔1s打印一次“Hello World!”。


相关API函数
1.UART初始化
对UART设备初始化操作和前面GPIO设备、中断设备、定时器设备、XADC设备的初始化过程一样,不再赘述。接着使用XUartPs_SelfTest函数对UART设备自检。

s32 XUartPs_SelfTest(XUartPs *InstancePtr)
1
这个函数执行一次本地回环,验证可以正常发送和接受数据。返回XST_UART_TEST_FAIL表示测试失败;XST_SUCCESS表示测试成功。我们可以用这个函数检查硬件工作是否正常。

2.模式配置
初始化函数中还用XUartPs_SetOperMode函数设置了UART的工作模式。工作模式在xuartps.h文件中宏定义。

void XUartPs_SetOperMode(XUartPs *InstancePtr, u8 OperationMode)
1
四种工作模式的作用请参考第24篇。下表给出每种模式的宏定义:

宏定义 实际值 工作模式
XUARTPS_OPER_MODE_NORMAL 0x00U 正常模式
XUARTPS_OPER_MODE_AUTO_ECHO 0x01U 自动echo模式
XUARTPS_OPER_MODE_LOCAL_LOOP 0x02U 本地回环模式
XUARTPS_OPER_MODE_REMOTE_LOOP 0x03U 远程回环模式
3.格式配置
接下来使用XUartPs_SetDataFormat函数设置UART的数据格式,包括波特率、数据位数、停止位数和奇偶校验。调用此函数时应确保UART没有收发数据。

s32 XUartPs_SetDataFormat(XUartPs *InstancePtr, XUartPsFormat * FormatPtr)
1
如果设置成功则返回XST_SUCCESS;如果该波特率在当前参考时钟频率下无法实现,则返回XST_UART_BAUD_ERROR表示无法设置波特率;函数的任意一个输入参数无效时返回XST_INVALI_PARAM。

我们绝大多数情况下都会使用“8位数据、1位停止、无奇偶校验”,因此如果想进一步提高程序效率,可以仅使用XUartPs_SetBaudRate函数来设置波特率。

s32 XUartPs_SetBaudRate(XUartPs *InstancePtr, u32 BaudRate)
1
使用该函数也会检查输入的波特率值是否有效。检查的依据是xuartps.c中下面这个宏定义,即最大允许的波特率错误率:

#define XUARTPS_MAX_BAUD_ERROR_RATE  3U /* max % error allowed */
1
其实质上是波特率生成器产生的实际波特率与设置的波特率之间的差值。如果不满足这个条件,便会返回XST_UART_BAUD_ERROR,保持原有波特率不变。

4.数据格式
上面的函数中使用了XuartPsFormat类型的结构体来设置UART格式。该结构体原型如下:

typedef struct {
u32 BaudRate; /**< In bps, ie 1200 */
u32 DataBits; /**< Number of data bits */
u32 Parity; /**< Parity */
u8 StopBits; /**< Number of stop bits */
} XUartPsFormat;

下表总结了与数据格式相关的宏定义,使用时要将其填到结构体变量的对应位置。一般波特率可以写成数字形式,其余三个成员都要用宏定义的形式。

宏定义 实际值 工作模式
数据位
XUARTPS_FORMAT_8_BITS 0U 8-bits数据位
XUARTPS_FORMAT_7_BITS 2U 7-bits数据位
XUARTPS_FORMAT_6_BITS 3U 6-bits数据位
奇偶校验
XUARTPS_FORMAT_NO_PARITY 4U 无奇偶校验
XUARTPS_FORMAT_MARK_PARITY 3U 校验位始终为1
XUARTPS_FORMAT_SPACE_PARITY 2U 校验位时钟为0
XUARTPS_FORMAT_ODD_PARITY 1U 奇校验
XUARTPS_FORMAT_EVEN_PARITY 0U 偶校验
停止位
XUARTPS_FORMAT_2_STOP_BIT 2U 2-bits停止位
XUARTPS_FORMAT_1_5_STOP_BIT 1U 1.5-bits停止位
XUARTPS_FORMAT_1_STOP_BIT 0U 1-bit停止位
波特率
XUARTPS_MAX_RATE 921600U 最大波特率
XUARTPS_MIN_RATE 110U 最小波特率
XUARTPS_DFT_BAUDRATE 115200U 默认波特率
5.数据发送
程序中使用XUartPs_Send函数发送数据。这个函数是非阻塞的,轮询模式和中断驱动模式下都可以使用。它会尽可能地想TxFIFO填充数据,并返回发送的字节数;如果无法填充,会返回0表示发送了0字节,便于用户处理。

中断模式下,该函数会发送指定的缓冲区(Buffer)中的内容,中断处理程序负责将所有数据全部发送完。此时会调用绑定的回调函数,标识发送完成。关于中断的用法在后面文章中专门介绍。

u32 XUartPs_Send(XUartPs *InstancePtr, u8 *BufferPtr, u32 NumBytes)
1
第二个参数是指向要发送的数据缓冲区的指针;第三个参数是发送的字节数;返回值标识实际发送的字节数。本例程序中就是利用返回值确保所有数据都依次发送(虽然本例的数量不大,但要学习这个用法)。

这个函数还有个特殊用法,如果将第三个参数设为0,则会停止正在进行的发送操作,并将已经在TxFIFO中的所有数据都发送出去。可以用这个用法实现某些特殊功能。

优势

SUPERIORITY

为一流企业提供金牌网络服务

我们为客户提供一站式服务,没有最好的方案,只有最适合每个企业的设计方案……

理念

IDEA

持续追求更高品质

艺之都团队的十年,是一个典型的技术团队成长的十年。一群年轻人,追着梦想,从无到有,从痴迷小组到精英团队艺之都从成立的那一天开始永放光芒……

售前咨询
0755-33563420
免费网络问题咨询
免费网络解决方案策划
免费网站问题诊断
免费网店问题诊断
免费网站网店推广咨询
服务与支持
网站建设
微信开发
APP开发
网店装修
网站推广
网店运营
大数据服务
营销培训
服务器租赁
账号与支持
合同申请
转账付款
线下汇款
索取发票
快速入口
网站管理
备案管理
账号管理
域名信息查询
域名控制台
服务器控制台
其他服务
客户案例
新品活动
海外服务
技术论坛
注册公司
财务代理
VI设计
资源推荐
提交建议
关注艺之都网络
企业决策者必读
艺之都网络APP
艺之都微信
艺之都微博
艺之都服务中心

核心产品:  营销型网站系统  微信分销商城系统  网店运营系统  大数据精准营销系统  域名注册备案  游戏开发运营

增值服务:  工商注册  财务代理  VI设计  LOGO设计  营销策划  网站备案  短信服务  企业邮箱  WHOIS查询  网站模板  服务器维护

更多推荐:  企业线上方案  品牌线上方案  线上商城方案  社交直播方案  医疗网络方案  旅游线上方案  精准营销方案

关于艺之都    法律声明    廉政举报    荣誉查询    友情链接

艺之都网络  深圳网站建设  东莞网站建设  广州网站建设  上海网站建设  北京网站建设  南阳网站建设  【添加分公司链接】

2007-2019 yizhidou.com 版权所有粤ICP备:14099120号-3

深圳市艺之都网络科技有限公司  深圳市龙岗区坂田商业广场禾田步行街二层