NRF51822——串口学习笔记

前言:

为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长。

在这里插入图片描述


1.概述

nRF51822 没有固定的串口引脚 RX 和 TX,与UART相关的信号RXD、CTS、RTS和TXD可根据寄存器:PSELRXD、PSELCTS、PSELRTS和PSELTXD独立配置映射到相应的物理引脚。

RTS (Require ToSend,发送请求:为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。

CTS (Clear ToSend,发送允许:为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。

这里写图片描述

2.配置

2.1 IO口方向配置:

这里写图片描述

2. 2 串口相关存器:

这里写图片描述

在 nrf51.h中已有相关定义:


typedef struct {                                    /*!< UART Structure                                                        */
  __O  uint32_t  TASKS_STARTRX;                     /*!< Start UART receiver.                                                  */
  __O  uint32_t  TASKS_STOPRX;                      /*!< Stop UART receiver.                                                   */
  __O  uint32_t  TASKS_STARTTX;                     /*!< Start UART transmitter.                                               */
  __O  uint32_t  TASKS_STOPTX;                      /*!< Stop UART transmitter.                                                */
  __I  uint32_t  RESERVED0[3];
  __O  uint32_t  TASKS_SUSPEND;                     /*!< Suspend UART.                                                         */
  __I  uint32_t  RESERVED1[56];
  __IO uint32_t  EVENTS_CTS;                        /*!< CTS activated.                                                        */
  __IO uint32_t  EVENTS_NCTS;                       /*!< CTS deactivated.                                                      */
  __IO uint32_t  EVENTS_RXDRDY;                     /*!< Data received in RXD.                                                 */
  __I  uint32_t  RESERVED2[4];
  __IO uint32_t  EVENTS_TXDRDY;                     /*!< Data sent from TXD.                                                   */
  __I  uint32_t  RESERVED3;
  __IO uint32_t  EVENTS_ERROR;                      /*!< Error detected.                                                       */
  __I  uint32_t  RESERVED4[7];
  __IO uint32_t  EVENTS_RXTO;                       /*!< Receiver timeout.                                                     */
  __I  uint32_t  RESERVED5[46];
  __IO uint32_t  SHORTS;                            /*!< Shortcuts for UART.                                                   */
  __I  uint32_t  RESERVED6[64];
  __IO uint32_t  INTENSET;                          /*!< Interrupt enable set register.                                        */
  __IO uint32_t  INTENCLR;                          /*!< Interrupt enable clear register.                                      */
  __I  uint32_t  RESERVED7[93];
  __IO uint32_t  ERRORSRC;                          /*!< Error source. Write error field to 1 to clear error.                  */
  __I  uint32_t  RESERVED8[31];
  __IO uint32_t  ENABLE;                            /*!< Enable UART and acquire IOs.                                          */
  __I  uint32_t  RESERVED9;
  __IO uint32_t  PSELRTS;                           /*!< Pin select for RTS.                                                   */
  __IO uint32_t  PSELTXD;                           /*!< Pin select for TXD.                                                   */
  __IO uint32_t  PSELCTS;                           /*!< Pin select for CTS.                                                   */
  __IO uint32_t  PSELRXD;                           /*!< Pin select for RXD.                                                   */
  __I  uint32_t  RXD;                               /*!< RXD register. On read action the buffer pointer is displaced.
                                                         Once read the character is consumed. If read when no character
                                                          available, the UART will stop working.                               */
  __O  uint32_t  TXD;                               /*!< TXD register.                                                         */
  __I  uint32_t  RESERVED10;
  __IO uint32_t  BAUDRATE;                          /*!< UART Baudrate.                                                        */
  __I  uint32_t  RESERVED11[17];
  __IO uint32_t  CONFIG;                            /*!< Configuration of parity and hardware flow control register.           */
  __I  uint32_t  RESERVED12[675];
  __IO uint32_t  POWER;                             /*!< Peripheral power control.                                             */
} NRF_UART_Type;
2.3 波特率
波特率对应参数备注
Baud12000x0004F0001200 baud
Baud24000x0009D0002400 baud
Baud48000x0013B0004800 baud
Baud96000x002750009600 baud
Baud144000x003B000014400 baud
Baud192000x004EA00019200 baud
Baud288000x0075F00028800 baud
Baud384000x009D500038400 baud
Baud576000x00EBF00057600 baud
Baud768000x013A900076800 baud
Baud1152000x01D7E000115200 baud
Baud2304000x03AFB000230400 baud
Baud2500000x04000000250000 baud
Baud4608000x075F7000460800 baud
Baud9216000x0EBEDFA4921600 baud
Baud1M0x100000001Mega baud
2.4 串口收发

开启串口发送:

当触发STARTTX任务时,UART传输时序启动。通过写TXD寄存器可以实现字节的发送。当一个字节成功发送的候,UART会产生一个TXDRDY事件,于是新的字节也可以写到TXD寄存器。通过触发STOPTX任务,UART传输时序将会关闭。

开启串口接收:

当触发STARTRX任务时,UART接收时序启动。接收到的字节会被移动到CPU能够提取的RXD寄存器中。RXD寄存器时双缓冲的,当第一个字节被CPU从RXD寄存器中提取走的同时第二个字节可以被接收。每当一个新字节被移入RXD寄存器时UART会产生一个RXDRDY事件。当第一个字节被从RXD寄存器中提取走的时候,第二个字节会被从RXD-1移到RXD寄存器。通过触发STOPRX任务,UART接收时序将会关闭。

**在程序最后,通过触发STARTTX任务和STARTRX任务,开启UART发送和接收。**为了避免因为以前接收到数据而产生的RXDRDY事件导致接收到错误的数据,在最后也需要对EVENTS_RXDRDY清零。但是由于是在字节发送成功之后自动产生TXDRDY事件,对其清不清零并不影响将来的数据发送。

3.软件实现

3.1 寄存器方式实现
//初始化
void Usart_Init(uint32_t bound)
{
	nrf_gpio_cfg_input(USART_RX, NRF_GPIO_PIN_NOPULL);
	nrf_gpio_cfg_output( USART_TX);
	
	NRF_UART0->PSELRXD = USART_RX;
	NRF_UART0->PSELTXD = USART_TX;
	NRF_UART0->PSELRTS = 0XFFFFFFFF;//关闭流控
	NRF_UART0->PSELCTS = 0XFFFFFFFF;

	NRF_UART0->BAUDRATE = bound;
	NRF_UART0->CONFIG = 0;	//不使用流控,不校验

	NRF_UART0->EVENTS_RXDRDY = 0;
	NRF_UART0->EVENTS_TXDRDY = 0;

	NRF_UART0->ENABLE = 4;	//使能串口
	NRF_UART0->TASKS_STARTRX  = 1;
	NRF_UART0->TASKS_STARTTX = 1;
}

//发送数据
void Usart_Send_Byte(uint8_t dat)
{ 
	
	NRF_UART0->EVENTS_TXDRDY = 0;
	NRF_UART0->TXD = dat;
	while(NRF_UART0->EVENTS_TXDRDY == 0);
}

//接收数据
uint8_t Usart_Recive_Byte(void)
{
	
	while(NRF_UART0->EVENTS_RXDRDY == 0);
	NRF_UART0->EVENTS_RXDRDY = 0;	//清零事件

	return (uint8_t)NRF_UART0->RXD;	
}

//发送字符串
void Usart_Send_String(uint8_t *str)
{
	uint8_t i=0;
	
	while(str[i]!= '\0')
	{
		Usart_Send_Byte(str[i]);
		i++;
	}
}

测试现象:

这里写图片描述

3.2 中断方式实现:

需在初始化中加入中断初始化:

//中断方式
	NVIC_SetPriority(UART0_IRQn, 1);
	NVIC_ClearPendingIRQ(UART0_IRQn);
	NVIC_EnableIRQ(UART0_IRQn);

中断服务程序:

void UART0_IRQHandler(void)
{
	//接收
	if(NRF_UART0->EVENTS_RXDRDY != 0)
	{
		NRF_UART0->EVENTS_RXDRDY = 0;
		uart_buf[rx_index++] = (uint8_t)NRF_UART0->RXD;
	}

	//发送
	if(NRF_UART0->EVENTS_TXDRDY != 0)
	{
		NRF_UART0->EVENTS_TXDRDY = 0;
		if(tx_index != 0)
		{
			NRF_UART0->TXD = uart_buf[tx_index++];
		}
		
	}
}


参考:

1.nrf51822裸机教程-UART

2.nRF51822 UART引脚配置

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值