概述
在研究stm32定时器时发现,当进入定时器的中断时,定时器计数器以及中断接收时正常运行的,并没有因为进入中断而停止
具体看以下分析:
定时器初始化代码:
//TIM捕获通道开启宏定义,1:开启 0:关闭
#define TIM_ICCH1 1
#define TIM_ICCH2 1
#define TIM_ICCH3 1
#define TIM_ICCH4 1
//最小捕获频率:72000000/(120*60000)=10Hz
#define TIM_ICARR 60000 //重装载寄存器填充值
#define TIM_ICPSC 720 //分频系数
#define TIM_ICFIT 0x00 //定时器捕获滤波系数
#define TIM_OverF (10-1) //最大ARR溢出次数
#define TIM_ICSR (u16 *)&TIM3->SR //选择定时器的SR寄存器地址
#define TIM_ICCCR (u16 *)&TIM3->CCR1 //选择定时器的CCR寄存器地址
void TIM3_PWMICInit(void)
{
u8 i=0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_ICInitTypeDef TIM_ICInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
/***********************NVIC配置*****************************/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
/**********************TIM3 GPIO配置*****************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
/**********************初始化TIM3*******************************/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Period = TIM_ICARR-1;
TIM_TimeBaseInitStruct.TIM_Prescaler = TIM_ICPSC-1;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
/**********************初始化TIM3 IC*******************************/
TIM_ICInitStruct.TIM_ICFilter = TIM_ICFIT;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI ;
if(TIM_ICCH1==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
if(TIM_ICCH2==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
if(TIM_ICCH3==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_3;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
if(TIM_ICCH4==1)
{
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO_InitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_4;
TIM_ICInit(TIM3, &TIM_ICInitStruct);
}
TIM_ITConfig(TIM3, TIM_IcChannel,ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM_Ic.Ccr1=0;
}
中断代码:
void TIM3_IRQHandler(void)
{
u8 j = 0;
u16 i = 0, *pTimFre, *pTimCcrT, *pTimOver, *pTimSR, *pTimCCR;
TIM_Ic.Ccr1++;
TIM3->SR = 0;
if(TIM_Ic.Ccr1>100)
{
while( (TIM3->SR&0x001f) != 0x001f){}
LCD_ClearPart(Clear_ALL,RED);
while(1);
}
else return;
...........(省略)
}
仿真图中,CC1F中断状态位是为0的,其他为1,。这是引文CH1的PWM被断开了,而其他的则是连接。具体看图中黄色与红色
的线:
然后,连接CH1与PWM,再次仿真运行,结果如下图:
可见CC1F标志位已经被置1了,说明在中断函数中,定时器时正常运行的,并没有因为进入中断而停止。
最后
以上就是忧虑战斗机为你收集整理的STM32定时器----TIMx->SR寄存器的全部内容,希望文章能够帮你解决STM32定时器----TIMx->SR寄存器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复