nrf52382之UART使用

简介

nRF52832 片内集成了一个 UART 外设,其主要特性如下:
⚫ 全双工。
⚫ 自动的流控。
⚫ 奇偶校验并自动产生校验位。
⚫ 1 位停止位。

nRF52832本文描述串口引脚如下:
在这里插入图片描述
串口引脚分配
在这里插入图片描述
nRF52832 的 UART 支持硬件流控,共有 4 个信号: RXD、 CTS、 TXD 和 RTS。其中TXD 和 RXD 信号用于发送和接收数据, RTS 和 CTS 用于硬件流控。

这 4 个信号可以通过下表所示的寄存器映射到 nRF52832 的任何一个物理引脚,如可以通过配置 PSELRXD 寄存器将 RXD 映射到 P0.06,即使用 P0.06 作为 UART 的接收引脚,也可以通过配置 PSELRXD 寄存器将 RXD 映射到 P0.08 或其它任何一个引脚。但是需要注意的是: nRF52832 只有 1 个 UART 外设,所以同时只能使用一个 UART,另外,同一时刻只能有一个信号映射到同一个引脚,如不能同时将 P0.08 配置为串口接收和发送。
在这里插入图片描述
Nordic 的库中, UART 和 UARTE 公用一个程序模块,称为 APP UART, APP UART 中封装了对UART和UARTE操作,库函数中通过条件编译区分应用程序使用 UART 和UARTE。

具体实现

头文件

#include "app_uart.h"

#define UART_TX_BUF_SIZE 256       //串口发送缓存大小(字节数)
#define UART_RX_BUF_SIZE 256       //串口接收缓存大小(字节数)

串口事件回调函数

void uart_error_handle(app_uart_evt_t * p_event)

处理如下

//串口事件回调函数,该函数中判断事件类型并进行处理
void uart_error_handle(app_uart_evt_t * p_event)
{
    //通讯错误事件
    if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_communication);
    }
    //FIFO错误事件
    else if (p_event->evt_type == APP_UART_FIFO_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_code);
    }
}

串口配置

//串口配置
void uart_config(void)
{
	uint32_t err_code;
	
	//定义串口通讯参数配置结构体并初始化
  const app_uart_comm_params_t comm_params =
  {
    RX_PIN_NUMBER,//定义uart接收引脚
    TX_PIN_NUMBER,//定义uart发送引脚
    RTS_PIN_NUMBER,//定义uart RTS引脚,流控关闭后虽然定义了RTS和CTS引脚,但是驱动程序会忽略,不会配置这两个引脚,两个引脚仍可作为IO使用
    CTS_PIN_NUMBER,//定义uart CTS引脚
    APP_UART_FLOW_CONTROL_DISABLED,//关闭uart硬件流控
    false,//禁止奇偶检验
    NRF_UART_BAUDRATE_115200//uart波特率设置为115200bps
  };
  //初始化串口,注册串口事件回调函数
  APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_error_handle,
                         APP_IRQ_PRIORITY_LOWEST,
                         err_code);

  APP_ERROR_CHECK(err_code);
	
}

接收数据

uint8_t cr;
while (app_uart_get(&cr) != NRF_SUCCESS);

发送数据

uint8_t cr = 0xff;
while (app_uart_put(cr) != NRF_SUCCESS);

串口接收事件和发送完成事件

 //串口接收事件
APP_UART_DATA_READY
//串口发送完成事件
APP_UART_TX_EMPTY

处理示例如下

//串口事件回调函数,该函数中判断事件类型并进行处理
void uart_error_handle(app_uart_evt_t * p_event)
{
    uint8_t cr;
	
	  //通讯错误事件
    if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_communication);
    }
    //FIFO错误事件
    else if (p_event->evt_type == APP_UART_FIFO_ERROR)
    {
        APP_ERROR_HANDLER(p_event->data.error_code);
    }
	//串口接收事件
    else if (p_event->evt_type == APP_UART_DATA_READY)
    {
		//从FIFO中读取数据  
      	app_uart_get(&cr);  
      	
	    //串口输出数据  
	    printf("%c",cr);  
    }
	//串口发送完成事件
    else if (p_event->evt_type == APP_UART_TX_EMPTY)
    {
        nrf_gpio_pin_toggle(LED_1);
    }
}

串口回显使用示例

int main(void)
{
    //初始化串口
    uart_config();
	
	while(true)  
	{  
	    uint8_t cr;
	    //查询是否接收到数据
	    while (app_uart_get(&cr) != NRF_SUCCESS);
	    //将接收的数据原样发回
	    while (app_uart_put(cr) != NRF_SUCCESS);
	      
	}
}

效果如下
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值