是位操作还是字节操作?

2019-03-23 20:28发布

在看STM8L的库函数时有个地方不太理解,想请教一下。
void TIM4_ClearITPendingBit(TIM4_IT_TypeDef TIM4_IT)
{
    assert_param(IS_TIM4_IT(TIM4_IT));
    TIM4->SR1 = (uint8_t)(~(uint8_t)TIM4_IT);
}
typedef enum
{
    TIM4_IT_Update = ((uint8_t)0x01), /*!< Update Interrupt*/
    TIM4_IT_Trigger = ((uint8_t)0x40) /*!< Trigger  Interrupt*/
}TIM4_IT_TypeDef;

问题:
1.TIM4->SR1 = (uint8_t)(~(uint8_t)TIM4_IT);此句进行的是位操作吗?怎么理解?
2.TIM4_IT_Update= ((uint8_t)0x01), 此句是位定义吗?
3.按照我的理解清除标志位应该是TIM4->SR1 ^= (uint8_t)TIM4_IT;请问这样写有什么问题吗?
Thank you very much!
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
shsgjf
2019-03-24 05:18
终于搞明白了,自己解答一下。
这段程序的作用是清除TIM4->SR1 中的标志位。程序中(uint8_t)(~(uint8_t)TIM4_IT)实际数值为0xfe,这样也就是 TIM4->SR1=0xfe。但是由于此寄存器的标志位写1是无效的,只有写0是有效的。所以只是对BIT0标志位清零。它的功能和TIM4->SR1 ^= (uint8_t)TIM4_IT 是一样的。

一周热门 更多>