单片机型号 STM8S105C6t6 . 编译器 IAR
tiM4做 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 分
一周热门 更多>