[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_uart] UART配置和使用

发布者:konglingdeyuan最新更新时间:2022-09-06 来源: csdn关键字:nrf51822  nrf51422  UART 手机看文章 扫描二维码
随时随地手机看文章

Universal Asynchronous Receiver/Transmitter (UART)

The Universal Asynchronous Receiver/Transmitter offers fast, full-duplex, asynchronous serial communication with built-in flow control (CTS, RTS) support in hardware up to 1 Mbps baud. Parity checking is supported.


The GPIOs used for each UART interface line can be chosen from any GPIO on the device and are independently configurable. This enables great flexibility in device pinout and efficient use of board space and signal routing.


通用异步接收/发送器提供快速,全双工,内置流控制(CTS, RTS)的异步串行通信硬件支持高达1mbps波特率。 支持奇偶校验。


用于每个UART接口线的GPIO可以从设备上的任何GPIO中选择,并且是独立配置的。 这使得设备引脚具有很大的灵活性,并能有效地利用板空间和信号路由。


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

* @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"


#include "boards.h"


#include "business_gpio.h"

#include "business_function.h"

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

/* 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_115200

};

#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 (baud == 115200)

    {

    uart0_comm_params.baud_rate = NRF_UART_BAUDRATE_115200;

    }

    else if (baud == 19200)

    {

    uart0_comm_params.baud_rate = NRF_UART_BAUDRATE_19200;

    }

    }

}


/**

 * @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;

#endif

    }

    return;

}


/**

 * @brief  发送多个字节(非堵塞) 一般DMA方式

 * @note   NULL

 * @param  uart: 串口组号

 * @param  *data: 数据头指针

 * @param  len: 数据长度

 * @retval None

 */

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

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        bsp_uart_send_nbyte(uart, data, len);

#endif

    }

    return;

}


/**

 * @brief  得到txbuff头指针

 * @note   NULL

 * @param  uart: 串口组号

 * @retval None

 */

uint8_t *bsp_uart_get_txbuff(bsp_uart_t uart)

{

    if (uart == BSP_UART_0)

    {

#if BS_UART0_EN

        if (g_uart0_send_lock == false)

        {

            return bsp_uart0_tx_buff;

        }

        return NULL;

#endif

    }

    return NULL;

}


/**

 * @brief  得到rxbuff头指针

 * @note   NULL

 * @param  uart: 串口组号

 * @retval None

 */

[1] [2]
关键字:nrf51822  nrf51422  UART 引用地址:[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_uart] UART配置和使用

上一篇:[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_rng] rng随机数生成器配置和使用
下一篇:[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_led] LED配置和使用

推荐阅读最新更新时间:2024-10-20 14:08

[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_uart] UART配置和使用
Universal Asynchronous Receiver/Transmitter (UART) The Universal Asynchronous Receiver/Transmitter offers fast, full-duplex, asynchronous serial communication with built-in flow control (CTS, RTS) support in hardware up to 1 Mbps baud. Parity checking is supported. The GPIOs used for each UART interface line can be
[单片机]
[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_key] KEY配置和使用
按键的基本原理是设置单片机IO口(PB0-PB3)为输入状态,如DDRB = 0XF0(方向寄存器,“1”为输出,“0”为输入); 单片机一直检测按键端口(PB0-PB3)的状态,当端口为低电平时(即按键按下),实行相应的动作(比如控制LED灯)。 原理就是这么回事,但是正真实现时,按键会有抖动,要进行按键去抖,下图为按键按下时的抖动图。 按键实行一个动作过程是需要一定时间的,一般为100mS-1S左右,而一个单片机执行一个机器周期的时间很短,时钟为10MH的周期为0.1μs,这样按键每一次动作程序就会多次检测按键,出现误判(一次按下,多次动作)。 /********************************
[单片机]
[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_gpio] GPIO配置和使用
GPIO The general purpose I/O is organized as one port with up to 32 I/Os (dependent on package) enabling access and control of up to 32 pins through one port. Each GPIO can be accessed individually with the following user configurable features: Input/output direction Output drive strength Internal pull-up and pull-d
[单片机]
[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_exti] GPIOE配置和使用
GPIO Task Event blocks (GPIOTE) A GPIOTE block enables GPIOs on Port 0 to generate events on pin state change which can be used to carry out tasks through the PPI system. A GPIO can also be driven to change state on system events using the PPI system. Low power detection of pin state changes on Port 0 is possible when
[单片机]
[<font color='red'>单片机</font><font color='red'>框架</font>][<font color='red'>bsp</font><font color='red'>层</font>][<font color='red'>nrf51822</font>][<font color='red'>nrf51422</font>][<font color='red'>nrf51802</font>][<font color='red'>bsp</font>_exti] GPIOE配置和使用
[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_adc] ADC配置和使用
Analog to Digital Converter (ADC) The 10 bit incremental Analog to Digital Converter (ADC) enables sampling of up to 8 external signals through a front-end multiplexer. The ADC has configurable input, reference prescaling, and sample resolution (8, 9, and 10 bit). Note: The ADC module uses the same analog inputs as
[单片机]
[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_pwm] PWM配置和使用
NRF51系列的PWM是由TIM+PPI+GPIO组成的,下面依次介绍: Programmable Peripheral Interconnect (PPI) The Programmable Peripheral Interconnect (PPI) enables peripherals to interact autonomously with each other using tasks and events independent of the CPU. The PPI allows precise synchronization between peripherals when real-time applicat
[单片机]
[<font color='red'>单片机</font><font color='red'>框架</font>][<font color='red'>bsp</font><font color='red'>层</font>][<font color='red'>nrf51822</font>][<font color='red'>nrf51422</font>][<font color='red'>nrf51802</font>][<font color='red'>bsp</font>_pwm] PWM配置和使用
[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_led] LED配置和使用
LED 本文将介绍NRF51,如何点亮LED灯。 官方手册下载: https://infocenter.nordicsemi.com/pdf/nRF51802_PS_v1.2.pdf https://infocenter.nordicsemi.com/pdf/nRF51822_PS_v3.4.pdf https://infocenter.nordicsemi.com/pdf/nRF51422_PS_v3.3.pdf /******************************************************************************** * @file bsp_led.c * @a
[单片机]
[单片机框架][bsp][nrf51822][nrf51422][nrf51802][bsp_rng] rng随机数生成器配置和使用
Random Number Generator (RNG) The Random Number Generator (RNG) generates true non-deterministic random numbers derived from thermal noise that are suitable for cryptographic purposes. The RNG does not require a seed value. 随机数生成器(RNG)从热噪声中生成真实的非确定性随机数,适合于加密目的。 RNG不需要种子值。 /*****************************************
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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