[nrf52832][nrf52840][nrf52810][nrf52820][bsp_uart] UART配置和使用

发布者:天涯拾遗最新更新时间:2022-08-19 来源: csdn关键字:nrf52832  nrf52840  nrf52810  UART 手机看文章 扫描二维码
随时随地手机看文章

UART —通用异步接收/发送器

图160:UART配置

功能描述

这里列出了UART的主要特性。

UART实现了对以下特性的支持:


全双工操作

自动流量控制

第9位数据位校验和生成

如图160所示:第531页的UART配置,UART直接使用TXD和RXD寄存器来发送和接收数据。 UART使用一个停止位。

引脚的配置

不同的信号RXD, CTS (Clear To Send, active low), RTS (Request To Send, active low)和TXD与UART相关联,分别根据PSELRXD, PSELCTS, PSELRTS和PSELTXD寄存器中指定的配置映射到物理引脚。

如果在这些寄存器中指定了0xFFFFFFFF值,则关联的UART信号将不会连接到任何物理引脚。 PSELRXD、PSELCTS、PSELRTS和PSELTXD寄存器及其配置仅在UART启用时使用,并且仅在设备处于ON模式时保留。 PSELRXD、PSELCTS、PSELRTS和PSELTXD只能在禁用UART的情况下配置。

当系统处于OFF模式时,为了确保UART在引脚上的正确信号电平,必须按照第531页引脚配置中的描述在GPIO外围设备中配置引脚。


一次只能指定一个外设来驱动特定的GPIO管脚。 不这样做可能会导致不可预测的行为。


表128:GPIO配置

image.png

共享资源

UART与与UART具有相同ID的其他外围设备共享寄存器和其他资源。 因此,在配置和使用UART之前,必须禁用与UART ID相同的所有外围设备。 禁用与UART具有相同ID的外设将不会重置与UART共享的任何寄存器。 因此,显式配置所有相关的UART寄存器以确保其正确操作非常重要。

有关外围设备及其id的详细信息,请参阅第24页Instantiation中的Instantiation表。


接收

通过触发STARTRX任务来启动UART接收序列。

UART接收器链实现了一个FIFO,能够在数据出现之前存储6个传入RXD字节覆盖。 字节是通过读取RXD寄存器从这个FIFO中提取的。 当一个字节被提取在FIFO中一个新的字节将被移动到RXD寄存器。 UART将生成每当一个新字节移动到RXD寄存器时,RXDRDY事件。


当流量控制启用时,UART将在只有4个空间时停用RTS信号更多的字节在接收器先进先出。 对应的发射机因此能够发送最多四个字节后在数据被覆盖之前,RTS信号被停用。 为了防止在FIFO中覆盖数据,对等的UART发送器必须因此确保停止传输数据在四个字节后RTS线路失效。


暂停UART

可以通过触发SUSPEND任务来挂起UART。 暂停会影响UART接收端和UART发送端,即发送端停止发送,接收端停止接收。 UART的发送和接收在暂停后可以通过触发STARTTX和STARTRX来恢复。

在SUSPEND任务之后,正在进行的TXD字节传输将在UART挂起之前完成。

当SUSPEND任务被触发时,UART接收器的行为与STOPRX任务被触发时的行为相同。


错误条件

如果在帧中没有检测到有效的停止位,将生成一个以帧错误形式出现的ERROR事件。 如果RXD线保持低电平的时间超过数据帧的长度,将生成另一个以中断条件形式出现的ERROR事件。 实际上,总是在中断条件发生之前生成帧错误。


使用没有流控制的UART

如果没有启用流量控制,接口将表现为CTS和RTS线路一直处于活动状态。


奇偶校验配置

当使能奇偶校验时,TXD和RXD的奇偶校验将自动生成用于发送和接收的奇偶校验。


/********************************************************************************

* @file    bsp_uart.c

* @author  jianqiang.xue

* @version V1.0.0

* @date    2021-04-13

* @brief   uart驱动

********************************************************************************/

/* Includes ------------------------------------------------------------------*/

#include

#include

#include


#include "RTE_Components.h"

#include CMSIS_device_header

#include "nrf_uart.h"

#include "app_uart.h"


#include "bsp_gpio.h"

#include "bsp_uart.h"


/* Private Define ------------------------------------------------------------*/

#include "business_gpio.h"

#include "business_function.h"

/* External Variables --------------------------------------------------------*/

/* Private Typedef -----------------------------------------------------------*/

typedef void(*bsp_uart_callback)(void);

/* Private Variables ---------------------------------------------------------*/

#if BS_UART0_EN

#define BSP_UART0_IRQ_HANDLER                    uart0_event_handle

// 定义串口缓存区

uint8_t bsp_uart0_tx_buff[BS_UART0_CACHE_SIZE] = {0};

uint8_t bsp_uart0_rx_buff[BS_UART0_CACHE_SIZE] = {0};

// 定义串口初始化标记位 0--未初始化 1--初始化完成

bool g_uart0_init                              = false;

// 定义串口发送标记位 0--free闲  1--bus忙

bool g_uart0_send_lock                         = false;

uint16_t bsp_uart0_rx_buff_position = 0;


static bsp_uart_callback uart0_irq_rx_callback;


// 定义串口信息初始化结构体

static app_uart_comm_params_t uart0_comm_params =

{

    .rx_pin_no    = BS_UART0_RX_PIN,

    .tx_pin_no    = BS_UART0_TX_PIN,

    .rts_pin_no   = RTS_PIN_NUMBER,

    .cts_pin_no   = CTS_PIN_NUMBER,

    .flow_control = APP_UART_FLOW_CONTROL_DISABLED,

    .use_parity   = false,

    .baud_rate    = NRF_UART_BAUDRATE_460800

};

#endif


/* Private Function Prototypes -----------------------------------------------*/

/**

 * @brief  Rx Transfer completed callbacks.

 * @note   NULL

 * @param  p_event: Struct containing events from the UART module.

 * @retval None

 */

static void BSP_UART0_IRQ_HANDLER(app_uart_evt_t * p_event)

{

    if (p_event->evt_type == APP_UART_DATA_READY)

    {

        app_uart_get(&bsp_uart0_rx_buff[bsp_uart0_rx_buff_position]);

        if (bsp_uart0_rx_buff_position < (BS_UART0_CACHE_SIZE - 1))

        {

            bsp_uart0_rx_buff_position++;

        }

        if (uart0_irq_rx_callback)

        {

            uart0_irq_rx_callback();

        }

    }

}


/* Public Function Prototypes ------------------------------------------------*/

/**

 * @brief  设置串口波特率

 * @note   NULL

 * @param  uart: 串口组号

 * @param  baud: 波特率

 * @retval None

 */

void biz_uart_set_baud_rate(bsp_uart_t uart, uint32_t baud)

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        if (baud == 19200)

        {

            uart0_comm_params.baud_rate = NRF_UART_BAUDRATE_19200;

        }

        else if (baud == 115200)

        {

            uart0_comm_params.baud_rate = NRF_UART_BAUDRATE_115200;

        }

        else if (baud == 460800)

        {

            uart0_comm_params.baud_rate = NRF_UART_BAUDRATE_460800;

        }

#endif

    }

    return;

}


/**

 * @brief  串口初始化

 * @note   None

 * @param  uart: 串口组号

 * @retval None

 */

void bsp_uart_init(bsp_uart_t uart)

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        if (g_uart0_init)

        {

            return;

        }

        uint32_t err_code;

        APP_UART_FIFO_INIT(&uart0_comm_params,

                           BS_UART0_CACHE_SIZE,

                           BS_UART0_CACHE_SIZE,

                           uart0_event_handle,

                           APP_IRQ_PRIORITY_LOWEST,

                           err_code);

        APP_ERROR_CHECK(err_code);

        bsp_uart0_rx_buff_position = 0;

        g_uart0_init = true;

#endif

    }

}


/**

 * @brief  串口反注册 关闭串口时钟并复位引脚

 * @note   NULL

 * @param  uart: 串口组号

 * @retval None

 */

void bsp_uart_deinit(bsp_uart_t uart)

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        if (!g_uart0_init)

        {

            return;

        }

        app_uart_close();

        g_uart0_init = false;

#endif

    }

}


/**

 * @brief  注册串口接收回调函数

 * @note   NULL

 * @param  uart: 串口组号

 * @param  event: 事件回调函数

 * @retval 0--失败 1--成功

 */

bool bsp_uart_rx_irq_callback(bsp_uart_t uart, void *event)

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        if (uart0_irq_rx_callback != NULL)

        {

            return true;

        }

        else

        {

            uart0_irq_rx_callback = (bsp_uart_callback)event;

        }

#endif

    }


    return false;

}


/************************************[uart] 使用函数************************************/

/**

 * @brief  发送一个字节

 * @note   NULL

 * @param  uart: 串口组号

 * @param  data: 字节值

 * @retval None

 */

void bsp_uart_send_byte(bsp_uart_t uart, uint8_t data)

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        if (!g_uart0_init)

        {

            return;

        }

        app_uart_put(data);

#endif

    }

    return;

}


/**

 * @brief  发送多个字节(堵塞)

 * @note   NULL

 * @param  uart: 串口组号

 * @param  *data: 数据头指针

 * @param  len: 数据长度

 * @retval None

 */

void bsp_uart_send_nbyte(bsp_uart_t uart, uint8_t *data, uint16_t len)

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        if (!g_uart0_init)

        {

            return;

        }

        if (g_uart0_send_lock)

        {

            return;

        }

        g_uart0_send_lock = true;

        if (data != NULL)

        {

            for (uint16_t i = 0; i < len; i++)

            {

                app_uart_put(data[i]);

            }

        }

        else

        {

            for (uint16_t i = 0; i < len; i++)

            {

                app_uart_put(bsp_uart0_tx_buff[i]);

            }

        }

        g_uart0_send_lock = false;

[1] [2]
关键字:nrf52832  nrf52840  nrf52810  UART 引用地址:[nrf52832][nrf52840][nrf52810][nrf52820][bsp_uart] UART配置和使用

上一篇:[bsp层][nrf52832][nrf52840][nrf52810][nrf52820][bsp_rng] RNG随机数生成器配置和使用
下一篇:[nrf52832][nrf52840][nrf52810][nrf52820][bsp_pwm] PWM配置和使用

推荐阅读最新更新时间:2024-11-05 12:06

串口通讯基础及S3C2410 UART控制器
  数据通信的基本方式可分为并行通信与串行通信两种:   并行通信:是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速度快,适用于短距离通信,但要求通讯速率较高的应用场合。   串行通信:是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。   一、异步通信及其协议   异步通信以一个字符为传输单位,通信中两个字符间的时间间隔是不固定的,然而在同一个字符中的两个相邻位代码间的时间间隔是固定的。   通信协议(通信规程):是指通信双方约定的一些规则。在使用异步串口传送一个字符的信息时,对资料格式有如下约定:规定有空闲
[嵌入式]
UART串口协议基础1
串口协议基础 1 串口概述 串口由收发器组成。发送器是通过TxD引脚发送串行数据,接收器是通过RxD引脚接收串行数据。发送器和接收器都利用了一个移位寄存器,这个移位寄存器可以将数据进行“并转串”和“串转并”。虽然一个UART接口通常都包含了发送器和接收器,而实际上一个全双工串口UART控制器需要独立的发送和接收通道。这是因为每个控制通道只控制了一个pin(一个通道要么配置成发送器,要么配置成接收器,不能同时配置成接收器和发送器)。没有严格规定哪个通道可以是发送器、哪个通道可以使接收器。 UART协议(串口协议)允许选择一个校验位来检测简单的通信错误(transmission errors)。校验位可以通过两种不同的方式进行
[单片机]
<font color='red'>UART</font>串口协议基础1
STM32CubeIDE 中 HAL库的串口中断接收函数 HAL_UART_Receive_IT
一、代码自动生成以后的项目及代码结构: main.c中,调用了串口初始化 串口初始化函数赋值了串口的参数 相当于底层的初始化,配置引脚、并开启中断。 至此串口1配置完毕 二、库文件stm32f1xx_hal_uart.c内的秘密 2.1 初始化 1.usart.c中,MX_USART1_UART_Init 调用了库的HAL_UART_Init,将结构体传递进该函数中 2.HAL_UART_Init干了些什么事? if (huart- gState == HAL_UART_STATE_RESET) { huart- Lock = HAL_UNLOCKED; HAL_UART_MspInit(huar
[单片机]
STM32CubeIDE 中 HAL库的串口中断接收函数 HAL_<font color='red'>UART</font>_Receive_IT
TMS320VC5402和PC机的UART研究与设计
1 引言 TMS320VC5402以其低成本、低功耗、资源多的特点在通信、控制领域得到了广泛的应用。片上集成了最大192kB存储空间(64kB RAM、64kB ROM、64kB I/O),具有时分多路串口TMD,2个缓冲串口BSP、8位并行主机接口HPI、可编程等待状态发生器等,完全可以满足数据处理及控制要求。基于 5402构建的应用系统中必不可少的是各种数据通信接口的设计。与并口相比,串行接口的特点是减少器件引脚数目,节省了硬件系统的体积,降低了接口设计的复杂性。实际应用中,各系统之间需要实现异步串行数据传输和通信,而DSP5402具有同步串口,与标准的异步串行接口不同,本文针对这种应用,设计实现了DSP5402和PC
[嵌入式]
UART0串口编程(二):硬件原理;轮训方式的串口编程
本节针对的是ARM2200环境下编写串口程序,其中设计轮循方式,中断方式,以及在UC/OS-II操作系统下的串口编程。使用轮循和中断两种方式来实现串口编程。用中断实现串口编程,系统的效率较高,但是难度也较大 ;轮循方式效率较低,但是编程比较简单。 一.串口编程的硬件原理 1. 串口特性: 1 16字节接收FIFO和16字节发送FIFO 2 接收FIFO触发点可设置为1,4,8或14字节。 3 内置波特率发生器。 2. UART0引脚: 1 RxD0 引脚用于UART0接受数据,接受方式为串行输入。 2 TxD0引脚用于UART0发送数据,发送方式为串行发送数据。 3. UART0的结
[单片机]
<font color='red'>UART</font>0串口编程(二):硬件原理;轮训方式的串口编程
基于FPGA的UART控制器的多模块设计与实现
  异步串行通信要求的传输线少,可靠性高,传输距离远,被广泛应用于微机和外设的数据交换。实现串口通信主要需要完成两部分工作:   将串口电平转换为设备电路板的工作电平,即实现RS-232电平和TTL/CMOS电平的转换;   接收并且检验串行的数据,将数据变成并行的并提供给处理器处理。   实现RS-232电平和TTL/CMOS电平转换可以用接口芯片来实现,实现数据的串行到并行转换用的是UART,它们是实现串行通信必不可少的两个部分。虽然目前大部分处理器芯片中都集成了UART,但是一般FPGA芯片却没有这个特点,所以使用FPGA作为处理器可以有两个选择,第一个选择是使用UART芯片进行串并转换,第二个选择是在FPGA内部实现
[嵌入式]
基于FPGA的<font color='red'>UART</font>控制器的多模块设计与实现
Cortex-M3 (NXP LPC1788)之UART用法
在工作中经常将平台的串口和PC机连接,通过串口打印信息进行程序调试。LPC1788共有5个串口Uart0~Uart4,跟具开发板的资源,将使用Uart2进行简单的串口输出和输入中断的操作。开发板上使用74HC4052多路开关对UART2的RXD和TXD进行选择,使用SP3243E进行3.0V到5.5V的RS-232电平转换。查看手册配置好相关的跳线帽,保证DB口上的串口输出采用的是Uart2。 下面介绍Uart相关系统配置和Uart模块的配置。Uart的时钟采用PCLK,我们配置系统的CCLK为120M,PCLK为60M,后面设置串口的波特率就采用PLCK进行计算。要使用串口2的功能需要使能系统时钟控制PCONP,以
[单片机]
Cortex-M3 (NXP LPC1788)之<font color='red'>UART</font>用法
MSP432P401R TI Drivers 库函数学习笔记(六)UART 串口
平台:Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) API (机翻) 官方UART API 手册 void UART_close (UART_Handle handle) 关闭由UART句柄指定的UART外围设备 int_fast16_t UART_control (UART_Handle handle, uint_fast16_t cmd, void *arg) 在给定的UART_Handle上执行实现特定的特性 void UART_init (void) 初始化UA
[单片机]
MSP432P401R TI Drivers 库函数学习笔记(六)<font color='red'>UART</font> 串口
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved