目录
串口收发实验:实现按键按下发送字符串+串口接收中断回显(串口接收中断+外部中断)
Zigbee串口通信
理论部分
1.CC2530具有两个串口,并且每个串口都可以配置选择控制脚,注意串口工作必须是32M系统时钟
2.串口配置步骤
以串口0为例
(1)PERCFG第0位设置为0,表示指定串口的IO位置为备用位置1;设置为1,表示指定串口的IO位置为备用位置2
(2)配置IO为偏上外设功能:P0SEL |= 0x0C; //0000 1100
(3)U0CSR |= 0xC0;//8个数据位,1个停止位,无硬件流、无校验
(4)配置波特率:U0GCR = 11;U0BAUD = 216;//看表直接用
(5)开启总中断和串口中断:URX0IE=1;EA=1;
3.串口中断函数
实验部分
程序实现CC2530通过串口0与上位机通信(接收中断回显)
#include <iocc2530.h>
void delay_us()
{
char k=63;
while(k--);
}
void Init32M()
{
SLEEPCMD &= ~(0x01<<1); //1111 1110 开启两个高频时钟源
while(SLEEPSTA & 0x40==0);//0100 0000 等待32M稳定
delay_us();
CLKCONCMD &= 0xF8;//低3位清零 不分频输出
CLKCONCMD &= 0xBF; //1011 1111 设置32M为系统主时钟
while(CLKCONSTA & 0x40); //0100 0000 等待32M成功配置为当前系统主时钟
}
void Uart_Config()
{
//串口0的备用位置1配置为波特率9600
PERCFG &= 0xFE;//1111 1110 选中串口0的备用位置1
P0SEL |= 0x0C; //0000 1100 配置P0_2 P0_3为偏上外设功能
U0CSR |= 0xC0;
U0GCR = 8;
U0BAUD = 59; //9600
EA=1;
URX0IE=1;//开启串口接收中断
}
void main()
{
Init32M();
Uart_Config();
while(1)
{
}
}
#pragma vector=URX0_VECTOR
__interrupt void UART0_IRQ(void)
{
char ch;
URX0IF = 0;//串口0接收标志位,硬件会自动置1,需要软件清0
ch = U0DBUF;//从接收寄存器取字节存入ch
U0DBUF = ch;//把变量ch的值传给串口发送寄存器
while(UTX0IF == 0);//等待发送标志硬件置1
UTX0IF = 0;
}
串口收发实验:实现按键按下发送字符串+串口接收中断回显(串口接收中断+外部中断)
#include <iocc2530.h>
void delay_us()
{
char k=63;
while(k--);
}
void Init32M()
{
SLEEPCMD &= ~(0x01<<1); //1111 1110 开启两个高频时钟源
while(SLEEPSTA & 0x40==0);//0100 0000 等待32M稳定
delay_us();
CLKCONCMD &= 0xF8;//低3位清零 不分频输出
CLKCONCMD &= 0xBF; //1011 1111 设置32M为系统主时钟
while(CLKCONSTA & 0x40); //0100 0000 等待32M成功配置为当前系统主时钟
}
void delay_ms(int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=587;j>0;j--);
}
void Uart_Config()
{
//串口0的备用位置1配置为波特率9600
PERCFG &= 0xFE;//1111 1110 选中串口0的备用位置1
P0SEL |= 0x0C; //0000 1100 配置P0_2 P0_3为偏上外设功能
U0CSR |= 0xC0;
U0GCR = 8;
U0BAUD = 59; //9600
EA=1;
URX0IE=1;//开启串口接收中断
}
void String_Print(unsigned char *str)
{
for(;*str!='\0';str++)
{
//UTX0IF = 0;
U0DBUF=*str;
while(UTX0IF==0);
UTX0IF=0;
}
}
void Exti0_Config()
{
P0SEL &= 0xFE;
P0DIR &= 0xFE;
P0INP &= 0xFE;
P2INP &= 0xDF;
P0IE = 1;
P0IEN |= 0x01;
EA = 1;
PICTL |= 0x01;
}
void main()
{
Init32M();
Uart_Config();
Exti0_Config();
P1DIR |= 0x01;
P1_0=0;
while(1)
{
}
}
#pragma vector=P0INT_VECTOR
__interrupt void exti_0()
{
if(P0IFG &= 0x01)//P0_0引发了外部中断
{
delay_ms(100);//按键消抖
P1_0=~P1_0;
String_Print("2023-6-18\n\r");
}
P0IFG=0;
P0IF=0;
}
#pragma vector=URX0_VECTOR//接收中断函数
__interrupt void UART0_IRQ(void)
{
char ch;
URX0IF = 0;//串口0接收标志位,硬件会自动置1,需要软件清0
ch = U0DBUF;//从接收寄存器取字节存入ch
U0DBUF = ch;//把变量ch的值传给串口发送寄存器
while(UTX0IF == 0);//等待发送标志硬件置1
UTX0IF = 0;
}
实验现象:
可参考CC2530串口通信