奇怪

[复制链接]
1600|1
 楼主| 又一歪歪 发表于 2008-10-30 22:43 | 显示全部楼层 |阅读模式
se, ST, start, vi, ic
高手帮我看看程序错在哪里,为什么第一次数据能发送出去,第二次就发不出去了<br />void&nbsp;__irq&nbsp;InterUart0()<br />{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if((U0IIR&0x02)!=0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(in_send)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;outbuff[send_num++];;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(send_num&gt=send_total)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in_send&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rec_flag&nbsp;=&nbsp;1;&nbsp;&nbsp;//接受标志置一<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inbuff[in_num++]&nbsp;=&nbsp;U0RBR;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(in_num&gt=MAX_IN)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in_num&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr&nbsp;=&nbsp;0;&nbsp;<br />}<br /><br />void&nbsp;SendStart()&nbsp;//启动发送<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;U0THR&nbsp;=&nbsp;outbuff[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;//while(&nbsp;(U0LSR&0x40)==0);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;send_num&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;send_total&nbsp;=&nbsp;send_ptr-outbuff;//计算发送数据总数<br />&nbsp;&nbsp;&nbsp;&nbsp;in_send&nbsp;=&nbsp;1;<br />}<br /><br />void&nbsp;SendToBuffStart()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(in_send==1);&nbsp;//&nbsp;等待串口发送完<br />&nbsp;&nbsp;&nbsp;&nbsp;send_ptr&nbsp;=&nbsp;outbuff;//&nbsp;发送指针复位<br />}<br />&nbsp;<br />void&nbsp;InitUart0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;fdiv;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;0x00;&nbsp;&nbsp;//设置所有中断为IRQ方式<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;1&lt&lt6;&nbsp;&nbsp;//使能串口中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr1&nbsp;&nbsp;=&nbsp;&nbsp;(uint32)InterUart0;&nbsp;//设置串口中断地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl1&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;0x26;&nbsp;&nbsp;//分配到IRQ1<br />&nbsp;&nbsp;&nbsp;&nbsp;////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0X83;&nbsp;&nbsp;&nbsp;//允许访问除数寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;fdiv&nbsp;=&nbsp;(Fpclk/16)/9600;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLM&nbsp;=&nbsp;fdiv&gt&gt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLL&nbsp;=&nbsp;fdiv&0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0FCR&nbsp;=&nbsp;0x01;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR&nbsp;=&nbsp;0x03;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0IER&nbsp;=&nbsp;0x03;&nbsp;&nbsp;&nbsp;&nbsp;//必须在DLAB==0时,访问<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;|=&nbsp;0x05;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable();&nbsp;//IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitUart0();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendToBuffStart();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendStart();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送第一次数据<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendToBuffStart();&nbsp;//程序停在这了,奇快,发送完数据就应该清<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//掉in_send了啊<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*send_ptr++&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendStart();&nbsp;&nbsp;&nbsp;//发送第二次数据<br />}<br />
 楼主| 又一歪歪 发表于 2008-10-31 00:14 | 显示全部楼层

问题终于解决了

问题已解决。<br />在中断中会改变的全局变量前要加VOLATILE&nbsp;关键字,以防止编译器优化。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

61

帖子

0

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