打印

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

[复制链接]
1079|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luoengineer|  楼主 | 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位了??



使用特权

评论回复
沙发
sonicll| | 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固件库里的好多变量类型都是按照这个逻辑写的

使用特权

评论回复
板凳
zeshoufx| | 2019-10-22 10:26 | 只看该作者
了解一下,,,,,,,,,,

使用特权

评论回复
地板
luoengineer|  楼主 | 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
sonicll| | 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
wowu| | 2019-11-12 14:10 | 只看该作者
不要纠结这个

使用特权

评论回复
7
nawu| | 2019-11-12 14:21 | 只看该作者
楼主关心的这个问题 在这里没有什么具体的意义

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

80

帖子

1

粉丝