WSN之串口

来源:互联网 发布:女狙击手知乎 编辑:程序博客网 时间:2024/05/16 06:22

同步与异步 单工 、半双工和全双工
USART:通用的同步异步收发器
UART:通用的异步收发器
SPI:高速同步串行口

串口的配置步骤:
1、 指定串口模式,串口的IO口位置,SFR 寄存器位 PERCFG.U0CFG 选择是否使用备用位置 1 或备用位置 2。
2、 相应的IO配置成片上外设
3、 8个数据位,1个停止位,无流控,无校验
4、 确定波特率
5、 如果使用接收,那么需要开CPU中断,对应串口的接收中断,接收要使能

流控:提供了由于某种原因不能进行通讯时阻塞通讯的一种机制,流控可以使数据接收设备在不能接收数据时通知数据发送设备,使其停止发送。

UART操作由USART控制和状态寄存器UxCSR以及UART控制寄存器UxUCR 来控制。这里的 x是USART的编号,其数值为 0 或者 1。

由寄存器 UxBAUD.BAUD_M[7:0]和 UxGCR.BAUD_E[4:0]定义波特率。

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

#include <ioCC2530.h>#include <string.h>void Init_32M(){  CLKCONCMD &=~ (1 << 6);  CLKCONCMD &= ~0x07;  while(CLKCONSTA & 0x40); // 等待系统时钟稳定}void Init_UART0(){  PERCFG &= ~0x01; //选用串口0备用位置1  U0CSR |=  (1 << 7);//选择UART模式  P0SEL |= 0x0c;//将P0_2 P0_3 设置成片上外设  U0BAUD = 59;  U0GCR = 8; //以上两句将波特率设置为9600}void main(){  Init_32M();  Init_UART0();  char string[] = "hello world\n";  int i;  for(i = 0;i < strlen(string);i++)  {    U0DBUF = string[i];    while(UTX0IF == 0);//如果数据没有发送出去就等待    UTX0IF = 0;//清除发送中断标志位  }}
#include <ioCC2530.h>#include <string.h>#define LED1 P1_0#define LED2 P1_1void Init_32M(){  CLKCONCMD &=~ (1 << 6);  CLKCONCMD &= ~0x07;  while(CLKCONSTA & 0x40); // 等待系统时钟稳定}void Init_UART0(){  PERCFG &= ~0x01; //选用串口0备用位置1  U0CSR |=  (1 << 7) | (1 << 6);//选择UART模式,接收使能  P0SEL |= 0x0c;//将P0_2 P0_3 设置成片上外设  U0BAUD = 59;  U0GCR = 8; //以上两句将波特率设置为9600  URX0IE = 1;//接收器中断使能  EA = 1;//开CPU总中断}void main(){  Init_32M();  Init_UART0();  P1DIR |= 0x03;  LED1 = 0;  LED2 = 0;  while(1); }/*发送0时,D1、D2灭;发送1时,D1亮;发送2时,D2亮;发送3时,D1、D2亮*/char ch = -1;#pragma vector = URX0_VECTOR__interrupt void ISR_RX0(void){  ch = U0DBUF - '0';  if(ch == 0)  {    LED1 = 0;        LED2=0;  }   if(ch == 1)   {    LED1 = 1;        LED2=0;  }   if(ch == 2)   {    LED1 = 0;        LED2=1;  }  if(ch == 3)   {    LED1 = 1;        LED2=1;  }  URX0IF = 0;}