CC3220学习笔记---UART的使用(翻译)

news/2024/11/30 15:31:00/
关于UART的使用方法,TI有详细文档说明。请参考驱动安装目录下的DOC文件夹,此文进行翻译。

详细描述
UART驱动接口
使用UART驱动,确保设备链接至适当的驱动库并包含以下头文件:
#include <ti/drivers/UART.h>
此模块用于应用程序主接口。它的目的是将UART API导向一个使用指向UART_FxnTable指针指向的特定驱动实现。

概览
UART用于在芯片和串口间传输数据。UART驱动程序简化了对主板上任何UART外设的读写操作,并具有多种操作和运行模式。包含阻塞、非阻塞、轮询及文本/二进制模式,回响及返回字符。

此驱动程序中的API充当典型RTOS应用程序的接口。具体的外围实现负责创建所有操作系统特定的原语以允许线程安全操作。

使用方法
UART 驱动接口提供与设备无关的API、数据类型和宏。以下代码示例打开了一个UART实例,并从UART读取一个字节,然后将此字节回发给UART。
char        input;
UART_Handle uart;
UART_Params uartParams;
// 初始化 UART 驱动 
UART_init();
// Create a UART with data processing off.
UART_Params_init(&uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 9600;
//打开一个UART驱动实例
uart = UART_open(Board_UART0, &uartParams);
if (uart == NULL)
{// UART_open() 失败while (1);
}
// Loop forever echoing
while (1)
{UART_read(uart, &input, 1);UART_write(uart, &input, 1);
}
上述代码的详细描述将放在以下章节。

UART驱动配置
为了使用UART API,应用程序需要在Board.c文件中提供具体设备的UART配置。UART驱动接口定义了一个配置数据结构体:
typedef struct UART_Config_ {UART_FxnTable const    *fxnTablePtr;void                   *object;void          const    *hwAttrs;
} UART_Config;
应用程序必须声明一系列UART_Config元素,名称为UART_config[]。 UART_config[]中的每个元素都填充一个指针,它指向具体设备UART驱动实现的函数表、驱动对象和硬件属性。硬件属性定义了诸如UART外设基地址、发送和接收引脚等属性。UART_config[]中的每个元素对应了一个UART实例,没有元素则设置为NULL指针。索引和外设名称(如UART0或UART1)之间没有对应关系。例如有可能UART_config[0]对应的是UART1。

你需要检查为示例配置指定的具体设备UART驱动实现的头文件。请参考你的任意示例中的Board.c文件来获取UART配置。

初始化UART驱动
UART_init()必须在所有其它UART API之前被调用。此函数为UART_config[]的每个元素调用设备实现的UART初始化函数。

打开UART驱动
打开UART需要4个步骤:
  1. 创建并初始化一个UART_Params结构体。
  2. 填充相应的参数。
  3. 调用UART_open(),将UART在UART_config中的索引以及UART_Params结构体作为参数传递。UART实例由UART_config结构体中所对应的索引指定。
  4. 检查UART_open()所返回的UART句柄是否非空,并保存它。此句柄将用于对你打开的UART进行读写。

同一时间只能使用一个UART索引;之前传递给UART_open()的索引再次用于UART_open()时会返回一个错误。你可以在通过UART_close()来关闭实例的情况下再次使用索引。在示例代码中,Board_UART0传递给UART_open()。此宏在示例的Board.h文件中。

运行模式
UART驱动可通过设置传递给UART_open()的writeMode和readMode参数让串口运行于阻塞模式或回调模式。如果未设置这些参数,如示例中的代码,UART驱动默认运行于阻塞模式。 writeMode和readMode参数的可选项为UART_MODE_BLOCKING和UART_MODE_CALLBACK:
  • UART_MODE_BLOCKING在数据发送时使用信号量实现阻塞。在使用UART_MODE_BLOCKING时,UART_read()或UART_write()的调用环境必须为Task(任务)。UART_read()或UART_write()的调用将被阻塞,直到所有数据发送或接收完毕,或读写超时。
  • UART_MODE_CALLBACK是非阻塞的,当数据在硬件中断环境发送完毕后,UART_read()或UART_write()将返回。当读或写完成,UART驱动将调用用户的回调函数。在某些情况下,UART数据传输可能已被取消,或仅收到一个换行符,所以将发送/接收的字节数传递给回调函数。回调函数的实现可以根据需要使用此信息。由于用户的回调函数可能在中断服务程序上下文中被调用,所以回调函数中不能有任何RTOS阻塞调用。UART_MODE_CALLBACK模式中传递给UART_write()的缓冲不能是副本,在字符发送完毕前,缓冲必须保持连贯(例如发送回调函数被调用的次数等于传递给UART_write()字节数)。

示例中设置writeDataMode和readDataMode参数为UART_DATA_BINARY。可选项为UART_DATA_BINARY和UART_DATA_TEXT:
  • UART_DATA_BINARY:数据不经处理,直接传递。
  • UART_DATA_TEXT:写动作时会在换行符前加一个回车,读动作时将回车替换为换行。这有效地将所有设备的行尾结束符作为LF,并将所有主机PC行结束符作为CRLF。

示例需要设置的其它参数为readReturnMode和readEcho。 readReturnMode参数的可选项有UART_RETURN_FULL和UART_RETURN_NEWLINE:
  • UART_RETURN_FULL:当缓冲已满,读动作解除阻塞或返回。
  • UART_RETURN_NEWLINE:缓冲未满时,当读取到换行符时,读动作解除阻塞或返回。

readEcho参数的选项为UART_ECHO_OFF和UART_ECHO_ON。此参数决定是否将数据回响给UART。当回响打开,目标读取到的每个字符都会回写,它独立于任何写操作。如果在一个读操作的中间收到数据,并且回响是打开的,回响字符将和写数据混在一起。

读和写数据
以下示例代码从UART实例读取一个字节,并将这个字节写回给相同的实例:
UART_read(uart, &input, 1);
UART_write(uart, &input, 1);
UART驱动支持全双工数据传输。因此可以在同一时刻调用UART_read()和UART_write()(对于阻塞或回调模式)。但是在同一个方向上进行多个并发操作是不可能的。例如,在一个线程调用UART_read(uart0,buffer0...)时,任何其它线程试图调用UART_read(uart0,buffer1...)将导致一个UART_ERROR错误,直到第一次UART_read()的所有数据已经被传输给buffer0。这适用于阻塞和回调模式。所以应用程序要么同步使用相同UART句柄的UART_read()(或UART_write())调用,要么通过检查UART_ERROR返回码来表明传输仍在继续。

实现
UART驱动接口模块在编译时会链入一个名为UART_config的由多个UART_Config组成的数据结构。UART_config被应用程序实现为每个条目对应一个UART外设实例。UART_config中的每个条目都包含一个:
  • (UART_FxnTable *)指向一组实现UART外设的函数
  • (void *)数据对象关联至UART_FxnTable
  • (void *)硬件属性关联至UART_FxnTable

UART API使用UART_config条目的UART_FxnTable指针重定向至具体设备实现。为了直接使用UART驱动的具体设备函数,需为你的设备链接至正确的驱动库,并包含具体设备UART驱动头文件(包含UART.h)。例如,对于MSP432系列设备来说,需要包含以下头文件:
#include <ti/drivers/uart/UARTMSP432.h>

栈需求
在UART_MODE_CALLBACK模式下,强烈建议不要在驱动自己的回调函数中执行UART_read()或UART_write()调用。这样做会导致附加的任务或增加系统栈尺寸需求。参考外设实现文档获取栈尺寸评估建议。建议用户在选择嵌套这些调用时执行自己的栈和使用分析。

http://www.ppmy.cn/news/140950.html

相关文章

NetAPP FAS3220存储硬盘更换操作步骤

NetAPP FAS3220存储硬盘更换操作步骤 1、问题描述 NetAPP存储更换新硬盘后&#xff0c;硬盘一般会自动识别加入原有系统中&#xff0c;但是有时候新插入的硬盘可能无法自动分配&#xff0c;状态显示为“Not Owned”&#xff0c;则需要通过ssh登录对应设备进行手动分配。 2、 …

CC3220LaunchPad学习(一)

CC3220LaunchPad开发板使用 Created for the Internet of Things (IoT), the SimpleLink Wi-Fi CC3220 device is a single-chip microcontroller (MCU) with built-in Wi-Fi connectivity for the LaunchPad ecosystem, that integrates a highperformance ARM Cortex-M4 MCU…

python connect PAC3220 through modbus tcp protocal

python 直接读取PAC3220 通过modbus tcp 协议。 硬件连接&#xff1a;网线连接PC and PAC3220. 协议简介&#xff1a; Modbus协议是一项应用层报文传输协议&#xff0c;包括ASCII、RTU、TCP三种报文类型。 标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口&am…

CC3220学习笔记---点亮LED寄存器版

CC3220SF开发板到货&#xff0c;拍照留念 两兄弟&#xff0c;右边这块是CC3220SF&#xff0c;大一些。 相比51单片机&#xff0c;ARM的MCU复杂得多&#xff0c;再加上N层的抽象&#xff0c;复杂度更是高得多。更可怕的是&#xff0c;所有文档还是英文的&#xff0c;这东西看中文…

CC3220学习笔记---中断

我们还是先把所有中断相关寄存器列出来吧。与中断有关的寄存器一共7个&#xff0c;结构都差不多&#xff0c;下面一一讲解&#xff1a; 一、中断寄存器 GPIOIS Register (offset 404h) [reset 0h] 此寄存器指示中断检测方式&#xff0c;为0时表示边沿触发&#xff0c;为1时表…

CC3220学习笔记---点亮LED PinMux版

上节课使用了driverlib API来实现了LED灯的点亮&#xff0c;在实际开发中&#xff0c;不可能这样写程序&#xff0c;效率太低。这时就需要把硬件的各种行为抽象出来&#xff0c;帮助开发人员更容易地&#xff0c;更符合人类思维的方式进行操作。 首先理解CC3220 SDK源码的架构&…

CC3220开发板

思前考后&#xff0c;还是得从底层学起&#xff0c;弄清楚芯片。先要在TI-RTOS下搞清楚&#xff0c;再转到Zephyr。问题是TI-RTOS不支持CC3200&#xff0c;仅FreeRTOS支持它。TI-RTOS已经弄过一段&#xff0c;还算有点熟&#xff0c;再花时间学FreeRTOS感觉不太值得。所以还是搞…

可以用的RAID 6:HighPoint RocketRAID 3220评测

可以用的RAID 6&#xff1a;HighPoint RocketRAID 3220评测 <script src"http://tech.ddvip.com/a_dir_d/title_bottom.js"></script> http://tech.ddvip.com 2008年11月14日 社区交流 收藏本文 <script src"http://tech.ddvip.com/a_dir_d…