在GD32的库里面,经常看到

#define RCU_REGIDX_BIT(regidx, bitpos)   (((uint32_t)(regidx)<<6) | (uint32_t)(bitpos))

#define RCU_REG_VAL(periph)  (REG32(RCU + ((uint32_t)(periph)>>6)))  

#define RCU_BIT_POS(val)   ((uint32_t)(val) & 0x1FU) 

这样的写法

GD32将寄存器地址偏移REGDIX 和 里面控制位BIT偏移组合成1个新的32bit数值!

所以这个比较绕。 它的操作,都是基于这个新的32bit值的。 比如向右>>6,就可以获得寄存器的地址偏移。  (REG32(RCU + ((uint32_t)(periph)>>6)))   则就得到了完整的寄存器地址。而((uint32_t)(val) & 0x1FU) 则可以得到位的偏移,然后通过BIT()这个偏移量,即可将具体的位置1.

还是很巧妙的。 里面运用的次数较多,所以这里单独来分析了。

下面是库文件中的具体例子:

将RCU的寄存器地址偏移REGDIX 和 里面控制位BIT偏移组合成1个新的32bit数值!

#define RCU_REGIDX_BIT(regidx, bitpos)      (((uint32_t)(regidx)<<6) | (uint32_t)(bitpos))

RCU_REGIDX_BIT将寄存器偏移REGDIX和控制位BIT组合成一个32位的值,以后就可以用了
具体,方法就是,把REGDIX左移动了<<6位,然后把控制位偏移量bitpos拼到结尾上去的。

#define RCU_REG_VAL(periph)  (REG32(RCU + ((uint32_t)(periph)>>6)))  

把这个RCU_REGIDX_BIT向右>>6bit,去掉了位偏移,也就还原了REGIDX_BIT ,就得到了外设偏移 ,这样再加上RCU的基地址,这样就可以读出该寄存器的值了

#define RCU_BIT_POS(val)   ((uint32_t)(val) & 0x1FU) 

RCU_BIT_POS() 这个功能就是将上面组合好的32位值填到里面,它可以算出具体控制位的偏移。
0x1FU 表示限制后5位,为啥是5位?  0b000....1 1111
由于某个寄存器中,位的偏移最多就是[0~31], 所以用5bit就可以表示这个偏移位数了。

比如这里的IDX_AHBRST,它的偏移是十进制的17U,二进制为0b000....1 0001
这样在做RCU_BIT_POS()之后与0x1FU进行与运算,那就得到了17这个值然后执行BIT(17),则把第17位置1了。 也就是设置了该位的值。

这个是宏定义,IDX_AHBRST  = 0x28U, 
这个是另一个别名定义 periph

typedef enum
{
    RCU_GPIOARST   = RCU_REGIDX_BIT(IDX_AHBRST, 17U),        
    RCU_GPIOBRST   = RCU_REGIDX_BIT(IDX_AHBRST, 18U),           
    RCU_GPIOCRST   = RCU_REGIDX_BIT(IDX_AHBRST, 19U),          
    RCU_GPIOFRST   = RCU_REGIDX_BIT(IDX_AHBRST, 22U),     
}rcu_periph_reset_enum;

GD32库中常用的位操作REGIDX_BIT(regidx, bitpos)相关推荐

  1. ollections 库中常用的 4 个数据结构

    collections 库是标准库的一部分,里面有很多数据结构,在列表.字典.元组的基础上做了很多修改和提升. 今天就来说说最有用的几个. 1.deque 它实现了两端都可以操作的队列,相当于双端队列 ...

  2. iOS标准库中常用数据结构和算法之内存池

    上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...

  3. Py之Numpy:Numpy库中常用函数的简介、应用之详细攻略

    Py之Numpy:Numpy库中常用函数的简介.应用之详细攻略 目录 Numpy库中常用函数的简介.应用 1.X, Y = np.meshgrid(X, Y) 相关文章 Py之Numpy:Numpy库 ...

  4. iOS标准库中常用数据结构和算法之二叉排序树

    上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树.二叉排序树主要用来解决高效插入和高效检索以及进行排序的问题.系统分别提供了二叉排序树节点的查找 ...

  5. keilcjson内存分配失败_iOS标准库中常用数据结构和算法之内存池

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Linux编程点击右侧关注,免费入门到精通! 作者丨欧阳大哥2013https://www.jianshu.com ...

  6. (原创)机器学习之numpy库中常用的函数介绍(一)

    1. mat() mat()与array的区别: mat是矩阵,数据必须是2维的,是array的子集,包含array的所有特性,所做的运算都是针对矩阵来进行的. array是数组,数据可以是多维的,所 ...

  7. imgaug数据增强库中常用的增强器

    Overview of Augmenters: https://imgaug.readthedocs.io/en/latest/source/overview_of_augmenters.html 1 ...

  8. 1062lcd在dxp哪个库_dxp_2004_元件库中的常用元件所在位置

    ########### DXP2004 下 Miscellaneous Devices.Intlib 元件库中常用元件有: 电阻系列( res* )排组( res pack* ) 电感( induct ...

  9. python常用标准库有哪些-Python开发中常用的标准库

    大多数基于 Python 开发的应用程序都会用到本地标准库和三方库,这样不仅能让我们把时间去关注真正的业务开发,也能学习到更多价值含量高的程序设计和开发思想.程序开发中有一句著名的话叫做: Don't ...

  10. Github上Pandas,Numpy和 Scipy三个库中20个最常用的函数

    首发于Datartisan数据工匠 写文章 Github上Pandas,Numpy和 Scipy三个库中20个最常用的函数 Datartisan 9 个月前 几个月前,我看到一篇博客中列出了 Gith ...

最新文章

  1. c语言判断2 1000素数,2是不是素数(C语言判断一个数为素数)
  2. 每日一皮:很多时候你和Bug就像这样!
  3. 本周学习进度表及时间安排(2018-1-7~2018-1-13)
  4. 项目: 打字母游戏【c++/c】
  5. 如何让插件加载到Qt Designer
  6. 牛客多校9 - Groundhog Chasing Death(质因子分解+思维)
  7. FPGA学习之路—Vivado与Modelsim联合仿真
  8. 天弘基金交易数据清算从8小时缩至1.5小时 解决余额宝算力难题
  9. 【OJ4976】硬币,神奇的背包
  10. 开源知识管理系统_Zboot权限后台管理系统开源啦
  11. 程序员书单 (不定期更新)
  12. 《奠基计算机网络》所需软件 下载地址
  13. php dw制作购物车,php – 以编程方式向WooCommerce购物车添加免税费用
  14. Oracle,Mysql,Sqlserver数据库连接串(总爱忘,留着备用)
  15. Javascript特效:字体火焰背景
  16. sql数据库自动备份
  17. Android jetpack-DataStore
  18. 图解PhotoView,从“百草园”到“三味书屋”!
  19. 首次用jwt做token
  20. 自上而下的语法分析-递归下降分析和LL(1)文法

热门文章

  1. ThinkPad E430 选择U盘启动后又跳回选择画面
  2. 39.安装PH5\PH7
  3. win10隐藏登入界面时的administrator账户
  4. 2021年国内PT站点汇总(中英文名称对照表)很全呦!
  5. word中使用通配符替换【持续更新系列】
  6. 学习java的第十七天,房贷简易计算器,三角形判断、面向对象重写方法的学习
  7. 模拟一个简单的购房商贷月供计算器
  8. Anaconda更换字体及字号
  9. 「LSTM 之父」亲笔万字长文,只为向世人证明:深度学习不是在母语为英语的地方被发明的...
  10. activitimq集群搭建_activemq集群的搭建