cc2530串口1实现双机通讯

本文详细介绍了使用CC2530微控制器进行UART串口通信的配置,包括UART模式设定、波特率计算、串口初始化、中断设置以及发送和接收函数的编写。还特别提到了如何重定向printf输出到串口0以便于调试。此外,文中给出了串口0和串口1的初始化示例,以及中断处理函数,用于实现与PC和其他板间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、UART模式

2、UART发送

3、UART接收

4、UART波特率

5、USRT中断

5.1、USART寄存器,每一个 USART都有5个寄存器:

 6、实战

 6、1串口0初始化

6.2、串口1初始化 

6.3、串口1发送数据函数

6.4、串口0重定向输出

 6.5、串口中断接收函数

6.6、主函数


1、UART模式

2、UART发送

 3、UART接收

 4、UART波特率

本次使用的开发板为cc2530,其外部晶振为32MHz,可通过其中文开发文档查看器波特率的计算公式,计算公式为:

f 是系统的时钟频率,等于16或者32MHz的时钟频率,可通过编程选择。 

32MHz下的重建的波特率配置如下图所示

5、USRT中断

每一个串口都有2个中断,分别为接受和发送中断,但开始传输时发生TX中断,在开始接收时发生RX中断。

5.1、USART寄存器,每一个 USART都有5个寄存器:

U0CSR寄存器

 

如果需要配置为UART模式,只需要将寄存器的最高位置1即可例如 U0CSR|=0X80

如果配置为允许接收,只需要将寄存器的第7为置为1即可 例如  U0CSR|=0X40

 U0UCR寄存器:

配置和上面的配置同理

U0GCR 寄存器

 6、实战

 6、1串口0初始化

串口0与PC机进行通讯,打印温度数据。

void initUART0(void)
{ 
  CLKCONCMD &= ~0x40;                    //设置系统时钟源为32MHZ晶振
  while(CLKCONSTA & 0x40);               //等待晶振稳定
  CLKCONCMD &= ~0x47;                    //设置系统主时钟频率为32MHZ
  
  PERCFG = 0x00;		         //位置1  P0.2/P0.3口
  P0SEL |= 0x0c;		         //P0.2,P0.3用作串口(外部设备功能)
  P2DIR &=~0XC0;
  
  U0CSR |= 0x80;		         //设置为UART方式
  U0GCR |= 11;		                 //BAUD_E        
  U0BAUD |= 216;		         //BAUD_M 波特率设为115200
  UTX0IF = 0;	                         //UART1 TX中断标志初始置位0
  U0CSR |= 0X40;                         //允许接收 
  IEN0 |= 0x84;                          // 开总中断,UART1接收中断  
  EA=1;
}

6.2、串口1初始化 

串口1实现与板1 和板2之间的通信。

void initUART1(void)
{ 

  PERCFG = 0x00;		//位置1  P0.4/P0.5口
  P0SEL |= 0x30;		//P0.4,P0.5用作串口(外部设备功能)
  P2DIR &=~0X80;
  
  U1CSR |= 0x80;		//设置为UART方式
  U1GCR |= 11;		        //BAUD_E        
  U1BAUD |= 216;		//BAUD_M 波特率设为115200
  UTX1IF = 1;	                //UART1 TX中断标志初始置位0
  U1CSR |= 0X40;                //允许接收 
  IEN0 |= 0x88;                 // 开总中断,UART1接收中断  
  EA=1; 
}

6.3、串口1发送数据函数

void Uart1TX_Send_String(unsigned char *Data,int len)   //串口发送函数--发送字符串
{
    int j;
    for(j=0;j<len;j++)
    {
    	U1DBUF = *Data++;   
    	while(UTX1IF == 0);
    	UTX1IF = 0;
    }
}

void Uart1TX_Send_Data(unsigned char Data,int len)   //串口发送函数--发送字符
{
    int j;
    for(j=0;j<len;j++)
    {
    	U1DBUF = Data;   
    	while(UTX1IF == 0);
    	UTX1IF = 0;
    }
}

6.4、串口0重定向输出

由于单片机默认不能通过printf输出,不方便输出数据显示。可通过重定向输出实现使用printf打印数据。

#include <stdio.h>//头文件


__near_func int putchar(int c)//串口0 printf输出重定向
{
    UTX0IF = 0;
    U0DBUF = (char)c;
    while(UTX0IF == 0);
    return(c);
}

 6.5、串口中断接收函数

//对应的中断函数:
#pragma vector = URX1_VECTOR 
__interrupt void UART1_ISR(void) 
{ 
  URX1IF = 0; //清中断标志
  uart1_buffer = U1DBUF;
  if(uart1_buffer=='a')    //判断串口1接收的数据
    {
      beep_flag=0;
    }
    else
    {
      beep_flag=1;
    }
}


#pragma vector=URX0_VECTOR   //uart0中断函数
__interrupt void uart0(void){
    URX0IF = 0; //清中断标志
    uart0_buffer = U0DBUF;
    
}

6.6、主函数

void main()
{
    initUART0();            //串口0初始化
    initUART1();            //串口1初始化
    led_Init();             //led灯初始化
    
  while(1)
  {

    
  } 
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值