*File: main.c
*功能:使用串口UART0接收上位机发送的数据,当接收到8个连续数据后,取反LED控制,并将
* 数据原封不动地发送回上位机
*******************************************************************************/
#include"config.h"
#define LED1CON0x00000400 /*LED(DS11)控制,低电平点亮,用于通信指示*/
/*定义Fpclk值,用于设置串口波特率*/
#defineFPCLK 2764800L
/*定义串口模式设置数据结构*/
typedef struct UartMode
{ uint8 datab //字长度,5/6/7/8
uint8 stopb //停止位,1/2
uint8 parity //奇偶校验位,0为无校验,1为奇数校验,2位偶数校验
} UARTMODE
uint8 rcv_buf[8] //UART0数据接收缓冲区
uint8 rcv_new //接收新数据标志
/*******************************************************************************
*名称: IRQ_UART0(void)
*功能: 串口UART0接收中断
*******************************************************************************/
void __irq IRQ_UART0(void)
{ uint32 i
i=IOSET //读取当前LED控制值
if((i&LED1CON)==0) //控制LED输出
{ IOSET=LED1CON
}
else
{ IOCLR=LED1CON
}
if(0x04==(U0IIR&0x0F))rcv_new=1 //设置接收到新的数据标志
for(i=0i<7i++)
{ rcv_buf[i]=U0RBR//读取FIFO的数据,并清除中断标志
}
VICVectAddr=0x00 //中断处理结束
}
/*******************************************************************************
*名称: SendByte()
*功能: 向串口发送字节数据
*入口参数:data 要发送的数据
*******************************************************************************/
void SendByte(uint8 data)
{ U0THR=data
while((U0LSR&0x20)==0) //等待数据发送
}
/*******************************************************************************
*名称: ISendBuf()
*功能: 将缓冲区的数据发送回主机,并等待发送完毕
*******************************************************************************/
void ISendBuf(void)
{ uint8 i
for(i=0i<7i++)SendByte(rcv_buf[i])
while((U0LSR&0x20)==0) //等待数据发送
}
/*******************************************************************************
*名称: UART0_Ini()
*功能: 初始化串口0. 设置其工作模式及波特率
*入口参数: baud 波特率
set 模式设置 (UARTMODE数据结构)
*出口参数:返回值为1时表示初始化成功,为0表示参数出错
*******************************************************************************/
uint8 UART0_Ini(uint32 baud,UARTMODE set)
{ uint32 bak
/*参数过滤*/
if((0==baud)||(baud>115200))return(0)
if((set.datab<5)||(set.datab>8))return(0)
if((0==set.stopb)||(set.stopb>2))return(0)
if(set.parity>4)return(0)
/*设置串口波特率*/
U0LCR=0x80//DLAB位置1
bak=(FPCLK>>4)/baud
U0DLM=bak>>8
U0DLL=bak&0xff
/*设置串口模式*/
bak=set.datab-5 //设置字长度
if(2==set.stopb)bak|=0x04 //判断是否为2位停止位
if(0!=set.parity){set.parity=set.parity-1bak|=0x08}
bak|=set.parity<<4//设置奇偶校验
U0LCR=bak
return(1)
}
/*******************************************************************************
*名称: main()
*功能: 初始化串口,并等待接收到串口数据
*******************************************************************************/
int main(void)
{ UARTMODE uart0_set
PINSEL0=0x00000005 //设置I/O连接到UART0
PINSEL1=0x00000000
IODIR=LED1CON //设置LED控制口为输出,其它I/O为输入
rcv_new=0
uart0_set.datab=8 //8位数据位
uart0_set.stopb=1 //1位停止位
uart0_set.parity=0 //无奇偶校验位
UART0_Ini(9600,uart0_set) //初始化串口模式,波特率9600
U0FCR=0x81 //使能FIFO,并设置触发点为8字节
U0IER=0x01//允许RBR中断,即接收中断
/*设置中断允许*/
VICIntSelect=0x00000000//设置所有通道为IRQ中断
VICVectCntl0=0x26 //UART0中断通道分配到IRQ Slot0,即优先级最高
VICVectAddr0=(int)IRQ_UART0//设置UART0向量地址
VICIntEnable=0x00000040//使能UART0中断
while(1) //等待中断
{
if(1==rcv_new)
{
ISendBuf() //将接收到的数据发送回主机
rcv_new=0
}
}
return(0)
}
我是你唐璜哥哥,快给钱。
你可以查一下ARM资料,在UART0中断处理的表格中,U0IIR[3:0]为0001时,表示没有该中断,最后不为1表示有中断,所以对应程序看,与0X01与,没有中断就不进入while循环。后面switch( (U0IIR &0x0E)) 可以写成switch(U0IIR) 本身没有错误,但对于资深的程序员,这样的习惯是非常好的。由于判断前三位,所以就是应该与上1110也就是十六位的E。程序后面翻译可以理解为,如果有中断产生,数值0X06,4,C,2分别对应相应的功能,就可以判断具体的中断原因了。具体功能还是去看ARM的UART0一章便非常清楚了。
如果还有问题可以继续提问。希望你满意。
CC2430包括2个串行通信接口 USART0 与 USART1,每个串口包括两个模式:UART(异步)模式、SPI(同步)模式,本节仅涉及UART模式)。两个USART具有同样的功能,可以设置在单独的I/O 引脚.P0_2、P0_3配置为外设功能时:P0_2为RX, P0_3为TX.USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式。两个USART具有同样的功能,可以设置在单独的I/O 引脚。
相关寄存器为UxCSR、UxCSR、UxGCR、UxBUF、UxBAUD、CLKCONCMD、CLKCONSTA,具体的参数参看datesheet。
CC2530配置串口的一般步骤:
1、 配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0
2、 配置相应串口的控制和状态寄存器。
3、 配置串口工作的波特率。
寄存器具体配置如下:
PERCFG = 0x00 //位置1 P0口
P0SEL = 0x0c //P0_2,P0_3用作串口(外部设备功能)
P2DIR &= ~0XC0 //P0优先作为UART0
U0CSR |= 0x80 //设置为UART方式
U0GCR |= 11
U0BAUD |= 216 //波特率设为115200 根据上面表中获得的数据
UTX0IF = 0 //UART0 TX 中断标志初始置位 0
/****************************************************************************
* 描 述: 设置串口调试助手波特率:115200bps 8N1
* 会收到 CC2530 发过来的:Hello Zigbee
****************************************************************************/
#include <ioCC2530.h>
#include <string.h>
typedef unsigned char uchar
typedef unsigned int uint
#define TX_SIZE 20
#define TX_STRING "Hello Zigbee "
char TxData[TX_SIZE] //存储发送字符串
/****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时
* 入口参数: msec 延时参数,值越大延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j
for (i=0i<mseci++)
for (j=0j<1070j++)
}
/****************************************************************************
* 名 称: InitUart()
* 功 能: 串口初始化函数
****************************************************************************/
void InitUart(void)
{
PERCFG = 0x00 //外设控制寄存器 USART 0 的 IO 位置:0 为 P0 口位置 1
P0SEL = 0x0c //P0_2,P0_3 用作串口(外设功能)
P2DIR &= ~0XC0 //P0 优先作为 UART0
U0CSR |= 0x80 //设置为 UART 方式
U0GCR |= 11
U0BAUD |= 216 //波特率设为 115200
UTX0IF = 0 //UART0 TX 中断标志初始置位 0
}
/****************************************************************************
* 名 称: UartSendString()
* 功 能: 串口发送函数
* 入口参数: Data:发送缓冲区 len:发送长度
* 出口参数: 无
****************************************************************************/
void UartSendString(char *Data, int len)
{
uint i
for(i=0i<leni++)
{
U0DBUF = *Data++
while(UTX0IF == 0)
UTX0IF = 0
}
}
/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
CLKCONCMD &= ~0x40 //设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA &0x40) //等待晶振稳定为 32M
CLKCONCMD &= ~0x47 //设置系统主时钟频率为 32MHZ
InitUart() //调置串口相关寄存器
memset(TxData, 0, TX_SIZE) //数据清 0
memcpy(TxData, TX_STRING, sizeof(TX_STRING))//复制发送字符串到 TxData
while(1)
{
UartSendString(TxData, sizeof(TX_STRING))//串口发送数据
DelayMS(1000) //延时 1 秒
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)