用过keil的高手请进,关于初始化UART0,在线等。。。

xxxhenxi   2010-5-5 19:42 楼主
  keil下初始化串口老是不成功,串口输出的都是乱码,但是在ADS下初始化都是正常的,是不是在ADS和keil下初始化有什么区别,高手指点一下。。。

回复评论 (15)

使用软件仿真的吗?keil就是容易出问题,就是总输出乱码。
先用这个试一下
TI = 1;
printf("OK!!!\n");
while(1);
点赞  2010-5-5 20:27
引用: 引用 1 楼 wo_happy 的回复:
使用软件仿真的吗?keil就是容易出问题,就是总输出乱码。
先用这个试一下
TI = 1;
printf("OK!!!\n");
while(1);

我使用硬件仿真的,串口发数据
有点奇怪的是,我先在ADS下运行代码,然后再在keil下运行串口就正常的了
点赞  2010-5-5 20:33
是不是你仿真状态下的波特率设置不对啊?
先在ADS下运行代码,然后再在keil下运行串口就正常的了,那是keil状态下,开始通讯失败,可以找找开头的代码看看,呵呵。
点赞  2010-5-6 16:24
引用: 引用 3 楼 peasant_lee 的回复:

是不是你仿真状态下的波特率设置不对啊?
先在ADS下运行代码,然后再在keil下运行串口就正常的了,那是keil状态下,开始通讯失败,可以找找开头的代码看看,呵呵。

如何在keil下接收串口的数据,用中断方式,我老是进不了中断
串口初始化代码如下

  1. /* 初始化UART0 */
  2. void init_uart(void)
  3. {
  4.         UARTMODE  set;
  5.         uint32  bak;
  6.        
  7.         uint32 baud = 9600;
  8.        
  9.         PINSEL0 = 0x00000005;                 // 设置I/O连接到UART0
  10.        
  11.         set.datab = 8;                 // 8位数据位
  12.         set.stopb = 1;                 // 1位停止位
  13.         set.parity = 0;                // 无奇偶校验
  14. /*********************************************************************/       
  15.    /* 设置串口波特率 */
  16.    U0LCR = 0x80;                        // DLAB位置1
  17.    bak = (Fpclk>>4)/baud;
  18.    U0DLM = bak>>8;
  19.    U0DLL = bak&0xff;
  20.    
  21.    /* 设置串口模式 */
  22.    bak = set.datab-5;                   // 设置字长度
  23.    if(2==set.stopb) bak |= 0x04;        // 判断是否为2位停止位  
  24.    
  25.    if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
  26.    bak |= set.parity<<4;                      // 设置奇偶校验
  27.       
  28.    U0LCR = bak;
  29. /*********************************************************************/
  30.    
  31.         U0FCR = 0x81;                        // 使能FIFO,并设置触发点为8字节
  32.         U0IER = 0x01;                        // 允许RBR中断,即接收中断
  33.        
  34.         /* 设置中断允许 */
  35.            VICIntSelect = 0x00000000;            // 设置所有通道为IRQ中断
  36.            VICVectCntl0 = 0x26;                 // UART0中断通道分配到IRQ slot 0,即优先级最高
  37.            VICVectAddr0 = (int)IRQ_UART0;       // 设置UART0向量地址
  38.            VICIntEnable = 0x00000040;            // 使能UART0中断
  39. }

中断函数

  1. void  IRQ_UART0(void)  __irq
  2. {  
  3.         uint8  i;
  4.    
  5.    switch(U0IIR&0x0F)
  6.    {
  7.                    case 0x04:
  8.                    {
  9.                         for(i=0;i<8;i++)
  10.                            {
  11.                                    insertQue(&buffer,U0RBR);
  12.                            }
  13.                    }
  14.                    break;
  15.                    case 0x0c:
  16.                    {
  17.                            while((U0LSR&0x01) == 1)
  18.                            {
  19.                                    insertQue(&buffer,U0RBR);
  20.                            }
  21.                    }
  22.                    break;
  23.                    default:
  24.                    break;
  25.    }
  26.    VICVectAddr = 0x00;                      // 中断处理结束
  27. }

这些代码在ADS下都是正常的,指点一下了,在线等。。。。。。
点赞  2010-5-6 17:28
引用: 引用 3 楼 peasant_lee 的回复:

是不是你仿真状态下的波特率设置不对啊?
先在ADS下运行代码,然后再在keil下运行串口就正常的了,那是keil状态下,开始通讯失败,可以找找开头的代码看看,呵呵。


开始通讯失败,什么意思?????你认为主要是哪儿的问题。。。。。
点赞  2010-5-6 17:30
仿真器的设置上面,有相关的设置,这个设置对了么?比如监控之类的,在仿真选项里面有设置的。。我现在没有仿真器,进不了仿真状态,所以不敢肯定,,,
点赞  2010-5-6 18:00
“如何在keil下接收串口的数据,用中断方式,我老是进不了中断”

进不了中断,两种大的可能性,一就是串口的硬件上,不通,二就是你的串口初始化和中断初始化不成功。

既然用ADS,你的开发板可以与PC通讯成功,那么硬件肯定是OK的,就剩第二种情况了。请问你的主控是arm7么?还是cortex-m3?出问题的是用MDK的编译环境是吧?
点赞  2010-5-6 18:04
引用: 引用 7 楼 peasant_lee 的回复:

“如何在keil下接收串口的数据,用中断方式,我老是进不了中断”

进不了中断,两种大的可能性,一就是串口的硬件上,不通,二就是你的串口初始化和中断初始化不成功。

既然用ADS,你的开发板可以与PC通讯成功,那么硬件肯定是OK的,就剩第二种情况了。请问你的主控是arm7么?还是cortex-m3?出问题的是用MDK的编译环境是吧?

就是ARM7的,lpc2210的,就是编译环境换了就出问题了
点赞  2010-5-6 18:26
换了编译环境,是不是启动代码,中断入口之类的设置要相应的改动一下呢?比如cortex-m3下的 *.S 文件。

假如还是不行,建议一步一步的跟踪调试,,,

不过,楼主,你真的肯定,除了编译环境不一样,其他代码都一样么?问题有点奇怪,所以,多嘴确认一下,呵呵
点赞  2010-5-6 18:49
路过帮顶
点赞  2010-5-6 19:07
引用: 引用 9 楼 peasant_lee 的回复:

换了编译环境,是不是启动代码,中断入口之类的设置要相应的改动一下呢?比如cortex-m3下的 *.S 文件。

假如还是不行,建议一步一步的跟踪调试,,,

不过,楼主,你真的肯定,除了编译环境不一样,其他代码都一样么?问题有点奇怪,所以,多嘴确认一下,呵呵

刚发现问题所在了,主要的就是寄存器CPSR值中的使能IRQ中断位的值为1,如果为0的话,那么中断就可以被执行了,现在主要的就是不知道在哪儿设置CPSR的值来使能IRQ中断,这点还没找到解决的办法,估计是要在Startup.s文件中来改,Peasant_Lee 给点建议啊
点赞  2010-5-6 19:18

  1. ; Setup Stack for each mode
  2.                 LDR     R0, =Stack_Top
  3. ;  Enter Undefined Instruction Mode and set its Stack Pointer
  4.                 MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
  5.                 MOV     SP, R0
  6.                 SUB     R0, R0, #UND_Stack_Size
  7. ;  Enter Abort Mode and set its Stack Pointer
  8.                 MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
  9.                 MOV     SP, R0
  10.                 SUB     R0, R0, #ABT_Stack_Size
  11. ;  Enter FIQ Mode and set its Stack Pointer
  12.                 MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
  13.                 MOV     SP, R0
  14.                 SUB     R0, R0, #FIQ_Stack_Size
  15. ;  Enter IRQ Mode and set its Stack Pointer
  16.                 MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
  17.                 MOV     SP, R0
  18.                 SUB     R0, R0, #IRQ_Stack_Size
  19. ;  Enter Supervisor Mode and set its Stack Pointer
  20.                 MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
  21.                 MOV     SP, R0
  22.                 SUB     R0, R0, #SVC_Stack_Size
  23. ;  Enter User Mode and set its Stack Pointer
  24.                 MSR     CPSR_c, #0x5f;#Mode_USR   
  25.                 IF      :DEF:__MICROLIB
  26.                 EXPORT __initial_sp
  27.                 ELSE
  28.                 MOV     SP, R0
  29.                 SUB     SL, SP, #USR_Stack_Size
  30.                 ENDIF

在Startup.s只有这段代码涉及CPSR,该怎么来改这个寄存器CPSR
点赞  2010-5-6 19:31
我公司这里没有ARM7的开发平台,只有cortex-m3,刚看了看没有找到startup.S,也没有CPSR。毕竟不是同架构的东西,呵呵。。。。

不过楼主已经找到问题所在,那恭喜啦,剩下问题就显得轻松了,你可以换个方法解决它,不一定在.S文件做手脚。你可以在初始化的时候,直接编程CPSR寄存器。 找到改寄存器的地址。定义一下。
类似:#define SPI_SR                  (*(volatile unsigned int *)(XXXXXXXXXXX))
XXXXXXXXXX是地址,那么你就可以直接控制SPI_SR 了。
点赞  2010-5-7 10:40
好,搞定了,Peasant_Lee谢谢了。。。。。
点赞  2010-5-8 09:20
不客气,相互讨论,呵呵。
点赞  2010-5-8 19:10
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复