硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6312|回复: 5
收起左侧

[HAL] 为了寄存器操作的标准化,HAL库搞几个统一的寄存器函数 SET_BIT,MODIFY_REG,WRITE_REG等

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2018-7-26 11:00:19 | 显示全部楼层 |阅读模式

在stm32h7xx.h文件里面定义:

  1. #define SET_BIT(REG, BIT)     ((REG) |= (BIT))

  2. #define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))

  3. #define READ_BIT(REG, BIT)    ((REG) & (BIT))

  4. #define CLEAR_REG(REG)        ((REG) = (0x0))

  5. #define WRITE_REG(REG, VAL)   ((REG) = (VAL))

  6. #define READ_REG(REG)         ((REG))

  7. #define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))

  8. #define POSITION_VAL(VAL)     (__CLZ(__RBIT(VAL)))
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2018-7-26 11:02:18 | 显示全部楼层
调用方式举例:

  1. /**
  2.   * @brief  To Enable optimize the I/O speed when the product voltage is low.
  3.   * @note   This bit is active only if PRODUCT_BELOW_25V user option bit is set. It must be
  4.   *         used only if the product supply voltage is below 2.5 V. Setting this bit when VDD is
  5.   *         higher than 2.5 V might be destructive.
  6.   * @retval None
  7.   */
  8. void HAL_SYSCFG_EnableIOSpeedOptimize(void)
  9. {
  10.    SET_BIT(SYSCFG->CCCSR, SYSCFG_CCCSR_HSLV) ;
  11. }

  12. /**
  13.   * @brief  To Disable optimize the I/O speed when the product voltage is low.
  14.   * @note   This bit is active only if PRODUCT_BELOW_25V user option bit is set. It must be
  15.   *         used only if the product supply voltage is below 2.5 V. Setting this bit when VDD is
  16.   *         higher than 2.5 V might be destructive.
  17.   * @retval None
  18.   */
  19. void HAL_SYSCFG_DisableIOSpeedOptimize(void)
  20. {
  21.   CLEAR_BIT(SYSCFG->CCCSR, SYSCFG_CCCSR_HSLV) ;
  22. }

  23. /**
  24.   * @brief  Code selection for the I/O Compensation cell
  25.   * @param  SYSCFG_CompCode: Selects the code to be applied for the I/O compensation cell
  26.   *   This parameter can be one of the following values:
  27.   *   @arg SYSCFG_CELL_CODE : Select Code from the cell (available in the SYSCFG_CCVR)
  28.   *   @arg SYSCFG_REGISTER_CODE: Select Code from the SYSCFG compensation cell code register (SYSCFG_CCCR)
  29.   * @retval None
  30.   */
  31. void HAL_SYSCFG_CompensationCodeSelect(uint32_t SYSCFG_CompCode)
  32. {
  33.   /* Check the parameter */
  34.   assert_param(IS_SYSCFG_CODE_SELECT(SYSCFG_CompCode));
  35.   MODIFY_REG(SYSCFG->CCCSR, SYSCFG_CCCSR_CS, (uint32_t)(SYSCFG_CompCode));  
  36. }
复制代码


回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
发表于 2018-7-26 14:00:16 | 显示全部楼层
问楼主一个问题,库中有一个定义如下:
#define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INSTANCE__->__REG__)
宏定义能够将 __INSTANCE__, __REG__  拼接成 __INSTANCE__->__REG__  吗?我记得是用#拼
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2018-7-26 14:33:51 | 显示全部楼层
shtj114 发表于 2018-7-26 14:00
问楼主一个问题,库中有一个定义如下:
#define LL_GPIO_ReadReg(__INSTANCE__, __REG__) READ_REG(__INST ...

是##.
函数名之类的字符串可以拼接,含链接符 -> 怎么拼接





回复

使用道具 举报

1

主题

20

回帖

23

积分

新手上路

积分
23
发表于 2018-7-27 15:25:56 | 显示全部楼层
本帖最后由 shtj114 于 2018-7-27 15:36 编辑
eric2013 发表于 2018-7-26 14:33
是##.
函数名之类的字符串可以拼接,含链接符 -> 怎么拼接

ST新的LL库就是这样定义的,编译也没有错,所以有此疑问
刚才在MDK里试了一下,确实可以拼接
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
 楼主| 发表于 2018-7-27 15:38:17 | 显示全部楼层
shtj114 发表于 2018-7-27 15:25
ST新的LL库就是这样定义的,编译也没有错,所以有此疑问

直接这么宏定义可以的,拼接符不行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 00:08 , Processed in 0.237993 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表