打印

GD32外设寄存器宽度是按16bit组织的吗?

[复制链接]
171|6
跳转到指定楼层
楼主
 楼主 | 2019-10-21 15:28 | 只看该作者 |退出气泡模式 回帖奖励 |倒序浏览 |阅读模式
已知GD32的固件函数库有如下定义:
#define RCU_REGIDX_BIT(regidx, bitpos)      (((uint32_t)(regidx)<<6) | (uint32_t)(bitpos))
typedef enum
{
...

IDX_APB2RST    = 0x0CU,
...
}

typedef enum
{

...
RCU_ADCRST     = RCU_REGIDX_BIT(IDX_APB2RST, 9U),             /*!< ADC reset */
...
}

IDX_APB2RST为什么要左移6位?难道M23的ARM不是32 bit宽度的吗?
如果数据宽度按32 bit组织,那么应该左移3位;
如果数据宽度按16 bit组织,那么应该左移6位了??



沙发
| 2019-10-22 09:23 | 只看该作者
你没有正确理解这个固件库的写法,这和32位还是16位没有关系
RCU_ADCRST,只是个符号,它的高26位代表这个功能在哪个寄存器(例如AHBRST,APB1RST,APB2RST),低6位代表在寄存器的第几位,例如:RCU_ADC0RST  = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 9U),代表ADC0时钟复位功能在APB2RST寄存器的第9bit。RCU固件库里的好多变量类型都是按照这个逻辑写的
板凳
| 2019-10-22 10:26 | 只看该作者
了解一下,,,,,,,,,,
地板
 楼主 | 2019-10-23 09:30 | 只看该作者
sonicll 发表于 2019-10-22 09:23
你没有正确理解这个固件库的写法,这和32位还是16位没有关系
RCU_ADCRST,只是个符号,它的高26位代表这个 ...

谢谢!我在你的基础上再补充3点,请看下对不:
1、低6位代表第几位,从#define RCU_BIT_POS(val)                    ((uint32_t)(val) & 0x1FU)这个定义可以看出,0~31bit都是可以表示的;
2、左移6位后,寄存器的偏移地址共26bit,从存储器映射表来看,实际使用的寄存器地址都可以表示,理论上寄存器地址最多有28bit,但一般不会这样分配;
3、其实寄存器偏移左移5位也是可以的,如这样:
#define RCU_REGIDX_BIT(regidx, bitpos)      (((uint32_t)(regidx)<<5) | (uint32_t)(bitpos))
5
| 2019-10-23 14:15 | 只看该作者
本帖最后由 sonicll 于 2019-10-23 14:18 编辑
luoengineer 发表于 2019-10-23 09:30
谢谢!我在你的基础上再补充3点,请看下对不:
1、低6位代表第几位,从#define RCU_BIT_POS(val)         ...

你理解的都没错,
1. 预留了6位的空间,实际只用5位,因为2的5次方等于32
2. 目前这种固件库写法,对于RCU这个外设,26bit足够了,因为RCU总空间占用才1K(0x400);占用28bit长度的外设,固件库肯定也不会用这种方式来编写
3. 左移5位是可以的,因为实际只用了5位,把RCU_REG_VAL、RCU_REGIDX_BIT都统一改成移5位就行
6
| 2019-11-12 14:10 | 只看该作者
不要纠结这个
7
| 2019-11-12 14:21 | 只看该作者
楼主关心的这个问题 在这里没有什么具体的意义
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表
彩尊彩票 山东11选5 868彩票 pk10怎么玩 美狮彩票 五福彩票 欢乐赛车 868彩票 pk10机器人 平安彩票