定时器中断标志位理解

1、定时器中断标志位程序

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)
{
ITStatus bitstatus = RESET;
uint16_t itstatus = 0x0, itenable = 0x0;
/* Check the parameters */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_TIM_GET_IT(TIM_IT));

itstatus = TIMx->SR & TIM_IT;

itenable = TIMx->DIER & TIM_IT;
if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
return bitstatus;
}
该程序主要设置DMA/中断使能寄存器(TIMx_DIER)、状态寄存器(TIMx_SR)两个寄存器,第一个入口参数为结构体指针定时器几TIM1\TIM2…,第二个入口参数为需要开启的中断类型TIM_IT_Update、TIM_IT_CC1、TIM_IT_CC2、TIM_IT_CC3、TIM_IT_CC4、TIM_IT_Trigger、TIM_IT_Break。

2、以定时器2的更新中断为例。

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);允许开启TIM_2的更新中断
(TIMx_DIER)的第0位: UIE:允许更新中断 (Update interrupt enable)
0:禁止更新中断;
1:允许更新中断。

3、中断事件(即中断发生的条件)

1、定时器溢出:TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
2、TIM_Cmd(TIM2,ENABLE ); //使能定时器2

4、定时器中断标志位

1、当定时器设置值arr溢出:TIM_TimeBaseStructure.TIM_Period = arr; 计数器自动重装值
2、 UIF: 更新中断标记 (Update interrupt flag)
当产生更新事件时该位由硬件置’1’。它由软件清’0’。
0:无更新事件产生;
1:更新中断等待响应。当寄存器被更新时该位由硬件置’1’:
− 若TIMx_CR1寄存器的UDIS=0、 URS=0,当TIMx_EGR寄存器的UG=1时产生更新事件
(软件对计数器CNT重新初始化);
− 若TIMx_CR1寄存器的UDIS=0、 URS=0,当计数器CNT被触发事件重初始化时产生更新
事件。 (参考同步控制寄存器的说明)
3、 当上述条件满足时:TIMx_SR的最低位 :UIF由硬件置1,程序(itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET)为真,此时bitstatus = SET;为1函数返回为1.

5、清零中断标志位

1、TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位
目的: 软件清零中断标志位为下次中断做准备或为其他类型中断做准备。
注意: 有的是自动清除,有的必须手动清除。比如串口,接收到数据,你读取数据硬件就自动清除掉了中断标志,你就可以不清除而只是读,但是有的定时器中断就得自己软件清除,要不执行完终端服务后,cpu检测到中断标志,又会马上进中断,这样就会跟你的设计相悖。所以为了统一还有就是确保清除标志,最好所有的中断都手动清除标志。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值