[ CC2541 ] [ 1 ] UART 实验

简介

UART 全称 Universal Asynchronous Receiver Transmiter 即通用异步收发器,是一种通用的串行、异步通信总线。该总线有两条数据线,可以实现全双工的发送和接收。在嵌入式系统中常用于主机与辅助设备之间的通信。

Clipboard Image.png

(因为有两条数据线,所以可实现全双工通信。)

串口通信中重要的参数包括波特率、停止位、数据位、奇偶校验位等。典型的串口通信仅需三根线,发送数据线、接收数据线和地线。

Clipboard Image.png

实验目的

  1. 通过实验掌握 CC2541 芯片串口配置与使用
  2. 采集到内部温度传感器信息通过串口发送到上位机

传感器配置

温度传感器配置:

TR0=0x01;                               //设置为 1 来连接温度传感器到

SOC_ADC ATEST=0x01;        //使能温度传感

AD 传感器配置:

ADCCON3 = (0x3E);               //选择 1.25V 为参考电压;14 位分辨率;内温度传感器采样

ADCCON1 |= 0x30;                 //选择 ADC 的启动模式为手动

ADCCON1 |= 0x40;                 //启动 AD 转化

源码分析

void main(void) 
{   
    char i; 
    float AvgTemp;   
    char strTemp[6];
    
    InitUART();                           //初始化串口 
    InitSensor();                         //初始化 ADC 
    
    while(1) 
    { 
        AvgTemp = 0;          
        for (i=0; i<64; i++) 
        {    
            AvgTemp += GetTemperature();              
        }
        
        AvgTemp = AvgTemp/64;             //每次累加后除 64
                                          //从概率角度上来看,取平均值,可以提高计算精度
       
        memset(strTemp, 0, 6);
        sprintf(strTemp,"%.02f", AvgTemp);//将浮点数转成字符串
        UartSendString(strTemp, 5);       //通过串口发给电脑显示芯片温度
        DelayMS(1000);                    //延时
    } 
}
#define HAL_ADC_REF_1V25                0x00
#define ADC_12_BIT                      0x30
#define ADC_EMP_SENS                    0x0E
#define ADC_TO_CELSIUS(ADC_VALUE)       ((ADC_VALUE>>4)-334)   //温度校正

float GetTemperature(void)
{ 
   unsigned int  value; 
   unsigned char tmpADCCON3 = ADCCON3;
   
   ADCIF = 0;   
   
   //选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
   ADCCON3  = (HAL_ADC_REF_1V25 | ADC_12_BIT | ADC_EMP_SENS);            
   
   while(!ADCIF);                     //等待 AD 转换完成 
   value =  ADCL >> 2;                //ADCL 寄存器低 2 位无效 
   value |= (((unsigned int)ADCH) << 6);

   ADCCON3 = tmpADCCON3;

   return ADC_TO_CELSIUS(value);                               
}

image.png

image.png

Clipboard Image.png

void InitUART(void)
{
    PERCFG = 0x00;                   //位置1 P0口
    P0SEL = 0x3C;                    //P0用作串口
    
    P2DIR &= ~0xC0;                  //P0优先作为UART0    
    U0CSR |= 0x80;                   //串口设置为UART方式
    U0GCR |= 11;				
    U0BAUD |= 216;                   //波特率设为115200
    
    UTX0IF = 1;                      //UART0 TX中断标志初始置位1  
    U0CSR |= 0x40;                   //允许接收
    IEN0 |= 0x84;                    //开总中断,接收中断
}
void InitSensor(void)
{ 
   DISABLE_ALL_INTERRUPTS();     //关闭所有中断 
   InitClock();                  //设置系统主时钟为 32M 
   TR0=0x01;                     //设置为1来连接温度传感器到SOC_ADC
   ATEST=0x01;                   //使能温度传感
}   

参考

[1] 基于UART的嵌入式设备间连接方式的研究与验证