CC2541之串口(转)

来源-作者@欣庸https://www.cnblogs.com/chenzhao207/p/4531941.html

建议读者阅读原文,确保获得完整的信息

CC2541——串口

CC2541有两个串行通信接口,分别是USART0和USART1,它们能够分别运行于异步UART模式或者同步SPI模式。两个USART具体同样的功能,可以设置在单独的I/O引脚。

1.UART模式

UART模式提供异步串行接口,在UART模式中,有2种接口选择方式:2线接口和4线接口。

  • 2线接口,使用RXD、TXD。
  • 4线接口,使用RXD、TXD、RTS和CTS。

I/O外设引脚映射如下图所示:

根据上面的外设I/O引脚映射可知

UART0对应的外部设置IO引脚关系为:位置1:P0_2----RX    P0_3----TX     位置2:P1_4----RX    P1_5----TX

UART1对应的外部设置IO引脚关系为:位置1:P0_5----RX    P0_4----TX     位置2:P1_7----RX    P1_6----TX

UART模式的操作有以下特点。

  • 8位或者9位负载数据
  • 奇校验、偶校验或者无奇偶校验
  • 配置起始位和停止位电平
  • 配置LSB(最低有效位)或MSB(最高有效位)首先传输
  • 独立接收中断
  • 独立收发DMA触发
  • 奇偶校验和帧检验出错状态

UART模式提供全双工传送,也就是说可以同时收发数据,传送一个UART字节包括1个起始位,8个数据位,1个作为可选的第9位数据或者奇偶校验位,再加上1个或者2个停止位。

UART操作由USART控制和状态寄存器UxCSR以及UART控制寄存器UxUCR来控制,x是USART的编号,数值为0或者1。

当UxCSR.MODE设置为1时设定为UART模式。

1)UART的发送过程

当USART收发数据缓冲器UxDBUF写入数据时,该字节自动发送到输出引脚TXD,UxDBUF寄存器时双缓冲的。当字节传送开始时,UxCSR.ACTIVE位变为高电平,而当字节传送结束时变为低电平。当传送结束时,UxCSR.TX_BYTE位设置为1。当USART收发数据缓冲寄存器就绪,准备接收新的发送数据时,就产生了一个中断请求,该中断在传送开始后立刻发生。

2)UART的接收过程

当1写入UxCSR.RE位时,UART开始接收数据。UART在输入引脚RXD上寻找有效起始位,并且设置UxCSR.ACTIVE位为1,当检测出有效起始位时,收到的字节就传入到接收寄存器,UxCSR.RX_BYTE位设置为1,该操作完成时,产生接收中断,同时UxCSR.ACTIVE变为0,通过寄存器UxDBUF提取收到的数据字节。当UxDBUF读出时,UxCSR.RX_BYTE位由硬件清零。

当运行UART模式时,内部的波特率发生器设置UART波特率。当运行在SPI模式时,内部的波特率发生器设置SPI主时钟频率。波特率由寄存器UxBAUD.BAUD_M[7:0] 和UxGCR.BAUD_E[4:0]定义。该波特率用于UART传送,也用于SPI传送的串行时钟速率。波特率定义公式:

式中:f是系统的时钟频率,等于16MHz或者32MHz

标准波特率所需的寄存器值如下表所示,该表适用于32MHz系统时钟。波特率误差,用百分数表示。

CC2530配置串口的一般步骤

1、配置串口的备用位置,是备用位置1,还是备用位置2。配置寄存器PERCFG外设控制寄存器

2、配置端口的外设优先级。此处配置P0外设优先作为UART0。配置寄存器P2DIR

3、配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0。配置寄存器P0SEL

4、配置相应串口的控制和状态寄存器。配置寄存器U0CSR、U0UCR

5、配置串口工作的波特率。配置寄存器U0GCR、U0BAUD

6、将对应的串口接收/发送中断标志位清0,清零:TCON.URX0IF、TCON.URX1IF、IRCON2.UTX0IF、IRCON2.UTX1IF

7、使能串口接收中断(一般发送不用中断),置1 IEN0.URX0IE

8、开总中断

中断相关的寄存器如下:

IEN0(0xA8)

TCON(0x88)

 

 IRCON2(0xE8)


/*****************************************************************************
*函 数 名:InitUART
*功    能:UART0串口初始化,波特率:115200
*入口参数:无
*出口参数:无
******************************************************************************/
void InitUART(void)
{
  PERCFG &= ~0x01;     //USART0为位置1
  P2DIR &= ~0xc0;      //优先级USART0 >USART1 >定时器1
  P0SEL |= 0x0c;       //P0_2,P0_3 用作串口(外部设备功能)
  U0CSR |= 0x80;       //设置为UART 方式
  U0CSR |= 0x40;       //使能接收器
  
  U0UCR = 0x02;        //禁止流控制,8bits,无校验位,1位停止位
                       //起始位低电平,停止位高电平
  U0GCR |=11;          //32MHz下的BAUD_E:11, 115200
  U0BAUD |= 216;       //32MHz下的BAUD_M:216 11520
  UTX0IF = 0;          //UART0 TX 中断标志初始置位0
  IEN0 |= 0x04;        //使能USART0 RX中断
  EA = 1;              //开总中断
}

/****************************************************************************
* 函 数 名: printf()
* 功    能: 串口打印函数
* 入口参数: 需要打印的字符串
* 出口参数: 打印长度
****************************************************************************/
int printf(const char*fmt, ...)
{
    uint32  ulLen;
    va_list ap;

    char*pBuf = (char*)osal_mem_alloc(50);  //开辟缓冲区
    va_start(ap, fmt);
    ulLen = vsprintf(pBuf, fmt, ap);         //用虚拟打印函数实现
    va_end(ap);
    
    osal_pwrmgr_device(PWRMGR_ALWAYS_ON);             //不开启低功耗功能
    HalUARTWrite(NPI_UART_PORT, (uint8*)pBuf, ulLen); //从串口x输出
    osal_mem_free(pBuf);                              //释放内存空间
    return ulLen;
}



阅读更多
个人分类: CC2541
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭