用过keil的高手请进,关于初始化UART0,在线等。。。
keil下初始化串口老是不成功,串口输出的都是乱码,但是在ADS下初始化都是正常的,是不是在ADS和keil下初始化有什么区别,高手指点一下。。。
使用软件仿真的吗?keil就是容易出问题,就是总输出乱码。
先用这个试一下
TI = 1;
printf("OK!!!\n");
while(1);
引用: 引用 1 楼 wo_happy 的回复:
使用软件仿真的吗?keil就是容易出问题,就是总输出乱码。
先用这个试一下
TI = 1;
printf("OK!!!\n");
while(1);
我使用硬件仿真的,串口发数据
有点奇怪的是,我先在ADS下运行代码,然后再在keil下运行串口就正常的了
是不是你仿真状态下的波特率设置不对啊?
先在ADS下运行代码,然后再在keil下运行串口就正常的了,那是keil状态下,开始通讯失败,可以找找开头的代码看看,呵呵。
引用: 引用 3 楼 peasant_lee 的回复:
是不是你仿真状态下的波特率设置不对啊?
先在ADS下运行代码,然后再在keil下运行串口就正常的了,那是keil状态下,开始通讯失败,可以找找开头的代码看看,呵呵。
如何在keil下接收串口的数据,用中断方式,我老是进不了中断
串口初始化代码如下
- /* 初始化UART0 */
- void init_uart(void)
- {
- UARTMODE set;
- uint32 bak;
-
- uint32 baud = 9600;
-
- PINSEL0 = 0x00000005; // 设置I/O连接到UART0
-
- set.datab = 8; // 8位数据位
- set.stopb = 1; // 1位停止位
- set.parity = 0; // 无奇偶校验
- /*********************************************************************/
- /* 设置串口波特率 */
- U0LCR = 0x80; // DLAB位置1
- bak = (Fpclk>>4)/baud;
- U0DLM = bak>>8;
- U0DLL = bak&0xff;
-
- /* 设置串口模式 */
- bak = set.datab-5; // 设置字长度
- if(2==set.stopb) bak |= 0x04; // 判断是否为2位停止位
-
- if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
- bak |= set.parity<<4; // 设置奇偶校验
-
- U0LCR = bak;
- /*********************************************************************/
-
- U0FCR = 0x81; // 使能FIFO,并设置触发点为8字节
- U0IER = 0x01; // 允许RBR中断,即接收中断
-
- /* 设置中断允许 */
- VICIntSelect = 0x00000000; // 设置所有通道为IRQ中断
- VICVectCntl0 = 0x26; // UART0中断通道分配到IRQ slot 0,即优先级最高
- VICVectAddr0 = (int)IRQ_UART0; // 设置UART0向量地址
- VICIntEnable = 0x00000040; // 使能UART0中断
- }
中断函数
- void IRQ_UART0(void) __irq
- {
- uint8 i;
-
- switch(U0IIR&0x0F)
- {
- case 0x04:
- {
- for(i=0;i<8;i++)
- {
- insertQue(&buffer,U0RBR);
- }
- }
- break;
- case 0x0c:
- {
- while((U0LSR&0x01) == 1)
- {
- insertQue(&buffer,U0RBR);
- }
- }
- break;
- default:
- break;
- }
- VICVectAddr = 0x00; // 中断处理结束
- }
这些代码在ADS下都是正常的,指点一下了,在线等。。。。。。
引用: 引用 3 楼 peasant_lee 的回复:
是不是你仿真状态下的波特率设置不对啊?
先在ADS下运行代码,然后再在keil下运行串口就正常的了,那是keil状态下,开始通讯失败,可以找找开头的代码看看,呵呵。
开始通讯失败,什么意思?????你认为主要是哪儿的问题。。。。。
仿真器的设置上面,有相关的设置,这个设置对了么?比如监控之类的,在仿真选项里面有设置的。。我现在没有仿真器,进不了仿真状态,所以不敢肯定,,,
“如何在keil下接收串口的数据,用中断方式,我老是进不了中断”
进不了中断,两种大的可能性,一就是串口的硬件上,不通,二就是你的串口初始化和中断初始化不成功。
既然用ADS,你的开发板可以与PC通讯成功,那么硬件肯定是OK的,就剩第二种情况了。请问你的主控是arm7么?还是cortex-m3?出问题的是用MDK的编译环境是吧?
引用: 引用 7 楼 peasant_lee 的回复:
“如何在keil下接收串口的数据,用中断方式,我老是进不了中断”
进不了中断,两种大的可能性,一就是串口的硬件上,不通,二就是你的串口初始化和中断初始化不成功。
既然用ADS,你的开发板可以与PC通讯成功,那么硬件肯定是OK的,就剩第二种情况了。请问你的主控是arm7么?还是cortex-m3?出问题的是用MDK的编译环境是吧?
就是ARM7的,lpc2210的,就是编译环境换了就出问题了
换了编译环境,是不是启动代码,中断入口之类的设置要相应的改动一下呢?比如cortex-m3下的 *.S 文件。
假如还是不行,建议一步一步的跟踪调试,,,
不过,楼主,你真的肯定,除了编译环境不一样,其他代码都一样么?问题有点奇怪,所以,多嘴确认一下,呵呵
引用: 引用 9 楼 peasant_lee 的回复:
换了编译环境,是不是启动代码,中断入口之类的设置要相应的改动一下呢?比如cortex-m3下的 *.S 文件。
假如还是不行,建议一步一步的跟踪调试,,,
不过,楼主,你真的肯定,除了编译环境不一样,其他代码都一样么?问题有点奇怪,所以,多嘴确认一下,呵呵
刚发现问题所在了,主要的就是寄存器CPSR值中的使能IRQ中断位的值为1,如果为0的话,那么中断就可以被执行了,现在主要的就是不知道在哪儿设置CPSR的值来使能IRQ中断,这点还没找到解决的办法,估计是要在Startup.s文件中来改,
Peasant_Lee 给点建议啊
- ; Setup Stack for each mode
- LDR R0, =Stack_Top
- ; Enter Undefined Instruction Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #UND_Stack_Size
- ; Enter Abort Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #ABT_Stack_Size
- ; Enter FIQ Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #FIQ_Stack_Size
- ; Enter IRQ Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #IRQ_Stack_Size
- ; Enter Supervisor Mode and set its Stack Pointer
- MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
- MOV SP, R0
- SUB R0, R0, #SVC_Stack_Size
- ; Enter User Mode and set its Stack Pointer
- MSR CPSR_c, #0x5f;#Mode_USR
- IF :DEF:__MICROLIB
- EXPORT __initial_sp
- ELSE
- MOV SP, R0
- SUB SL, SP, #USR_Stack_Size
- ENDIF
在Startup.s只有这段代码涉及CPSR,该怎么来改这个寄存器CPSR
我公司这里没有ARM7的开发平台,只有cortex-m3,刚看了看没有找到startup.S,也没有CPSR。毕竟不是同架构的东西,呵呵。。。。
不过楼主已经找到问题所在,那恭喜啦,剩下问题就显得轻松了,你可以换个方法解决它,不一定在.S文件做手脚。你可以在初始化的时候,直接编程CPSR寄存器。 找到改寄存器的地址。定义一下。
类似:#define SPI_SR (*(volatile unsigned int *)(XXXXXXXXXXX))
XXXXXXXXXX是地址,那么你就可以直接控制SPI_SR 了。
好,搞定了,Peasant_Lee谢谢了。。。。。