在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 6937|回复: 0

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

[复制链接]
发表于 2008-12-21 10:59:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 cjsb37 于 2013-4-29 08:58 编辑

DSP程序中断中使用XF管脚不再成为"误区"
本帖最后由 HotPower 于 2008-12-21 09:48 编辑

hotpower 发表于 2008-12-20 22:41 DSP 技术 ←返回版面   

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


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

DSP写XF口问题



虽说XF是输出IO,但它同时是ST1中的1位.
但在中断服务程序中C语言都会保护ST1,退出中断将恢复ST1.
故最好不要在中断中改变XF的控制状态.
当然,也可在退出中断返回修正后的ST1,但操作较为复杂.


程序中断中使用XF管脚误区【原创】

        学习DSP,当然是从一些简单的测试程序开始。使一个LED的闪亮是经常用的,但这其中有一个误区,现分析如下,以定时器控制LED灯为例:
void main()
   {
    init_5509();
    init_timer();
    while(1)
         {
         asm(" NOP");
         }
   }
interrupt void int_timer0()
{
         Flag="Flag"+1;
         if   (Flag>10)
              asm(" SSBX XF");
         else
              asm(" RSBX XF");
         if (Flag>20)
               Flag="0";
}
    这个程序不能实现控制的。使用XF的时候要注意一下,XF是ST1的一个bit,但是在中断中,首先把ST1压入堆栈,出中断前才弹出堆栈,所以在中断中改变XF没有实际的意义。所以在C/C++加如汇编要谨慎。修改后的程序如下:
void main()
{
    init_5509();
    init_timer();
    while(1)
    {
           asm(" NOP");
           if (Flag>10)
              asm(" SSBX XF");
          else
             asm(" RSBX XF");
    }
}
interrupt void int_timer0()
{
       Flag="Flag"+1;
       if (Flag>20)
       Flag="0";
}
这个程序就好使。红尘出品,转载请注明出处。


随着菜农C5402CFG.H(完全版)及应用演示包的发布,DSP程序中断中使用XF管脚
成为了一件很轻松和爽快的一件小事,它源与对C5402cfg.h中SREGs.SP的升级.
原来TI_SREG结构中使用TI_REG   SP;来定义SP为一普通变量,现改为:
TI_REG_SP   SP;//堆栈指针(0x18)
typedef volatile union
{
TI_REG       Regs;//SP寄存器值
TI_PREG     Ptr;//SP堆栈指针
}TI_REG_SP, *TI_REG_PSP;
由于DSP在中断程序中保护了ST1,故SREGs.ST1.Bits.XF无法修改(中断退出后恢复原值)
在C中断程序中,堆栈保护了ST1,一般在SP(1)的位置,故只需对SP(1)操作即可在中断
程序退出后修改ST1的值,既修改引脚XF.
例:
void TimerObj::Timer0Init(void)
{
SREGs.TIMER0.TCR.Bits.TSS = 1;//关闭定时器0
SREGs.TIMER0.TCR.Bits.TDDR = 16 - 1;
SREGs.TIMER0.PRD = 62500 - 1;//设置定时周期(PRD->TIM)
SREGs.TIMER0.TIM = 62500 - 1;//设置定时计数器
SREGs.TIMER0.TCR.Bits.TSS = 0;//启动定时器0
SREGs.IMR.Bits.TINT0 = 1;//允许TINT0中断(62500*16=10mS)
}

extern "C" interrupt void Timer0Isr(void)
{//每10mS中断1次
static unsigned int Count = 0;
Count ++;
if (Count > 50)//16*62500*50=0.5S
{//Led工作灯半秒翻转1次
  SREGs.SP.Ptr[1] ^= (1 << ST1_XF);//修改SP(1)的内容
  Count = 0;
}
    SREGs.IFR.Bits.TINT0 = 1;//清除定时器0中断标志
}


下载C5402CFG.H(完全增强版)及应用演示包



签名:

●█〓██▄▄▄▄▄▄ ●●●●●●→ ''''╭WWWW╮
▄▅██████▅▄▃▂ 传播非典灌水四方 ( ●_●)
███天█马█行█空████ '''',,,;,;,;'''/▇\''
◥⊙▲⊙▲⊙▲⊙▲⊙▲⊙▲◤ 群魔乱舞见阳光/MMMM\

工程师的收藏夹


--------------------------------------------------------------------------------
菜农的农家博客








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

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-14 15:43 , Processed in 0.025843 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表