打印
[STM8]

STM8S005 同时开两个定时器,参数干扰,怎么回事

[复制链接]
2045|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
771543348|  楼主 | 2016-6-13 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我同时开了TIM2和TIM3,TIM2定1ms,TIM3定0.1ms
static void Tim3_Init(void)
{
        asm("sim");                        //禁止中断
       
        //禁止中断
        TIM3_ITConfig(TIM3_IT_UPDATE, DISABLE);
       
        //分频(2^3分频) 16M / 8 = 2Mhz-->0.5us,允许产生更新标志
        TIM3_PrescalerConfig(TIM3_PRESCALER_8, TIM3_PSCRELOADMODE_IMMEDIATE);

        //400U --> 400U * 0.5us = 0.2ms //0.2ms 复位一次
        TIM3_SetAutoreload(200);
       
        //初值 0       
        TIM3_SetCounter(0U);
       
        //开定时器
        TIM3_ARRPreloadConfig(ENABLE);
        TIM3_Cmd(ENABLE);
       
        //允许中断
        TIM3_ITConfig(TIM3_IT_UPDATE, ENABLE);
        //使能中断
        asm("rim");       
}

static void Tim2_Init(void)
{
        asm("sim");                        //禁止中断
       
        //禁止中断
        TIM2_ITConfig(TIM2_IT_UPDATE, DISABLE);
       
        //分频(2^3分频) 16M / 8 = 2Mhz-->0.5us,允许产生更新标志
        TIM2_PrescalerConfig(TIM2_PRESCALER_8, TIM2_PSCRELOADMODE_IMMEDIATE);

        //2000 * 0.5us = 1ms //1ms 复位一次
        TIM2_SetAutoreload(2000U);
       
        //初值 0       
        TIM2_SetCounter(0U);
       
        //开定时器
        TIM2_ARRPreloadConfig(ENABLE);
        TIM2_Cmd(ENABLE);
       
        //允许中断
        TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
        //使能中断
        asm("rim");       
}

void Tim_Init(void)
{
        Tim3_Init();
        Tim2_Init();
}

void Task_TimeRun(void)
{
        Task_4msCounterA++;
        Task_4msCounterB++;
        Task_8msCounter++;
        Task_16msCounter++;        /*1ms时基*/

//        Led_MainFunction();
}

void Task_AD_Run(void)
{
        if(u == 0)
        {
                GPIO_WriteHigh(GPIOA, GPIO_PIN_2);
                u = 1;
        }
        else
        {
                GPIO_WriteLow(GPIOA, GPIO_PIN_2);
                u= 0;
        }
        if(0U == ADSample_GetFlag())
        {
                ADSample_MainFunction();
        }
}


INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
        Task_AD_Run();
        TIM3_ClearFlag(TIM3_FLAG_UPDATE);
}


INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
        Task_TimeRun();
        TIM2_ClearFlag(TIM2_FLAG_UPDATE);
}


TIM3的中断应该0.1ms进入一次,但是通过io电平翻转,发现有跳动,TIM2不进行初始化,就不会跳动,怎么回事?
沙发
771543348|  楼主 | 2016-6-13 15:32 | 只看该作者
是不是定时器的设置哪里有问题?

使用特权

评论回复
板凳
xmshao| | 2016-6-13 16:05 | 只看该作者
问题可能出在中断优先级。 还有不要在中断里面做太多事情。

使用特权

评论回复
地板
Bjorn| | 2016-6-13 20:55 | 只看该作者
是不是哪个参数在定时器2里边被改了

使用特权

评论回复
5
victor1934| | 2016-6-13 21:19 | 只看该作者
0.1ms的时间内,你的中断处理函数能处理完么,AD操作100us,是不是有点短?

使用特权

评论回复
6
mmuuss586| | 2016-6-14 08:55 | 只看该作者
中断程序太复杂了,改成寄存器操作,还有中断程序关总中断干么啊;

使用特权

评论回复
7
2545958269| | 2016-6-14 14:12 | 只看该作者
你AD是死等的吧,还是用标志位在中断里面开启吧,   话说STM8有个可以用定时器触发AD的

使用特权

评论回复
8
Thethree| | 2016-6-14 15:17 | 只看该作者
这两个定时器是不是用了中断呢,两个中断是不是冲突?

使用特权

评论回复
9
行云_流水| | 2016-7-1 15:42 | 只看该作者
软件处理问题

使用特权

评论回复
10
dentsgot| | 2016-7-3 21:23 | 只看该作者
这两个定时器应该不会冲突吧

使用特权

评论回复
11
行云_流水| | 2016-7-4 16:09 | 只看该作者
第一听说  “参数干扰”这种说法。

根本就是软件处理问题

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝