目录
5.1、USART寄存器,每一个 USART都有5个寄存器:
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)
{
}
}