AT91SAM9260 串口调试的奇怪问题!!!!!!

发布于 2022-09-30 18:22:17 字数 4883 浏览 15 评论 0

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

附上源代码。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文