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 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
FYJ2016
2019-07-16 07:59
你们用的什么语言写的程序,为什么和我的不一样的格式呢,我用的是C语言。


#include "allveriable.h"

unsigned int i=0;
void TIM1_Init(void)
{
        TIM1_CR1 = 0x00;    //向上的计数方向,中断计数不停
        TIM1_IER = 0x01;    //允许更新中断
        TIM1_PSCRH = 0x3e;  //进行16000分频   ??   //时钟为16M
        TIM1_PSCRL = 0x80;
                                                                                  /*分频器的值 为65535    我们取16000    16000000/16000=1000  CK=1000;
                                                                                          要求为1S产生一次中断, 值达到1000;
                                                                                        */
        //TIM1_PSCRH = 0x07;                                                                                //8000    值越大,速度越小。
//        TIM1_PSCRL = 0xd0;
        TIM1_ARRH = 0x03;    //??    1000的16进制 为03e8
        TIM1_ARRL = 0xe8;
        TIM1_CR1 |=0x01;    //使能计数器
}
unsigned int num,k=0;
unsigned int count[2]={0x05,0x06};
unsigned int NUM[2];
unsigned int Value=0;
/*
main()
{
        _asm("sim");
        CLK_Init();
        GPIO_Init();
        TIM1_Init();
        _asm("rim");
        while (1);
}
*/
@far @Interrupt void TIM1_OVER_Int(void)
{

       
          
        TIM1_SR1 = 0x00;   //中断标志位清零
        // Dis_595(i);
        i++;
               
               

}

一周热门 更多>