GD32库中常用的位操作REGIDX_BIT(regidx, bitpos)
在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)相关推荐
- ollections 库中常用的 4 个数据结构
collections 库是标准库的一部分,里面有很多数据结构,在列表.字典.元组的基础上做了很多修改和提升. 今天就来说说最有用的几个. 1.deque 它实现了两端都可以操作的队列,相当于双端队列 ...
- iOS标准库中常用数据结构和算法之内存池
上一篇:iOS标准库中常用数据结构和算法之位串 ⛲️内存池 内存池提供了内存的复用和持久的存储功能.设想一个场景,当你分配了一块大内存并且填写了内容,但是你又不是经常去访问这块内存.这样的内存利用率将 ...
- Py之Numpy:Numpy库中常用函数的简介、应用之详细攻略
Py之Numpy:Numpy库中常用函数的简介.应用之详细攻略 目录 Numpy库中常用函数的简介.应用 1.X, Y = np.meshgrid(X, Y) 相关文章 Py之Numpy:Numpy库 ...
- iOS标准库中常用数据结构和算法之二叉排序树
上一篇:iOS标准库中常用数据结构和算法之排序 ?二叉排序树 功能:二叉排序树的标准实现是一颗平衡二叉树.二叉排序树主要用来解决高效插入和高效检索以及进行排序的问题.系统分别提供了二叉排序树节点的查找 ...
- keilcjson内存分配失败_iOS标准库中常用数据结构和算法之内存池
黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Linux编程点击右侧关注,免费入门到精通! 作者丨欧阳大哥2013https://www.jianshu.com ...
- (原创)机器学习之numpy库中常用的函数介绍(一)
1. mat() mat()与array的区别: mat是矩阵,数据必须是2维的,是array的子集,包含array的所有特性,所做的运算都是针对矩阵来进行的. array是数组,数据可以是多维的,所 ...
- imgaug数据增强库中常用的增强器
Overview of Augmenters: https://imgaug.readthedocs.io/en/latest/source/overview_of_augmenters.html 1 ...
- 1062lcd在dxp哪个库_dxp_2004_元件库中的常用元件所在位置
########### DXP2004 下 Miscellaneous Devices.Intlib 元件库中常用元件有: 电阻系列( res* )排组( res pack* ) 电感( induct ...
- python常用标准库有哪些-Python开发中常用的标准库
大多数基于 Python 开发的应用程序都会用到本地标准库和三方库,这样不仅能让我们把时间去关注真正的业务开发,也能学习到更多价值含量高的程序设计和开发思想.程序开发中有一句著名的话叫做: Don't ...
- Github上Pandas,Numpy和 Scipy三个库中20个最常用的函数
首发于Datartisan数据工匠 写文章 Github上Pandas,Numpy和 Scipy三个库中20个最常用的函数 Datartisan 9 个月前 几个月前,我看到一篇博客中列出了 Gith ...
最新文章
- c语言判断2 1000素数,2是不是素数(C语言判断一个数为素数)
- 每日一皮:很多时候你和Bug就像这样!
- 本周学习进度表及时间安排(2018-1-7~2018-1-13)
- 项目: 打字母游戏【c++/c】
- 如何让插件加载到Qt Designer
- 牛客多校9 - Groundhog Chasing Death(质因子分解+思维)
- FPGA学习之路—Vivado与Modelsim联合仿真
- 天弘基金交易数据清算从8小时缩至1.5小时 解决余额宝算力难题
- 【OJ4976】硬币,神奇的背包
- 开源知识管理系统_Zboot权限后台管理系统开源啦
- 程序员书单 (不定期更新)
- 《奠基计算机网络》所需软件 下载地址
- php dw制作购物车,php – 以编程方式向WooCommerce购物车添加免税费用
- Oracle,Mysql,Sqlserver数据库连接串(总爱忘,留着备用)
- Javascript特效:字体火焰背景
- sql数据库自动备份
- Android jetpack-DataStore
- 图解PhotoView,从“百草园”到“三味书屋”!
- 首次用jwt做token
- 自上而下的语法分析-递归下降分析和LL(1)文法
热门文章
- ThinkPad E430 选择U盘启动后又跳回选择画面
- 39.安装PH5\PH7
- win10隐藏登入界面时的administrator账户
- 2021年国内PT站点汇总(中英文名称对照表)很全呦!
- word中使用通配符替换【持续更新系列】
- 学习java的第十七天,房贷简易计算器,三角形判断、面向对象重写方法的学习
- 模拟一个简单的购房商贷月供计算器
- Anaconda更换字体及字号
- 「LSTM 之父」亲笔万字长文,只为向世人证明:深度学习不是在母语为英语的地方被发明的...
- activitimq集群搭建_activemq集群的搭建