本帖最后由 luoxin88 于 2023-3-25 12:36 编辑
刚刚在读TIM_GetITStatus函数的代码的时候发现一个奇怪的现象 - 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;
- }
复制代码
看这行代码itstatus = TIMx->SR & TIM_IT;,发现我们要获取的状态位是由我们传入的第二个参数与定时器的状态寄存器按位与获得的,当我们再查看第二个参数的定义,如下: - #define TIM_IT_Update ((uint16_t)0x0001)
- #define TIM_IT_CC1 ((uint16_t)0x0002)
- #define TIM_IT_CC2 ((uint16_t)0x0004)
- #define TIM_IT_CC3 ((uint16_t)0x0008)
- #define TIM_IT_CC4 ((uint16_t)0x0010)
- #define TIM_IT_COM ((uint16_t)0x0020)
- #define TIM_IT_Trigger ((uint16_t)0x0040)
- #define TIM_IT_Break ((uint16_t)0x0080)
- #define IS_TIM_IT(IT) ((((IT) & (uint16_t)0xFF00) == 0x0000) && ((IT) != 0x0000))
-
- #define IS_TIM_GET_IT(IT) (((IT) == TIM_IT_Update) || \
- ((IT) == TIM_IT_CC1) || \
- ((IT) == TIM_IT_CC2) || \
- ((IT) == TIM_IT_CC3) || \
- ((IT) == TIM_IT_CC4) || \
- ((IT) == TIM_IT_COM) || \
- ((IT) == TIM_IT_Trigger) || \
- ((IT) == TIM_IT_Break))
-
复制代码
发现一共有8个中断,并且是对应低8位,可是当我们查看定时器的SR寄存器: 发现根本就对应不上,请问这是什么情况呢?
Updata中断和CC1 ~ CC4中断分别对应0 ~ 4位没错,可是其他的中断都无法对应上寄存器的位置啊,例如TIM_IT_COM是获取SR寄存器的第五位,可是第五位是保留的啊,这样中断的获取不就是错的吗
|