用bios实现硬件中断功能时要注意什么?弄了一个月都没弄出

[复制链接]
3049|3
 楼主| ccjchen 发表于 2009-6-23 13:32 | 显示全部楼层 |阅读模式
我用普通的中断方式实现uart串口通信可以,&nbsp;<br />但用bios&nbsp;方式中断却没有中断产生不知为什么,下面这个程序有错吗?<br />恳请各位高手给指点一下!<br />我买的开发板,在上面做DM642做UART串口通信实验。它是由一个外围芯片TL16C752B提供两个中断请求信号INTA、INTB分别用于通道A和B申请TMS320DM642的中断。在DM642中,INTA和ITB相与,复用DM642的INT5.<br /><br />#include&nbsp;&ltcsl.h&gt<br />#include&nbsp;&ltcsl_emifa.h&gt<br />#include&nbsp;&ltcsl_irq.h&gt<br />#include&nbsp;&ltcsl_chip.h&gt<br />#include&nbsp;&quot;stdio.h&quot;<br /><br />#include&nbsp;&quot;seeddm642.h&quot;<br />#include&nbsp;&quot;seeddm642_uart.h&quot;<br /><br />/*SEEDDM642的emifa的设置结构*/<br />EMIFA_Config&nbsp;Seeddm642ConfigA&nbsp;={<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00052078,/*gblctl&nbsp;EMIFA(B)global&nbsp;control&nbsp;register&nbsp;value&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*将CLK6、4、1使能;将MRMODE置1;使能EK2EN,EK2RATE*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xffffffd3,/*cectl0&nbsp;CE0&nbsp;space&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*将CE0空间设为SDRAM*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x73a28e01,/*cectl1&nbsp;CE1&nbsp;space&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*Read&nbsp;hold:&nbsp;1&nbsp;clock;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MTYPE&nbsp;:&nbsp;0000,选择8位的异步接口<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Read&nbsp;strobe&nbsp;:001110;14个clock宽度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TA:2&nbsp;clock;&nbsp;Read&nbsp;setup&nbsp;2&nbsp;clock;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Write&nbsp;hold&nbsp;:2&nbsp;clock;&nbsp;Write&nbsp;strobe:&nbsp;14&nbsp;clock<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Write&nbsp;setup&nbsp;:7&nbsp;clock<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;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/1c<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;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x22a28a22,&nbsp;/*cectl2&nbsp;CE2&nbsp;space&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x22a28a42,&nbsp;/*cectl3&nbsp;CE3&nbsp;space&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x57115000,&nbsp;/*sdctl&nbsp;SDRAM&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0000081b,&nbsp;/*sdtim&nbsp;SDRAM&nbsp;timing&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x001faf4d,&nbsp;/*sdext&nbsp;SDRAM&nbsp;extension&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000002,&nbsp;/*cesec0&nbsp;CE0&nbsp;space&nbsp;secondary&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000002,&nbsp;/*cesec1&nbsp;CE1&nbsp;space&nbsp;secondary&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000002,&nbsp;/*cesec2&nbsp;CE2&nbsp;space&nbsp;secondary&nbsp;control&nbsp;register&nbsp;value*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000073&nbsp;/*cesec3&nbsp;CE3&nbsp;space&nbsp;secondary&nbsp;control&nbsp;register&nbsp;value*/&nbsp;&nbsp;&nbsp;&nbsp;<br />};<br /><br />SEEDDM642_UART_Config&nbsp;UartConfig&nbsp;={<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x01,/*寄存器IER*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x57,/*寄存器FCR*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x03,/*寄存器LCR*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x08,/*寄存器MCR*/<br />};<br /><br />extern&nbsp;far&nbsp;void&nbsp;vectors();<br /><br />Uint8&nbsp;IOreadback;<br />Uint16&nbsp;buffer;<br />SEEDDM642_UART_Handle&nbsp;SEEDuartHandleA;<br />SEEDDM642_UART_Handle&nbsp;SEEDuartHandleB;<br /><br />/*此程序可将四个采集口的数据经过Video&nbsp;Port0送出*/<br />void&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />/*-------------------------------------------------------*/<br />/*&nbsp;perform&nbsp;all&nbsp;initializations&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;*/<br />/*-------------------------------------------------------*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*Initialise&nbsp;CSL,初始化CSL库*/<br />&nbsp;&nbsp;&nbsp;&nbsp;CSL_init();<br />/*----------------------------------------------------------*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*EMIFA的初始化,将CE0设为SDRAM空间,CE1设为异步空间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注,DM642支持的是EMIFA,而非EMIF*/<br />&nbsp;&nbsp;&nbsp;&nbsp;EMIFA_config(&Seeddm642ConfigA);<br />/*----------------------------------------------------------*/<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_globalDisable();<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_nmiEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_enable(IRQ_EVT_EXTINT5);<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQ_globalEnable();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*中断向量表的初始化*/<br />&nbsp;&nbsp;&nbsp;&nbsp;//Point&nbsp;to&nbsp;the&nbsp;IRQ&nbsp;vector&nbsp;table<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />/*测试串口A*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Open&nbsp;UART&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;SEEDuartHandleA&nbsp;=&nbsp;SEEDDM642_UART_open(SEEDDM642_UARTA,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEEDDM642_UART_BAUD9600,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&UartConfig);<br />&nbsp;&nbsp;&nbsp;&nbsp;/*Open&nbsp;UARTB*/<br />&nbsp;&nbsp;&nbsp;&nbsp;SEEDuartHandleB&nbsp;=&nbsp;SEEDDM642_UART_open(SEEDDM642_UARTB,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEEDDM642_UART_BAUD9600,&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&UartConfig);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRQ_setVecs(vectors);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Uart&nbsp;Test&nbsp;Begin...
&quot;);<br /><br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;interrupt&nbsp;void&nbsp;uart_isr(void)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uint16&nbsp;Data_Temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data_Temp&nbsp;=&nbsp;SEEDDM642_UART_rget(SEEDuartHandleA,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;DATA&nbsp;:&nbsp;%x
&quot;,Data_Temp);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;<br />&nbsp;<br />
 楼主| ccjchen 发表于 2009-6-23 19:17 | 显示全部楼层

请各位前辈给指点一下!

这个程序有时候偶尔又能产生中断<br />不发生中断与发生中断的大约是比例是1:20<br />问题出在什么地方呢?
 楼主| ccjchen 发表于 2009-6-24 10:22 | 显示全部楼层

用过bios hwi方式中断编程的朋友给点经验

  
yidong1981 发表于 2009-6-24 15:02 | 显示全部楼层

应该不是很难吧

在main中初始化相关寄存器<br />在BIOS配置HWI时,要使能Use&nbsp;Dispatcher,把你的中断函数名放到对应的中断中就可以了<br /><br />起始更多的是初始化相关寄存器,和写中断函数;如果你能保证这些都没问题,那就应该能正常响应中断的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

175

主题

446

帖子

1

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