打印
[STM8]

STM8S,TIM4+外部中断测频问题

[复制链接]
1402|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Q85038427|  楼主 | 2015-8-7 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU:STM8S105
初始化:
1:I/O设置外部上下沿中断
测试:外部接 1K方波,在中断里反转IO,示波器观察正常。
2:定时器 设置 128分频,计数到250  ,2MS溢出
测试:定时器服务程序中将IO反转,测试波形正常。
测频流程:
1:在定时器服务程序中记溢出次数ISRCounter,在外部中断程序中计算时间us,

计算方法为:
T = ISRCounter*250*8+ 当前计数器Counter*8-开始计数时的Counter*8;

2:
外部IO接1K的方波;
if(T> 800)
{
        IO翻转;
}

问题来了:示波器看波形:100MS 里面会出现 1~2个翻转的波形;
源代码如下:
uint32_t LastPulseUS = 0;
uint32_t LastTim4Cnt = 0;

void SysExtiPortA_ISR(void)
{

  uint32_t CurPulseUS = 0;
  uint32_t CurTim4Cnt = 0;
  uint8_t HallStep = 0;

  CurTim4Cnt = TIM4_GetCounter();

  CurPulseUS = g_Time4_HALL.Tim4_ISRCounter * 250 *8 + CurTim4Cnt*8 -LastTim4Cnt*8  ;
  
  dispCurPulseUS = CurPulseUS;
  g_Time4_HALL.Tim4_ISRCounter = 0;
  LastTim4Cnt = CurTim4Cnt;
  LastPulseUS =  CurPulseUS;
// if((CurPulseUS >(LastPulseUS<<1))||(CurPulseUS >(LastPulseUS>>1)))
// if(CurPulseUS > 1000000)    //大于1000ms认为停转,重新启动
// {
  //  LastPulseUS = 0;
  //}
  
  if((CurPulseUS >(450))&&(CurPulseUS <(550)))
  {
    //bsp_LedToggle();    /* 翻转LED灯IO */
  }
  if(LastPulseUS > 800)
  {
     bsp_LedToggle();    /* 翻转LED灯IO */
  }


沙发
Q85038427|  楼主 | 2015-8-7 11:23 | 只看该作者
走过路过的都来看看,谢谢

使用特权

评论回复
板凳
mmuuss586| | 2015-8-7 13:23 | 只看该作者

谢谢分享;

使用特权

评论回复
地板
Q85038427|  楼主 | 2015-8-7 14:02 | 只看该作者

有问题啊,就是偶尔会测得时间不准,现在怀疑中断问题,在看datasheet,还没找出问题呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

27

帖子

0

粉丝