简介
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);
}
}
效果如下: