arm2103 串口问题

zuanshishou 2010-09-17 08:46:12
帮帮忙 弄了好久还没弄好
这是easyarm2103的 串口通讯uart
为什么我的 串口调试工具都接收不到传送过来的数据
以下是代码 非常感谢大家
代码是周立功的 easyarm教材上的程序
#include "config.h" /* LPC21xx definitions */
/*定义串口模式设置数据结构*/
typedef struct UartMode
{
uint8 datab; //字长度,5/6/7/8可选
uint8 stopb; //停止位,1/2可选
uint8 parity; //奇偶校验位,0;无校验;1:奇校验;2:偶校验
}UARTMODE;

uint8 rcv_buf[8]; // UART0 数据接收缓冲区
volatile uint8 rcv_new; // 接受新数据标志

/*********************************************************************************************************
** 函数名称: IRQ_UART0()
** 函数功能: 串口0接受中断服务程序
** 入口参数: 无
** 出口参数: 无
********************************************************************************************************/
void __irq IRQ_UART0(void)
{
uint8 i;
if((U0IIR & 0x0f) == 0x04)
rcv_new = 1; //设置接收到新的数据标志
for(i=0; i<8; i++) //FIFO使能时设为8字节长度
{
rcv_buf[i] = U0RBR; //读取FIFO的数据,并清除中断
}
VICVectAddr = 0x00; // 中断处理结束
}
/*********************************************************************************************************
** 函数名称: UART0_SendByte()
** 函数功能: 向串口0发送1字节数据
** 入口参数: dat 要发送的数据
** 出口参数: 无
********************************************************************************************************/

void UART0_SendByte(uint8 dat)
{
U0THR = dat; //要发送的数据

}

/*********************************************************************************************************
** 函数名称: UART0_SendBuf()
** 函数功能: 向串口0发送8字节数据
** 入口参数: 无
** 出口参数: 无
**********************************************************************************************************/

void UART0_SendBuf(void)
{
uint8 i;

for(i=0; i<8; i++)
UART0_SendByte(rcv_buf[i]);
while((U0LSR & 0x20) == 0); //等待数据发送完毕
}
/*********************************************************************************************************
** 函数名称: UART0_Init()
** 函数功能: 串口初始化,设置工作模式和波特率
** 入口参数: baud 波特率
set 模式设置(UARTMODE 数据结构)
** 出口参数: 1为初始化成功,0为初始化失败
**********************************************************************************************************/
uint8 UART0_Init(uint32 baud, UARTMODE set)
{
uint32 bak;

/* 参数过滤 */
if((baud == 0) || (baud > 115200))
return 0;
if((set.datab < 5) || (set.datab > 8))
return 0;
if((set.stopb == 0) || (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; // DLAB = 0

// 设置串口模式 //已在U0LCR中设置
bak = set.datab - 5; // 设置字长
if (set.stopb == 2) bak |= 0x04; // 判断是否为2位停止位

if (set.parity != 0)
{
set.parity = set.parity - 1;
bak |= 0x08;
}
bak |= set.parity << 4; // 设置奇偶校验

U0LCR = bak;

return(1);
}
/*********************************************************************************************************
** 函数名称: main()
** 函数功能: 从串口 UART0 接受字符串,并发送回上位机显示
** 调试说明: 需要 PC 串口显示终端软件
**********************************************************************************************************/
int main (void)
{

UARTMODE set;
set.datab = 8;
set.stopb = 1;
set.parity = 0;

rcv_new = 0;

PINSEL0 = (PINSEL0 & (~0x0f)) | 0x05; //设置IO为UART0

UART0_Init(115200,set); //串口初始化
U0FCR = 0x81; //使能 FIFO,并设置出发点为8字节
U0IER = 0x01; //允许 RBR 中断,即接受中断
IRQEnable(); //使能IRQ 中断,此函数在ZLG的lpc2131模版中

/*使能 UART0 中断*/
VICIntSelect = 0x00000000; //设置所有的通道为 IRQ 中断
VICVectCntl0 = 0x20 | 0x06; // UART0 分配到IRQ slot0,即最高优先级

VICVectAddr0 = (uint32)IRQ_UART0; //设置UART0 向量地址
VICIntEnable = 1 << 0x06; //使能UART0 中断

while(1)
{
if (rcv_new == 1) //如果有新数据
{
rcv_new = 0; //清除标志,以接受新数据
UART0_SendBuf();
}
}
// return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/

...全文
45 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Great_Bug 2010-09-19
  • 打赏
  • 举报
回复
应该还有一个汇编语言的模块,在IRQ模式实现向中断向量跳转。

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧