|
各位高手给小弟看下easyarm2104 uart0中断接收程序为何不能进中断?<br />我用ISP下载到flash可以运行,但easyarm2104重新复位后就不能运行了,为何?请教!!<br />target.c<br />/**---------------------------------------------------------------------------------------<br />**文 件 名: target.c<br />**描 述: lpc210x(飞利浦的ARM)目标板特殊的代码,包括异常处理程序和目标板初始化程序<br />** 每个工程应当具有这个文件的拷贝,用户根据程序的需要修改本文件。<br />**注 意:本文件必须以ARM(32位代码)方式编译,否则,必须更改init.s和vector.s文件<br />** 别的C代码不必使用ARM(32位代码)方式编译<br />********************************************************************************************************/<br /><br />#define IN_TARGET<br />#include "config.h"<br /><br />/*********************************************************************************************************<br />** 函数名称: IRQ_Exception<br />** 功能描述: 中断异常处理程序,用户根据需要自己改变程序<br />**<br />** 输 入: 无<br />**<br />** 输 出: 无<br />** <br />** 全局变量: 无<br />** 调用模块: 无<br />********************************************************************************************************/<br />void __irq IRQ_Exception(void)<br />{<br /> // VICVectAddr = 0x00; // 这一句替换为自己的代码<br />}<br /><br />/*********************************************************************************************************<br />** 函数名称: FIQ_Exception<br />** 功能描述: 快速中断异常处理程序,用户根据需要自己改变程序<br />** <br />** 输 入: 无<br />**<br />** 输 出: 无<br />** <br />** 全局变量: 无<br />** 调用模块: 无<br />********************************************************************************************************/<br />void FIQ_Exception(void)<br />{<br /> while(1); // 这一句替换为自己的代码<br />}<br /><br />/*********************************************************************************************************<br />** 函数名称: TargetInit<br />** 功能描述: 目标板初始化代码,在需要的地方调用,根据需要改变<br />** 输 入: 无<br />**<br />** 输 出: 无<br />** <br />** 全局变量: 无<br />** 调用模块: 无<br />********************************************************************************************************/<br />void TargetInit(void)<br />{<br /> /* 添加自己的代码 */<br />}<br /><br />/*********************************************************************************************************<br />** 函数名称: TargetResetInit<br />** 功能描述: 调用main函数前目标板初始化代码,根据需要改变,不能删除<br />** 输 入: 无<br />**<br />** 输 出: 无<br />** <br />** 全局变量: 无<br />** 调用模块: 无<br />********************************************************************************************************/<br />void TargetResetInit(void)<br />{<br /><br /> /* 设置系统各部分时钟 */<br />/* PLLCON = 1;<br />#if ((Fcclk / 4) / Fpclk) == 1<br /> VPBDIV = 0;<br />#endif<br /><br />#if ((Fcclk / 4) / Fpclk) == 2<br /> VPBDIV = 2;<br />#endif<br /><br />#if ((Fcclk / 4) / Fpclk) == 4<br /> VPBDIV = 1;<br />#endif<br /><br />#if (Fcco / Fcclk) == 2<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);<br />#endif<br />#if (Fcco / Fcclk) == 4<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);<br />#endif<br />#if (Fcco / Fcclk) == 8<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);<br />#endif<br />#if (Fcco / Fcclk) == 16<br /> PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);<br />#endif<br /> PLLFEED = 0xaa;<br /> PLLFEED = 0x55;<br /> while((PLLSTAT & (1 << 10)) == 0);<br /> PLLCON = 3;<br /> PLLFEED = 0xaa;<br /> PLLFEED = 0x55;<br />*/ <br /> <br /> /* 设置存储器加速模块 */<br /> MAMCR = 2; //MAMCR 8u2 00-MAM 功能被禁止、01-MAM功能部分使能、10-MAM功能完全使能<br /> /* MAMTIM 8u3<br /> 000=0-保留<br /> 001=1-一段时间内只有 1 个处理器时钟(cclk)用于 MAM 取指。<br /> 010=2-一段时间内只有 2 个处理器时钟(cclk)用于 MAM 取指。<br /> 011=3-一段时间内只有 3 个处理器时钟(cclk)用于 MAM 取指。<br /> 100=4-一段时间内只有 4 个处理器时钟(cclk)用于 MAM 取指。<br /> 101=5-一段时间内只有 5 个处理器时钟(cclk)用于 MAM 取指。<br /> 110=6-一段时间内只有 6 个处理器时钟(cclk)用于 MAM 取指。<br /> 111=7-一段时间内只有 7 个处理器时钟(cclk)用于 MAM 取指。<br /> */<br />#if Fcclk < 20000000<br /> MAMTIM = 1;<br />#else<br />#if Fcclk < 40000000<br /> MAMTIM = 2;<br />#else<br /> MAMTIM = 3;<br />#endif<br />#endif<br /> <br /> /* 初始化VIC */<br /> VICIntEnClr = 0xffffffff; //关闭所有中断<br /> VICVectAddr = 0;//默认向量地址寄存器<br /> VICIntSelect = 0;//1:对应的中断请求分配为FIQ。0:对应的中断请求分配为IRQ。<br /><br /> /* 添加自己的代码 */<br /><br />}<br /><br />/*********************************************************************************************************<br />** End Of File<br />********************************************************************************************************/<br /><br />Init.s<br />;**--------------文件信息--------------------------------------------------------------------------------<br />;**文 件 名: Init.s<br />;**创 建 人: 陈明计<br />;**最后修改日期: 2003年7月1日<br />;**描 述: lpc210x初始化代码,每个工程应当有独立的初始化代码,一般不需要改动<br />;** 特殊情况应当在这个文件上修改而来 <br />;********************************************************************************************************/<br /><br />;引入的外部标号在这声明<br /> IMPORT __main ;C语言主程序入口 <br /> IMPORT InitStack ;初始化堆栈<br /> IMPORT TargetResetInit ;目标板基本初始化<br /> <br />;给外部使用的标号在这声明<br /> EXPORT Reset<br /> EXPORT __rt_div0<br /> EXPORT __user_initial_stackheap<br /><br />;段声明<br /> CODE32<br /> AREA Init,CODE,READONLY<br /> <br />;/*********************************************************************************************************<br />;** 函数名称: Reset<br />;** 功能描述: 复位入口<br />;** <br />;** 输 入: 无<br />;**<br />;** 输 出: 无<br />;** <br />;** 全局变量: 无<br />;** 调用模块: 无<br />;********************************************************************************************************/<br />Reset<br /> BL InitStack ;初始化堆栈<br /> BL TargetResetInit ;目标板基本初始化<br /> ;跳转到c语言入口<br /> B __main<br /><br /><br />;/*********************************************************************************************************<br />;** 函数名称: __user_initial_stackheap <br />;** 功能描述: 库函数初始化堆和栈,不能删除<br />;** <br />;** 输 入: 参考库函数手册<br />;**<br />;** 输 出: 参考库函数手册<br />;** <br />;** 全局变量: 无<br />;** 调用模块: 无<br />;********************************************************************************************************/<br />__user_initial_stackheap <br /> LDR r0,=bottom_of_heap<br /> MOV pc,lr<br /><br />;/*********************************************************************************************************<br />;** 函数名称: __rt_div0<br />;** 功能描述: 整数除法除数为0错误处理函数,替代原始的__rt_div0减少目标代码大小<br />;** <br />;** 输 入: 参考库函数手册<br />;**<br />;** 输 出: 无<br />;** <br />;** 全局变量: 无<br />;** 调用模块: 无<br />;********************************************************************************************************/<br />__rt_div0<br /><br /> B __rt_div0<br /><br />;/* 分配堆空间 */<br /> AREA Myheap, DATA, NOINIT, ALIGN=2<br />bottom_of_heap SPACE 256 ;库函数的堆空间<br /><br /> END<br />;/*********************************************************************************************************<br />;** End Of File<br />;********************************************************************************************************/<br /><br />vectors.s<br />;**--------------文件信息--------------------------------------------------------------------------------<br />;**文 件 名: vectors.s<br />;**描 述: lpc210x异常向量入口及异常向量与c语言代码的接口,包括初始化堆栈的代码<br />;********************************************************************************************************/<br /><br />;定义堆栈的大小<br />USR_STACK_LEGTH EQU 64<br />SVC_STACK_LEGTH EQU 0<br />FIQ_STACK_LEGTH EQU 16<br />IRQ_STACK_LEGTH EQU 64<br />ABT_STACK_LEGTH EQU 0<br />UND_STACK_LEGTH EQU 0<br /><br /><br />;引入的外部标号在这声明<br /> IMPORT FIQ_Exception ;快速中断异常处理程序<br />; // IMPORT IRQ_Exception<br /> IMPORT Reset<br /><br />;给外部使用的标号在这声明<br /> EXPORT InitStack<br /> EXPORT Vectors<br /><br /><br /> CODE32<br /><br /> AREA Startup,CODE,READONLY<br /><br />;中断向量表<br />Vectors<br /> LDR PC, ResetAddr<br /> LDR PC, UndefinedAddr<br /> LDR PC, SWI_Addr<br /> LDR PC, PrefetchAddr<br /> LDR PC, DataAbortAddr<br /> DCD 0xb9205f80<br /> LDR PC, [PC, #-0xff0]<br /> LDR PC, FIQ_Addr<br /><br />ResetAddr DCD Reset<br />UndefinedAddr DCD Undefined<br />SWI_Addr DCD SoftwareInterrupt<br />PrefetchAddr DCD PrefetchAbort<br />DataAbortAddr DCD DataAbort<br />Nouse DCD 0<br />IRQ_Addr DCD 0 ; //IRQ_Exception<br />FIQ_Addr DCD FIQ_Handler<br /><br />;未定义指令<br />Undefined<br /> B Undefined<br /><br />;软中断<br />SoftwareInterrupt<br /> B SoftwareInterrupt<br /><br />PrefetchAbort<br /> B PrefetchAbort<br /><br />;取数据中止<br />DataAbort<br /> B DataAbort<br /><br /><br />;快速中断<br />FIQ_Handler<br /> STMFD SP!, {R0-R3, LR}<br /> BL FIQ_Exception<br /> LDMFD SP!, {R0-R3, LR}<br /> SUBS PC, LR, #4<br /><br />;/*********************************************************************************************************<br />;** 函数名称: InitStack<br />;** 功能描述: 初始化堆栈<br />;** 输 入: 无<br />;** 输 出 : 无<br />;** 全局变量: 无<br />;** 调用模块: 无<br />;********************************************************************************************************/<br />InitStack <br /> MOV R0, LR ;保存程序返回值,bx指令会将pc复制给lr=r14,pc=r15<br /><br />;设置管理模式堆栈<br /> MSR CPSR_c, #0xd3 ;模式切换,管理模式<br /> LDR SP, StackSvc<br />;设置中断模式堆栈<br /> MSR CPSR_c, #0xd2 ;模式切换,中断模式<br /> LDR SP, StackIrq<br />;设置快速中断模式堆栈<br /> MSR CPSR_c, #0xd1 ;模式切换,快速中断模式<br /> LDR SP, StackFiq<br />;设置中止模式堆栈<br /> MSR CPSR_c, #0xd7 ;模式切换,异常中止模式<br /> LDR SP, StackAbt<br />;设置未定义模式堆栈<br /> MSR CPSR_c, #0xdb ;模式切换,未定义模式<br /> LDR SP, StackUnd<br />;设置系统模式堆栈<br /> MSR CPSR_c, #0x5f ;模式切换,系统模式<br /> LDR SP, StackUsr<br /><br /> MOV PC, R0 ;断点返回<br /><br />StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4<br />StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4<br />StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4<br />StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4<br />StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4<br />StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4<br /><br /><br />;/* 分配堆栈空间 */<br /> AREA MyStacks, DATA, NOINIT, ALIGN=2<br />UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用户(系统)模式堆栈空间<br />SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间<br />IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间<br />FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间<br />AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间<br />UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈<br /><br /> END<br />;/*********************************************************************************************************<br />;** End Of File<br />;********************************************************************************************************/<br /><br /><br /> uart0.h<br />#ifndef __UART0_H__<br />#define __UART0_H__<br /><br />extern void UartInit(void); // 串口初始化<br />extern void SendSerialchar(uchar ch); // 通过串口发数据 <br /><br /><br />#endif //__UART0_H__<br /><br /><br /><br />uart0.c<br /><br />#include "includes.h"<br /><br /><br />// 串口发送一个字符--查询方式<br />void SendSerialchar(uchar ch)<br />{ <br /> U0THR = ch;<br /> while((U0LSR & 0x40) == 0);<br />}<br /><br /><br />// 串口接收数据--中断方式<br />void __irq IRQ_UART0(void)<br />{<br /> uchar ucTemp,ucRcvData;<br /> <br /> ucTemp = U0IIR & 0x0F;<br /> switch(ucTemp)<br /> {<br /> case 0x04:<br /> ucRcvData = U0RBR; // 读取接收缓存器数据<br /> SendSerialchar(ucRcvData); // 将数据回传给PC<br /> VICVectAddr0 = 0x00; // 通过读取U0IIR来清除中断<br /> break;<br /> }<br />}<br /><br /><br />// 串口初始化<br />void UartInit(void)<br />{ <br /> U0LCR = 0x83; // 使能访问除数锁存<br /> U0DLM = 0x00; // 波特率设置9600,<br /> U0DLL = 0x12; <br /> U0LCR = 0x03; // 禁止访问除数锁存,8数据位1停止位无奇偶校验<br /> <br /> U0IER = 0x01; // 使能接收中断<br /> U0FCR = 0x01; // 使能FIFO,RX触发选择00,1字节 <br /> VICIntSelect = 0x00000000; //所有中断为IRQ中断 <br /> VICVectCntl0 = 0x26;<br /> VICVectAddr0 = (uint)IRQ_UART0; // 向量地址 <br /> VICIntEnable = 0x00000040; // 使能uart0向量<br />}<br /><br /><br />main.c<br />#include "includes.h"<br />extern UartInit(void); // 串口初始化<br />extern SendSerialchar(uchar ch); // 通过串口发数据<br /><br /><br />/****************************************************************************<br />* 名称:DelayNS()<br />* 功能:长软件延时<br />* 入口参数:dly 延时参数,值越大,延时越久<br />* 出口参数:无<br />****************************************************************************/<br />void DelayNS(uint32 dly)<br />{<br /> uint32 i;<br /><br /> for(; dly>0; dly--) <br /> for(i=0; i<50000; i++);<br />}<br /><br /><br />/****************************************************************************<br />* 名称:main()<br />* 功能:控制LED闪烁<br />****************************************************************************/<br />int main(void)<br />{<br /> PINSEL0 = 0x00000005; // 设置p0.13,p0.14引脚连接uart0<br /> PINSEL1 = 0x00000000;<br /> // uart0初始化<br /> VICIntEnClr = 0xffffffbf; // 打开中断uart0中断<br /><br /> UartInit();<br /> while(1)<br /> {<br /> <br /> }<br /> return 0;<br />}<br /><br />上面是关键的程序代码,感觉是 中断向量没设置好,麻烦哪位给看一下啊!!<br /><br /><br /><br /> |
|