CC2541之串口(转)

转载 2018年04月16日 14:02:26

来源-作者@欣庸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;
}



BLE CC2541串口调试

不管学习哪款MCU,串口都是最好的调试工具。 使用工具:USB转TTL串口和CC Debugger仿真器。 使用UART0收发送数据接线: USB转TTL串口 BLE CC2541最小模块 ...
  • u012246376
  • u012246376
  • 2015年07月31日 22:14
  • 2160

CC2540/CC2541/CC254x之可变参数串口打印配置

可变参数串口打印的配置
  • zzfenglin
  • zzfenglin
  • 2016年07月19日 16:20
  • 3362

CC2541 添加串口功能

最近重新写了 CC2541 的程序,这里把添加串口的流程介绍一下。 CC2541 历程里面有一个 npi.c 文件,是用来操作串口的,但是我没有直接使用这个文件,反正也就是初始化的操作而已,自己写就好...
  • haozi0_0
  • haozi0_0
  • 2016年03月29日 22:33
  • 2507

蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现

蓝牙4.0BLE 手机控制 cc2540 CC2541 的串口透传功能已实现        虽然蓝牙4.0 BLE芯片CC2540 是单芯片(即用户可以对它进行芯片级代码编写), 是8051增强型主控...
  • mzy202
  • mzy202
  • 2014年05月15日 10:01
  • 26864

CC2541 关闭串口问题

在调试低功耗时,最好关闭串口,需要修改宏: HAL_UART=FALSE HAL_UART_DMA=1 HAL_UART_ISR=0 HAL_UART_TX_BY_ISR=1 但...
  • haozi0_0
  • haozi0_0
  • 2015年07月28日 12:25
  • 1660

CC2541(主UART)-CC2541(从UART)串口透传实验

转自:http://www.mcuzone.com/bbs/read.php?tid=10946&page=e 【CC254X_BLE】CC2541(主UART)-CC2541(从UART)串口...
  • haozi0_0
  • haozi0_0
  • 2015年10月14日 16:39
  • 3847

【BLE】CC2541之串口收发

本文介绍如何在SimpleBLEPeripheral工程中,使用串口
  • feilusia
  • feilusia
  • 2015年09月21日 17:34
  • 16037

CC2541_串口无法打印的流控问题

此博文最后修改时间  2016-12-30   一、简介 解答AmoMcu开发板CC2541部分程序串口无法打印和回应问题   二、实验环境 协议栈版本:BLE-CC254x-1.3.2 编译软件...
  • ghostfly_craft
  • ghostfly_craft
  • 2016年12月30日 16:13
  • 660

【TI BLE】CC2541串口控制蓝牙详解

一、简介 本文以SimpleBLECentral工程为例,介绍串口控制蓝牙。 过程: 扫描从机 - 根据从机号连接指定从机 - 获取RSSI值(信号强度) - 向char...
  • liwei16611
  • liwei16611
  • 2017年07月11日 16:02
  • 1451

BLE CC2541 DMA串口查询方式环形缓冲区的建立 与函数指针 回掉函数的使用

GPS模块上电默认一秒钟发送以下数据 $GPRMC,034230.00,A,2231.36386,N,11402.87302,E,0.039,,310516,,,A*7E $GPVTG,,T,,M,0...
  • upanupanupan
  • upanupanupan
  • 2016年09月13日 17:55
  • 872
收藏助手
不良信息举报
您举报文章:CC2541之串口(转)
举报原因:
原因补充:

(最多只允许输入30个字)