STM8 用Tim4ms定时做1ms,TIM1做输入捕获,TIM4无法进入中断!

2019-07-15 20:48发布

单片机型号 STM8S105C6t6 . 编译器 IARtiM4做 1ms定时,

void Time4_Init(void)
{
        TIM4_DeInit();
        TIM4_TimeBaseInit(TIM4_PRESCALER_64, 250); // 16分频,
        TIM4_SetCounter(0);
        TIM4_ARRPreloadConfig(ENABLE);
        TIM4_PrescalerConfig(TIM4_PRESCALER_64, TIM4_PSCRELOADMODE_IMMEDIATE);
        TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);
        //TIM4_Cmd(ENABLE);       
       
}

void Delay_ms( volatile u16 nTime)
{
        TIM4_Cmd(ENABLE);// 使能Tim4 定时器
        TimingDelay = nTime;          
        while(TimingDelay!=0);
}

定时器TIM4中断里边递减TimingDelay 实现定时。

TIM1 的通道4 做输入捕获    要来做红外解码的。
void Tim1_InputCapture_Init(void)
{
        TIM1_DeInit();
        //初始化时钟16分频 向上计数,计数周期65535 计数初值0
        TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, U16_MAX, 0);
        TIM1_ICInit(TIM1_CHANNEL_4, TIM1_ICPOLARITY_FALLING, TIM1_ICSELECTION_DIRECTTI,
                TIM1_ICPSC_DIV1, 0x00);    // 通道4,下降沿捕获
        TIM1_ClearFlag(TIM1_FLAG_CC4);
        TIM1_CCxCmd(TIM1_CHANNEL_4, ENABLE); //使能通道4
        TIM1_ITConfig(TIM1_IT_UPDATE, DISABLE); //计数器更新溢出中断使能。
        TIM1_Cmd(ENABLE);
       
}

现在的问题是如果我没有调用TIM1的输入捕获 Delay_ms();放到哪里都可以定时,也可以正常进入Tim4中断,。
当我
        Tim1_InputCapture_Init();
       
        TIM1_SetCounter(0);
        while(!TIM1_GetFlagStatus(TIM1_FLAG_CC4));       

        Delay_ms(1000);    //只要 放到输入捕获标志位中断过以后就不能进入TIM4中断了,,
        TIM1_SetCounter(0);  // 我的TIM1的定时器溢出中断和输入捕获中断里边什么也没有放,仿真TIM4的寄存器到了这里的时候也没有发生改变
                                         //实在是弄不懂为什么会发生这样的事情,数据手册也看了好多遍没能查出问题之所在,,,大侠们帮帮忙啊。。。
        TIM1_ClearFlag(TIM1_FLAG_CC4);
            
        while(!TIM1_GetFlagStatus(TIM1_FLAG_CC4));       
        BootCodeTime  = TIM1_GetCapture4();       
        TIM1_ClearFlag(TIM1_FLAG_CC4);


上传一个完整的工程文件。

2-LED.rar 下载积分: 积分 -1 分
652.66 KB, 下载次数: 148, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。