关于嵌入式应用技术中的UART0的问题

关于嵌入式应用技术中的UART0的问题,第1张

/*******************************************************************************

*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 秒

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11394418.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存