C语言位操作实际应用

前言

  • 在程序编写中,往往会用到位操作,例如将指定位清0或者置1,这个就用到C语言中最基础当然也是很重要的知识点-----位操作。
  • 在实际应用中,到底是如何使用位移简化逻辑代码和提高运行速度的呢,下面我们就看一个实例。

位操作实际应用

  • 下图中是STM32 Systick控制及状态寄存器(CTRL)
    在这里插入图片描述
  • 因此,我们可以采用宏定义方式,配置对应位段的功能,如下
    代码:
typedef struct
{
 __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */
 __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
 __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */
 __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */
} SysTick_Type;

/* SysTick Control / Status Register Definitions */
#define SysTick_CTRL_COUNTFLAG_Pos         16          //(所在的位段)                   /*!< SysTick CTRL: COUNTFLAG Position */
#define SysTick_CTRL_COUNTFLAG_Msk         (1ul << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */

#define SysTick_CTRL_CLKSOURCE_Pos          2          //(所在的位段)                   /*!< SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */

#define SysTick_CTRL_TICKINT_Pos            1          //(所在的位段)                   /*!< SysTick CTRL: TICKINT Position */
#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */

#define SysTick_CTRL_ENABLE_Pos             0          //(所在的位段)                   /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */
  • 那么如何使用呢?程序中可以这样实现
 /* Choose Fclk、Enable SysTick IRQ and SysTick Timer 、Function successful */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;                
}
  • 这样增加即程序的可读性又便于代码维护。
发布了5 篇原创文章 · 获赞 7 · 访问量 378

猜你喜欢

转载自blog.csdn.net/weixin_40727233/article/details/104334431
今日推荐