AT91SAM9260 串口调试的奇怪问题

li_xiang1102 2011-04-02 03:37:57
#include <board.h>

#include <pio/pio.h>

#include <aic/aic.h>

#include <usart/usart.h>

#include <pmc/pmc.h>



const Pin PINS[]={PINS_USART2};



/// delay in MS (SDRAM)

static void DelayMS (unsigned long dly)

{

unsigned long i;

for ( ; dly>0; dly--)

for (i=0; i< 4000; i++);

}

/// USART 接收中断服务程序

void ISR_USART2(void)

{

unsigned short data;

data = USART_Read(AT91C_BASE_US2, 0);

USART_Write(AT91C_BASE_US2, data, 0); //将接收到的字符立即发送出去

}

/*

void ConfigureUsart2(void)

{

PMC_EnablePeripheral(AT91C_ID_US2); //使能串口时钟

/// 配置串口,8位异步模式,无校验,波特率115200

USART_Configure(AT91C_BASE_US2, USART_MODE_ASYNCHRONOUS, 115200, BOARD_MCK);



USART_SetTransmitterEnabled(AT91C_BASE_US2,1); // 使能串口发送

USART_SetReceiverEnabled(AT91C_BASE_US2,1); // 使能串口接收



/// 配置串口中断,内部高电平触发,中断服务子程序为ISR_USART2

AIC_ConfigureIT(AT91C_ID_US2, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, ISR_USART2);

AIC_EnableIT(AT91C_ID_US2);

AT91C_BASE_US2->US_IER=AT91C_US_RXRDY; //串口接收中断使能

} */





//------------------------------------------------------------------------------

/// main function

//------------------------------------------------------------------------------



int main (void)

{

PIO_Configure(PINS, PIO_LISTSIZE(PINS));



PMC_EnablePeripheral(AT91C_ID_US2); //使能串口时钟

/// 配置串口,8位异步模式,无校验,波特率115200

USART_Configure(AT91C_BASE_US2, USART_MODE_ASYNCHRONOUS, 115200, BOARD_MCK);



USART_SetTransmitterEnabled(AT91C_BASE_US2,1); // 使能串口发送

USART_SetReceiverEnabled(AT91C_BASE_US2,1); // 使能串口接收



/// 配置串口中断,内部高电平触发,中断服务子程序为ISR_USART2

AIC_ConfigureIT(AT91C_ID_US2, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, ISR_USART2);

AIC_EnableIT(AT91C_ID_US2);

AT91C_BASE_US2->US_IER=AT91C_US_RXRDY; //串口接收中断使能



// ConfigureUsart2();



while(1)

{

// USART_Write(AT91C_BASE_US2,'T',0);

// DelayMS(500);



}

}

今天调试9260的串口,发现了两个很奇怪的问题,上面程序是通过中断接收数据,然后立即回发数据,main.c的代码如上。
问题来了:
1. 当我不使用ConfigureUsart2()函数,而是把里面的内容原封不动地搬到main.c里,串口可以正常通信;而当我在main里调用ConfigureUsart2()时,通过PC向9260发送第一个数据后,它能够接收并返回,当再发数据时,就没有反应了,发现此时程序进入了预取指错误异常,通过调试发现程序没有正常返回中断! 为什么会有这样的问题呢???!!!

2. 更奇怪的是我在while循环中添加 USART_Write(AT91C_BASE_US2,'T',0)语句,让它不断向上位机发送字符‘T’,结果当PC向9260发送数据时,程序又跑飞了,查看此时中断向量全是错误的(如下):
0x00200000 00000000 ANDEQ R0,R0,R0
0x00200004 00000000 ANDEQ R0,R0,R0
0x00200008 00000000 ANDEQ R0,R0,R0
0x0020000C 00000201 ANDEQ R0,R0,R1,LSL #4
0x00200010 00000000 ANDEQ R0,R0,R0
0x00200014 00000073 ANDEQ R0,R0,R3,ROR R0
0x00200018 00000000 ANDEQ R0,R0,R0


这两个问题太奇怪了,本人用的是Keil MDK 4.12和JLink v8进行调试,程序下载地址0x20000000(SDRAM),我想知道这是怎么回事啊?是软件的问题还是调试器的问题~~希望各位帮忙研究下,不甚感激。

附上源代码链接
http://bbs.chinaunix.net/viewthread.php?tid=2295706&extra=page%3D1
...全文
284 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
thenbingo 2011-04-02
  • 打赏
  • 举报
回复
发的程序里没看到main.c啊。
我建议你检查一下堆栈的配置。(r13 sp)
dthxman 2011-04-02
  • 打赏
  • 举报
回复
对于第一个问题,一步步查,把ConfigureUsart2()里的函数一句句屏蔽,然后运行,看到底是哪句话出问题了,都是设置寄存器,某一步设置出问题都有可能,找到那句话,然后查datasheet。
关于第二个,可能很多,你的接受中断函数里面应该有判断标志位的语句,不然所有的情况都处理,很有可能出问题,总的来说你的代码不规范,看看规范点的串口代码。

21,597

社区成员

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

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