关于C语言中DSP5402中断向量表的配置问题

[复制链接]
3305|5
 楼主| hotpower 发表于 2008-12-21 10:23 | 显示全部楼层 |阅读模式
在MCU/ARM/DSP中,都有1个启动过程,这里主要设计复位及中断的入口问题。<br />所以它们基本都有启动文件的支持,使程序上电后自动进入正确的程序位置及地址。<br />复位及中断的入口具有多个间隔固定的程序空间,它们可以是单独的跳转地址<br />及函数指针,如ARM的中断向量表。也可是一块小的固定程序空间,如51的n*8+3和DSP5402的4字。<br />DSP5402和51略有不同,它在硬件复位时bootloader将中断向量表映射到ROM的0xFF80处。<br /><br />但我们实际运行时,中断入口是允许改变的,而且每个程序的中断地址和个数都是不同的。<br /><br />故需要动态地改变中断向量表。<br /><br />DSP5402在硬件复位时中断向量表存在SREGs.PMST.IPTR中,步进(大小)0x80.<br /><br />SREGs.PMST.IPTR初始化为0b11111111&nbsp;1,故中断向量表在0xff80处。<br />我喜欢将其动态映射到0x0080处,因为寄存器在0x00~0x5f,0x60~0x7f处。<br />这样连续,RAM程序可从0x100开始装载。<br /><br />所以我们要做至少2方面的工作:<br />1.修改SREGs.PMST.IPTR<br />//设置0x0080为中断向量表首址,在第2个128页内。<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.PMST.Regs&nbsp;=&nbsp;(0x01&nbsp;&lt&lt&nbsp;PMST_IPTR)&nbsp;|&nbsp;(1&nbsp;&lt&lt&nbsp;PMST_MP_MC)&nbsp;|&nbsp;(1&nbsp;&lt&lt&nbsp;PMST_OVLY);<br /><br />2.初始化中断向量表<br />在C语言的启动文件中,我们只需将中断向量表看成普通数组即可,因为CCS具有地址绝对定位功能。<br />这样我们就可以很方便地将中断向量表绝对定位到我们需要定位的位置。<br /><br />在CCS中想绝对定位,必须修改CMD文件。<br />例如:<br />MEMORY&nbsp;&nbsp;<br />{<br />/*(R读&nbsp;W写&nbsp;X运行&nbsp;I初始化)*/<br />&nbsp;&nbsp;&nbsp;&nbsp;PAGE&nbsp;0:&nbsp;/*&nbsp;Program&nbsp;Space&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MMRS&nbsp;&nbsp;&nbsp;&nbsp;(RWIX)&nbsp;:&nbsp;o=000000h&nbsp;l=000060h&nbsp;/*&nbsp;Memory-mapped&nbsp;registers&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCRATCH&nbsp;(RW&nbsp;&nbsp;)&nbsp;:&nbsp;o=000060h&nbsp;l=000020h&nbsp;/*&nbsp;scratch-pad&nbsp;DARAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VECT&nbsp;&nbsp;&nbsp;&nbsp;(RWIX)&nbsp;:&nbsp;o=000080h&nbsp;l=000080h&nbsp;/*&nbsp;Interrupt&nbsp;Vector&nbsp;Table&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPROG&nbsp;&nbsp;&nbsp;(RW&nbsp;&nbsp;)&nbsp;:&nbsp;o=000100h&nbsp;l=001f00h&nbsp;/*&nbsp;On-Chip&nbsp;DARAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;PAGE&nbsp;1:&nbsp;/*&nbsp;Data&nbsp;Space&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;declaration&nbsp;for&nbsp;DARAM&nbsp;already&nbsp;made&nbsp;in&nbsp;PAGE&nbsp;0&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;/*支持对SREGs在watch窗口中有效查看*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMMRS&nbsp;&nbsp;&nbsp;(RWIX)&nbsp;:&nbsp;o=000000h&nbsp;l=000060h&nbsp;/*&nbsp;Memory-mapped&nbsp;registers&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISCRATCH(RW&nbsp;&nbsp;)&nbsp;:&nbsp;o=000060h&nbsp;l=000020h&nbsp;/*&nbsp;scratch-pad&nbsp;DARAM&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;&nbsp;IVECT&nbsp;&nbsp;&nbsp;(RWIX)&nbsp;:&nbsp;o=000080h&nbsp;l=000080h&nbsp;/*&nbsp;Interrupt&nbsp;Vector&nbsp;Table&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDATA&nbsp;&nbsp;&nbsp;(RW&nbsp;&nbsp;)&nbsp;:&nbsp;o=002000h&nbsp;l=002000h&nbsp;/*&nbsp;On-Chip&nbsp;DARAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EDATA&nbsp;&nbsp;&nbsp;(RW&nbsp;&nbsp;)&nbsp;:&nbsp;o=008000h&nbsp;l=008000h<br />}<br /><br />SECTIONS<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;/*支持对中断向量表的正确定位及改写*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.vectors&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IVECT&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/*&nbsp;interrupt&nbsp;vector&nbsp;table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*支持对SREGs在watch窗口中有效查看*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.registers&nbsp;&nbsp;:&nbsp;&gt&nbsp;IMMRS&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&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;.text&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IPROG&nbsp;&nbsp;&nbsp;PAGE&nbsp;0&nbsp;/*&nbsp;User&nbsp;code&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;.cinit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IPROG&nbsp;&nbsp;&nbsp;PAGE&nbsp;0&nbsp;/*&nbsp;initialization&nbsp;tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.pinit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IPROG&nbsp;&nbsp;&nbsp;PAGE&nbsp;0&nbsp;/*&nbsp;initialization&nbsp;functions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.switch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IPROG&nbsp;&nbsp;&nbsp;PAGE&nbsp;0&nbsp;/*&nbsp;for&nbsp;C-switch&nbsp;tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Normally,&nbsp;data&nbsp;would&nbsp;go&nbsp;to&nbsp;DMEM0,&nbsp;but&nbsp;OVLY=1&nbsp;so&nbsp;put&nbsp;data&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;PMEM0&nbsp;to&nbsp;keep&nbsp;loader&nbsp;from&nbsp;overwriting&nbsp;program&nbsp;with&nbsp;data.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.sysmem&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IDATA&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/*fill&nbsp;=&nbsp;0DEADh*/&nbsp;/*&nbsp;dynamic&nbsp;heap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.stack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IDATA&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/*fill&nbsp;=&nbsp;0BEEFh*/&nbsp;/*&nbsp;system&nbsp;stack&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.const&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IDATA&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/*&nbsp;C&nbsp;constant&nbsp;tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.cio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IDATA&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/*&nbsp;C-IO&nbsp;Buffer&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;.bss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IDATA&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/*&nbsp;global&nbsp;&&nbsp;static&nbsp;vars&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;.data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;IDATA&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/*&nbsp;asm&nbsp;data&nbsp;area&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;.flash&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;&gt&nbsp;EDATA&nbsp;&nbsp;&nbsp;PAGE&nbsp;1&nbsp;/**/<br />}<br /><br />这里将VECT移入了PAGE&nbsp;1,为不破坏以前的“规矩”,特将VECT重起名IVECT.<br />实际VECT以无用。<br /><br />接下来就是对中断向量进行初始化。<br />#pragma&nbsp;DATA_SECTION(&quot;vectors&quot;)//将中断向量绝对定位到0x80处&nbsp;<br />uVectorEntry&nbsp;g_pfnVectors[]&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Reset(),&nbsp;&nbsp;&nbsp;//reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0080&nbsp;#0//软硬件复位nISR_REST<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//nmi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0084&nbsp;#1//非屏蔽中断nISR_NMI<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0088&nbsp;#2//软件中断17&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x008c&nbsp;#3//软件中断18<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0090&nbsp;#4//软件中断19<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0094&nbsp;#5//软件中断20<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x0098&nbsp;#6//软件中断21<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x009c&nbsp;#7//软件中断22<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00a0&nbsp;#8//软件中断23<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00a4&nbsp;#9//软件中断24<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00a8&nbsp;#10//软件中断25<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00ac&nbsp;#11//软件中断26<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00b0&nbsp;#12//软件中断27<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00b4&nbsp;#13//软件中断28<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00b8&nbsp;#14//软件中断29<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//sint30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00bc&nbsp;#15//软件中断30<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR(Eint0Isr),&nbsp;//int0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00c0&nbsp;#16//外部中断0<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR(Eint1Isr),&nbsp;//int1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00c4&nbsp;#17//外部中断1<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR(Eint2Isr),&nbsp;//int2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00c8&nbsp;#18//外部中断2<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR(Timer0Isr),//tint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00cc&nbsp;#19//定时器中断0<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR(McBSPIsr),&nbsp;//rint0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00d0&nbsp;#20//McBSP0接收中断<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//xint0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00d4&nbsp;#21//McBSP0发送中断<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//rint1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00d8&nbsp;#22//McBSP1接收中断<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR(Timer1Isr),//xint1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00dc&nbsp;#23//定时器中断1<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR(Eint3Isr),&nbsp;//int3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00e0&nbsp;#24//外部中断3<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//hpint&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00e4&nbsp;#25//HPI中断<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00e8&nbsp;#26//软件中断10<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00ec&nbsp;#27//软件中断11<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00f0&nbsp;#28//软件中断12<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00f4&nbsp;#29//软件中断13<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00f8&nbsp;#30//保留0<br />&nbsp;&nbsp;&nbsp;&nbsp;ISR_Default(),&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00fc&nbsp;#31//保留1<br />};<br /><br />其中宏实际是“嵌入汇编”:<br />#define&nbsp;ISR_Reset()&nbsp;{DSPCODE_BD,&nbsp;(pfnVectorEntry)c_int00,&nbsp;DSPCODE_SP_200L,&nbsp;DSPCODE_SP_200H}<br />#define&nbsp;ISR_Return()&nbsp;{DSPCODE_RETE,&nbsp;(pfnVectorEntry)DSPCODE_NOP,&nbsp;DSPCODE_NOP,&nbsp;DSPCODE_NOP}<br />#define&nbsp;ISR_Default()&nbsp;{DSPCODE_BD,&nbsp;(pfnVectorEntry)DefaultIsr,&nbsp;DSPCODE_NOP,&nbsp;DSPCODE_NOP}<br />#define&nbsp;ISR(addr)&nbsp;{DSPCODE_BD,&nbsp;(pfnVectorEntry)addr,&nbsp;DSPCODE_NOP,&nbsp;DSPCODE_NOP}<br />//注意:宏ISR_Load()调用前应该关闭中断,装载后再开放中断<br />#define&nbsp;ISR_Load(nISR,&nbsp;addr)&nbsp;{g_pfnVectors[nISR].Isr&nbsp;=&nbsp;(pfnVectorEntry)addr;}<br />//注意:宏ISR_UnLoad()调用前应该关闭中断,卸载后再开放中断<br />#define&nbsp;ISR_UnLoad(nISR)&nbsp;{g_pfnVectors[nISR].Isr&nbsp;=&nbsp;(pfnVectorEntry)DefaultIsr;}<br /><br />这里的汇编代码用枚举来替代:<br />enum&nbsp;DspCodeEnum_Enum<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DSPCODE_BD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(TI_IREG)0xf273u,//等效BD&nbsp;address指令<br />&nbsp;&nbsp;&nbsp;&nbsp;DSPCODE_B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(TI_IREG)0xf073u,,//等效B&nbsp;address指令<br />&nbsp;&nbsp;&nbsp;&nbsp;DSPCODE_RETE&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(TI_IREG)0xf4fbu,,//等效rete指令<br />&nbsp;&nbsp;&nbsp;&nbsp;DSPCODE_NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(TI_IREG)0xf495u,//等效nop指令<br />&nbsp;&nbsp;&nbsp;&nbsp;DSPCODE_SP_200L&nbsp;=&nbsp;(TI_IREG)0x7718u,//STM&nbsp;#200,SP<br />&nbsp;&nbsp;&nbsp;&nbsp;DSPCODE_SP_200H&nbsp;=&nbsp;(TI_IREG)0x00c8u//STM&nbsp;#200,SP<br />};<br /><br />例如ISR(Timer0Isr),它表示在19#中断向量nISR_TINT0的位置0xcc处为Timer0Isr的入口。<br /><br />为了编写Timer0Isr,我们还要进行2方面的工作:<br />1.初始化定时器,设置100MHz时10mS中断的时间常数<br />void&nbsp;TimerObj::Timer0Init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.TIMER0.TCR.Bits.TSS&nbsp;=&nbsp;1;//关闭定时器0<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.TIMER0.TCR.Bits.TDDR&nbsp;=&nbsp;16&nbsp;-&nbsp;1;//16分频<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.TIMER0.PRD&nbsp;=&nbsp;62500&nbsp;-&nbsp;1;//设置定时周期(PRD-&gtTIM)<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.TIMER0.TIM&nbsp;=&nbsp;62500&nbsp;-&nbsp;1;//设置定时计数器<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.TIMER0.TCR.Bits.TSS&nbsp;=&nbsp;0;//启动定时器0<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.IMR.Bits.TINT0&nbsp;=&nbsp;1;//允许TINT0中断(62500*16=10mS)<br />}<br /><br />2.编制定时器中断服务程序<br />extern&nbsp;&quot;C&quot;&nbsp;interrupt&nbsp;void&nbsp;Timer0Isr(void)&nbsp;<br />{//每10mS中断1次<br />static&nbsp;unsigned&nbsp;int&nbsp;Count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Count&nbsp;++;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Count&nbsp;&gt&nbsp;50)//16*62500*50=0.5S<br />&nbsp;&nbsp;&nbsp;&nbsp;{//Led工作灯XF半秒翻转1次,注意XF的变化不是改写ST1而是改写SP(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SREGs.SP.Ptr[1]&nbsp;^=&nbsp;(1&nbsp;&lt&lt&nbsp;ST1_XF);//改写SP(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.IFR.Bits.TINT0&nbsp;=&nbsp;1;//清除定时器0中断标志<br />}<br /><br />到此,完整的关于C语言中DSP5402中断向量表的配置问题及实现过程叙述完毕<br /><br />菜农HotPower@126.com<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/200812/200812219476776.rar'>https://bbs.21ic.com/upfiles/img/200812/200812219476776.rar</a>
phoenixmy 发表于 2008-12-21 10:40 | 显示全部楼层

又升级了?

<br /><br />最近看了看三星的单片机<br />不好玩~~~~~~~~~~
 楼主| hotpower 发表于 2008-12-21 10:44 | 显示全部楼层

哈哈~~~马上就要升级为“无敌版”了~~~

北京人做的如何???不会忘了我们村里人了吧~~~<br /><br />最近军检很忙~~~
phoenixmy 发表于 2008-12-21 10:47 | 显示全部楼层

还凑合~~~~~~~~

<br />最近也挺忙乎<br />不过都是琐事<br /><br />基本不动硬件了<br />整天和协议打交道<br />用的MCU还是8位的<br />而且编译环境还很难用
computer00 发表于 2008-12-21 12:56 | 显示全部楼层

俺搞一个51芯片的IAP程序时没办法也只好搞了一个中断向量表

  
accupower 发表于 2008-12-21 13:26 | 显示全部楼层

mark

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21617

帖子

508

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