标签: 无标签<H1>DSP程序中断中使用XF管脚不再成为"误区"</H1><br /><H1>DSP写XF口问题</H1><br /><br />虽说XF是输出IO,但它同时是ST1中的1位.<br />但在中断服务程序中C语言都会保护ST1,退出中断将恢复ST1.<br />故最好不要在中断中改变XF的控制状态.<br />当然,也可在退出中断返回修正后的ST1,但操作较为复杂.<a href="http://blog.21ic.com/user1/1369/archives/2008/47857.html" target=_blank>http://blog.21ic.com/user1/1369/archives/2008/47857.html</a>DSP程序中断中使用XF管脚误区【原创】 <br /><table class=ubb cellspacing=0><TR><td class=ubb>0推荐<br /> 学习DSP,当然是从一些简单的测试程序开始。使一个LED的闪亮是经常用的,但这其中有一个误区,现分析如下,以定时器控制LED灯为例:<br />void main()<br /> {<br /> init_5509();<br /> init_timer();<br /> while(1) <br /> {<br /> asm(" NOP");<br /> }<br /> }<br />interrupt void int_timer0()<br />{<br /> Flag="Flag"+1;<br /> if (Flag>10) <br /> asm(" SSBX XF"); <br /> else <br /> asm(" RSBX XF");<br /> if (Flag>20) <br /> Flag="0";<br />}<br /> 这个程序不能实现控制的。使用XF的时候要注意一下,XF是ST1的一个bit,但是在中断中,首先把ST1压入堆栈,出中断前才弹出堆栈,所以在中断中改变XF没有实际的意义。所以在C/C++加如汇编要谨慎。修改后的程序如下:<br />void main()<br />{<br /> init_5509();<br /> init_timer();<br /> while(1) <br /> {<br /> asm(" NOP");<br /> if (Flag>10) <br /> asm(" SSBX XF"); <br /> else<br /> asm(" RSBX XF");<br /> }<br />}<br />interrupt void int_timer0()<br />{<br /> Flag="Flag"+1; <br /> if (Flag>20) <br /> Flag="0";<br />}<br />这个程序就好使。红尘出品,转载请注明出处。<br /></td></TR></table><br />随着菜农C5402CFG.H(完全版)及应用演示包的发布,DSP程序中断中使用XF管脚<br />成为了一件很轻松和爽快的一件小事,它源与对C5402cfg.h中SREGs.SP的升级.<br />原来TI_SREG结构中使用TI_REG SP;来定义SP为一普通变量,现改为:<br />TI_REG_SP SP;//堆栈指针(0x18)<br />typedef volatile union<br />{<br /> TI_REG Regs;//SP寄存器值<br /> TI_PREG Ptr;//SP堆栈指针<br />}TI_REG_SP, *TI_REG_PSP;<br />由于DSP在中断程序中保护了ST1,故SREGs.ST1.Bits.XF无法修改(中断退出后恢复原值)<br />在C中断程序中,堆栈保护了ST1,一般在SP(1)的位置,故只需对SP(1)操作即可在中断<br />程序退出后修改ST1的值,既修改引脚XF.<br />例:<br />void TimerObj::Timer0Init(void)<br />{<br /> SREGs.TIMER0.TCR.Bits.TSS = 1;//关闭定时器0<br /> SREGs.TIMER0.TCR.Bits.TDDR = 16 - 1;<br /> SREGs.TIMER0.PRD = 62500 - 1;//设置定时周期(PRD->TIM)<br /> SREGs.TIMER0.TIM = 62500 - 1;//设置定时计数器<br /> SREGs.TIMER0.TCR.Bits.TSS = 0;//启动定时器0<br /> SREGs.IMR.Bits.TINT0 = 1;//允许TINT0中断(62500*16=10mS)<br />}<br /><br />extern "C" interrupt void Timer0Isr(void) <br />{//每10mS中断1次<br />static unsigned int Count = 0;<br /> Count ++;<br /> if (Count > 50)//16*62500*50=0.5S<br /> {//Led工作灯半秒翻转1次<br /> SREGs.SP.Ptr[1] ^= (1 << ST1_XF);//修改SP(1)的内容<br /> Count = 0;<br /> }<br /> SREGs.IFR.Bits.TINT0 = 1;//清除定时器0中断标志<br />}<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/200812/200812219476776.rar'>https://bbs.21ic.com/upfiles/img/200812/200812219476776.rar</a> |
|