单片机型号 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 分
#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++;
}
一周热门 更多>