AT91SAM9260 串口调试的奇怪问题!!!!!!
- #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),我想知道这是怎么回事啊?是软件的问题还是调试器的问题~~希望各位帮忙研究下,不甚感激。
附上源代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论