新手关于LPC2131无法进入中断服务函数的问题,有完整程序请

[复制链接]
 楼主| newdsd 发表于 2007-5-4 11:16 | 显示全部楼层 |阅读模式
<br />#include&nbsp;&ltLPC213x.h&gt<br />/*调用此函数库前要先设置好波特率和VPB频率*/<br />#define&nbsp;UARTBaudrate&nbsp;9600&nbsp;&nbsp;&nbsp;/*波特率*/<br />#define&nbsp;Fpclk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11059200/4&nbsp;&nbsp;&nbsp;/*VPB频率*/&nbsp;<br />/*ReceivedData为接收到的数据,RecNewData为接收数据标志位,RecNewData为&quot;1&quot;是表示有新数据<br />,为&quot;0&quot;时没有新数据*/<br />unsigned&nbsp;char&nbsp;ReceivedData&nbsp;=&nbsp;0,RecNewData&nbsp;=&nbsp;0;<br />/*IRQ中断开关,Flag&gt0时开中断,Flag=0时关中断*/<br />void&nbsp;EnableIRQ(unsigned&nbsp;char&nbsp;Flag)<br />{<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;temp&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;if(Flag)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;temp,&nbsp;SPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIC&nbsp;&nbsp;&nbsp;temp,&nbsp;temp,&nbsp;#0x80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;SPSR_c,&nbsp;temp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*MOVS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;LR&nbsp;*/<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;temp,&nbsp;SPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;temp,&nbsp;temp,&nbsp;#0x80<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;SPSR_c,&nbsp;temp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*MOVS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;LR&nbsp;*/<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />/*IRQ中断开关,Flag&gt0时开中断,Flag=0时关中断*/<br />void&nbsp;EnableFIQ(unsigned&nbsp;char&nbsp;Flag)<br />{<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;temp&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;if(Flag)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;temp,&nbsp;SPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BIC&nbsp;&nbsp;&nbsp;temp,&nbsp;temp,&nbsp;#0x40<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;SPSR_c,&nbsp;temp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*MOVS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;LR&nbsp;*/<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MRS&nbsp;&nbsp;&nbsp;temp,&nbsp;SPSR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;temp,&nbsp;temp,&nbsp;#0x40<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSR&nbsp;&nbsp;&nbsp;SPSR_c,&nbsp;temp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*MOVS&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;LR&nbsp;*/<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />}<br />/*<br />*********************************************************************************************************<br />**&nbsp;函数名称&nbsp;:UART0_Init()<br />**&nbsp;功能&nbsp;:串口初始化,8位数据,1位停止位,无奇偶校验,<br />*********************************************************************************************************<br />*/<br />void&nbsp;UART0_Init&nbsp;(void)<br />{<br />&nbsp;unsigned&nbsp;short&nbsp;Fdiv;<br />&nbsp;/*UART线控制寄存器,设置数据长度,停止位,奇偶校验,除数锁存访问位等<br />&nbsp;此处设置为:8位数据,1位停止位,无奇偶校验,允许设置波特率*/<br />&nbsp;U0LCR&nbsp;=&nbsp;0x83;<br />&nbsp;/*Fpclk为VPB时钟频率(外围器件时钟频率),为处理器时钟频率的1/4,1/2或全速,<br />&nbsp;由寄存器VPBDIV决定,默认为1/4;Fdiv为UART除数锁存值*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;Fdiv&nbsp;&nbsp;=&nbsp;(Fpclk&nbsp;/&nbsp;16)&nbsp;/&nbsp;UARTBaudrate;<br />&nbsp;/*设置波特率*/&nbsp;<br />&nbsp;U0DLM&nbsp;=&nbsp;Fdiv&nbsp;/&nbsp;256;<br />&nbsp;U0DLL&nbsp;=&nbsp;Fdiv&nbsp;%&nbsp;256;<br />&nbsp;/*8位数据,1位停止位,无奇偶校验,不允许设置波特率*/<br />&nbsp;U0LCR&nbsp;=&nbsp;0x03;<br />&nbsp;/*将IO口连接到UART0*/<br />&nbsp;PINSEL0&nbsp;|=&nbsp;0x00000005;<br />}<br />/*<br />*********************************************************************************************************<br />**&nbsp;函数名称&nbsp;:UART0_SendByte()<br />**&nbsp;功能&nbsp;:以查询方式从串口发送一字节出去,并等待,发送结束后退出<br /><br />*********************************************************************************************************<br />*/<br />void&nbsp;UART0_SendByte&nbsp;(unsigned&nbsp;char&nbsp;dat)<br />{<br />&nbsp;U0THR&nbsp;=&nbsp;dat;<br />&nbsp;/*U0LSR,UART线状态寄存器,等待,当发送完一个字节后结束等待*/<br />&nbsp;while&nbsp;((U0LSR&nbsp;&&nbsp;0x40)&nbsp;==&nbsp;0);&nbsp;&nbsp;<br />}<br />/*<br />*********************************************************************************************************<br />**&nbsp;函数名称&nbsp;:IRQ_UART0()<br />**&nbsp;功能&nbsp;:UART0接收、发送中断函数<br />*********************************************************************************************************<br />*/<br />void&nbsp;IRQ_UART0&nbsp;(void)&nbsp;__irq&nbsp;<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte&nbsp;(0x11);<br />&nbsp;/*发送完一字节,再发送0xF1*/<br />&nbsp;if&nbsp;(U0IIR&nbsp;&&nbsp;0x02)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte&nbsp;(0xF1)&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;}&nbsp;<br />&nbsp;/*接收到一字节*/<br />&nbsp;if&nbsp;(U0IIR&nbsp;&&nbsp;0x04)<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;ReceivedData&nbsp;=&nbsp;U0RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;RecNewData&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;/*结束中断,重新设置向量值*/<br />&nbsp;VICVectAddr&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;<br />}<br />&nbsp;<br /><br />main&nbsp;(void)<br />{<br />&nbsp;<br />&nbsp;UART0_Init();<br />&nbsp;&nbsp;&nbsp;&nbsp;/*使能FIFO,中断触发点为一个字节*/<br />&nbsp;U0FCR&nbsp;=&nbsp;0x01;<br />&nbsp;/*允许接收和发送中断*/<br />&nbsp;U0IER&nbsp;=&nbsp;0x03;&nbsp;<br />&nbsp;/*使能中断*/&nbsp;&nbsp;&nbsp;<br />&nbsp;EnableIRQ(1);<br />&nbsp;/*设置所有中断分配为IRQ中断*/<br />&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;/*将UART0中断分配到0通道(向量IRQ中的最高优先级)*/<br />&nbsp;VICVectCntl0&nbsp;=&nbsp;0x20&nbsp;|&nbsp;0x06;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;/*设置中断服务程序地址*/<br />&nbsp;VICVectAddr0&nbsp;=&nbsp;(unsigned&nbsp;int)IRQ_UART0;&nbsp;<br />&nbsp;/*&nbsp;使能UART0中断*/<br />&nbsp;VICIntEnable&nbsp;=&nbsp;1&nbsp;&lt&lt&nbsp;0x06;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;UART0_SendByte&nbsp;(0xAB);<br />&nbsp;while&nbsp;(1)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;if&nbsp;(RecNewData)<br />&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte&nbsp;(0xAC);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RecNewData&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UART0_SendByte&nbsp;(ReceivedData);<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />用查询方式可以正常运用UART0,用中断模式后进入不了ISR,向各位请教。编译环境为keil&nbsp;MDKARM&nbsp;3.04
王紫豪 发表于 2007-5-4 11:20 | 显示全部楼层

沙个发,那么长,懒得看,不好意思

  
 楼主| newdsd 发表于 2007-5-4 15:41 | 显示全部楼层

没人啦?还没放完假哦

没人啦?还没放完假哦
sasinop 发表于 2007-5-4 15:59 | 显示全部楼层

到我的板上找个代码看看

在ADS环境下的<br />UART&nbsp;<br />USB&nbsp;都调试通过了<br /><br />完整的工程文件,<br />LPC2146
ayb_ice 发表于 2007-5-4 16:18 | 显示全部楼层

这都是简单的问题...

这都是简单的问题,程序太长而且还有汇编,懒得看,不好意思...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部