免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3764 | 回复: 0
打印 上一主题 下一主题

[其它] AT91SAM9260 串口调试的奇怪问题!!!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-02 15:27 |只看该作者 |倒序浏览
  1. #include <board.h>
  2. #include <pio/pio.h>
  3. #include <aic/aic.h>
  4. #include <usart/usart.h>
  5. #include <pmc/pmc.h>

  6. const Pin PINS[]={PINS_USART2};

  7. /// delay in MS (SDRAM)
  8. static void DelayMS (unsigned long dly)
  9. {
  10.         unsigned long i;
  11.         for ( ; dly>0; dly--)
  12.                 for (i=0; i< 4000; i++);       
  13. }
  14. /// USART 接收中断服务程序
  15. void ISR_USART2(void)  
  16. {
  17.         unsigned short data;
  18.         data = USART_Read(AT91C_BASE_US2, 0);
  19.         USART_Write(AT91C_BASE_US2, data, 0);  //将接收到的字符立即发送出去
  20. }
  21. /*
  22. void ConfigureUsart2(void)
  23. {
  24.         PMC_EnablePeripheral(AT91C_ID_US2);   //使能串口时钟
  25.         /// 配置串口,8位异步模式,无校验,波特率115200
  26.         USART_Configure(AT91C_BASE_US2, USART_MODE_ASYNCHRONOUS, 115200, BOARD_MCK);

  27.         USART_SetTransmitterEnabled(AT91C_BASE_US2,1);  // 使能串口发送
  28.         USART_SetReceiverEnabled(AT91C_BASE_US2,1);  // 使能串口接收

  29.         /// 配置串口中断,内部高电平触发,中断服务子程序为ISR_USART2
  30.         AIC_ConfigureIT(AT91C_ID_US2, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, ISR_USART2);
  31.         AIC_EnableIT(AT91C_ID_US2);
  32.         AT91C_BASE_US2->US_IER=AT91C_US_RXRDY;  //串口接收中断使能
  33. } */


  34. //------------------------------------------------------------------------------
  35. /// main function
  36. //------------------------------------------------------------------------------

  37. int main (void)  
  38. {
  39.         PIO_Configure(PINS, PIO_LISTSIZE(PINS));  

  40.         PMC_EnablePeripheral(AT91C_ID_US2);   //使能串口时钟
  41.         /// 配置串口,8位异步模式,无校验,波特率115200
  42.         USART_Configure(AT91C_BASE_US2, USART_MODE_ASYNCHRONOUS, 115200, BOARD_MCK);

  43.         USART_SetTransmitterEnabled(AT91C_BASE_US2,1);  // 使能串口发送
  44.         USART_SetReceiverEnabled(AT91C_BASE_US2,1);  // 使能串口接收

  45.         /// 配置串口中断,内部高电平触发,中断服务子程序为ISR_USART2
  46.         AIC_ConfigureIT(AT91C_ID_US2, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, ISR_USART2);
  47.         AIC_EnableIT(AT91C_ID_US2);
  48.         AT91C_BASE_US2->US_IER=AT91C_US_RXRDY;  //串口接收中断使能

  49. //        ConfigureUsart2();

  50.         while(1)
  51.         {
  52. //                  USART_Write(AT91C_BASE_US2,'T',0);
  53. //                  DelayMS(500);

  54.         }
  55. }
复制代码
今天调试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),我想知道这是怎么回事啊?是软件的问题还是调试器的问题~~希望各位帮忙研究下,不甚感激。

附上源代码。

core9260-usart-rs232.rar

817.99 KB, 下载次数: 75

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP