DSP程序中断中使用XF管脚不再成为"误区"

[复制链接]
 楼主| hotpower 发表于 2008-12-20 22:41 | 显示全部楼层 |阅读模式
标签:&nbsp;无标签<H1>DSP程序中断中使用XF管脚不再成为&quot;误区&quot;</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管脚误区【原创】&nbsp;<br /><table class=ubb cellspacing=0><TR><td class=ubb>0推荐<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;学习DSP,当然是从一些简单的测试程序开始。使一个LED的闪亮是经常用的,但这其中有一个误区,现分析如下,以定时器控制LED灯为例:<br />void&nbsp;main()<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;init_5509();<br />&nbsp;&nbsp;&nbsp;&nbsp;init_timer();<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;NOP&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />interrupt&nbsp;void&nbsp;int_timer0()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag=&quot;Flag&quot;+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;&nbsp;(Flag&gt10)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;SSBX&nbsp;XF&quot;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;RSBX&nbsp;XF&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Flag&gt20)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag=&quot;0&quot;;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;这个程序不能实现控制的。使用XF的时候要注意一下,XF是ST1的一个bit,但是在中断中,首先把ST1压入堆栈,出中断前才弹出堆栈,所以在中断中改变XF没有实际的意义。所以在C/C++加如汇编要谨慎。修改后的程序如下:<br />void&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init_5509();<br />&nbsp;&nbsp;&nbsp;&nbsp;init_timer();<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;NOP&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Flag&gt10)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;SSBX&nbsp;XF&quot;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;RSBX&nbsp;XF&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />interrupt&nbsp;void&nbsp;int_timer0()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag=&quot;Flag&quot;+1;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Flag&gt20)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flag=&quot;0&quot;;<br />}<br />这个程序就好使。红尘出品,转载请注明出处。<br /></td></TR></table><br />随着菜农C5402CFG.H(完全版)及应用演示包的发布,DSP程序中断中使用XF管脚<br />成为了一件很轻松和爽快的一件小事,它源与对C5402cfg.h中SREGs.SP的升级.<br />原来TI_SREG结构中使用TI_REG&nbsp;&nbsp;&nbsp;SP;来定义SP为一普通变量,现改为:<br />TI_REG_SP&nbsp;&nbsp;&nbsp;SP;//堆栈指针(0x18)<br />typedef&nbsp;volatile&nbsp;union<br />{<br />&nbsp;TI_REG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Regs;//SP寄存器值<br />&nbsp;TI_PREG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ptr;//SP堆栈指针<br />}TI_REG_SP,&nbsp;*TI_REG_PSP;<br />由于DSP在中断程序中保护了ST1,故SREGs.ST1.Bits.XF无法修改(中断退出后恢复原值)<br />在C中断程序中,堆栈保护了ST1,一般在SP(1)的位置,故只需对SP(1)操作即可在中断<br />程序退出后修改ST1的值,既修改引脚XF.<br />例:<br />void&nbsp;TimerObj::Timer0Init(void)<br />{<br />&nbsp;SREGs.TIMER0.TCR.Bits.TSS&nbsp;=&nbsp;1;//关闭定时器0<br />&nbsp;SREGs.TIMER0.TCR.Bits.TDDR&nbsp;=&nbsp;16&nbsp;-&nbsp;1;<br />&nbsp;SREGs.TIMER0.PRD&nbsp;=&nbsp;62500&nbsp;-&nbsp;1;//设置定时周期(PRD-&gtTIM)<br />&nbsp;SREGs.TIMER0.TIM&nbsp;=&nbsp;62500&nbsp;-&nbsp;1;//设置定时计数器<br />&nbsp;SREGs.TIMER0.TCR.Bits.TSS&nbsp;=&nbsp;0;//启动定时器0<br />&nbsp;SREGs.IMR.Bits.TINT0&nbsp;=&nbsp;1;//允许TINT0中断(62500*16=10mS)<br />}<br /><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;Count&nbsp;++;<br />&nbsp;if&nbsp;(Count&nbsp;&gt&nbsp;50)//16*62500*50=0.5S<br />&nbsp;{//Led工作灯半秒翻转1次<br />&nbsp;&nbsp;SREGs.SP.Ptr[1]&nbsp;^=&nbsp;(1&nbsp;&lt&lt&nbsp;ST1_XF);//修改SP(1)的内容<br />&nbsp;&nbsp;Count&nbsp;=&nbsp;0;<br />&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;SREGs.IFR.Bits.TINT0&nbsp;=&nbsp;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>
zyok 发表于 2008-12-21 00:05 | 显示全部楼层

沙发,DSP程序中断中使用XF管脚不再成为"误区"

  
 楼主| hotpower 发表于 2011-5-13 01:23 | 显示全部楼层
这个是楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

508

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