作者disap ( )
看板ASM
标题Re: [问题] 关於GPIO的指标写法
时间Sat Nov 19 15:43:54 2016
※ 引述《goodzey (--)》之铭言:
: 请教大家,在STM32Lxx.h有以下指标写法
: #define GPIOB_BASE (0x0c00)
: #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
: typedef struct
: {
: __IO uint32_t CRL;
: __IO uint32_t CRH;
: __IO uint32_t IDR;
: __IO uint32_t ODR;
: __IO uint32_t BSRR;
: __IO uint32_t BRR;
: __IO uint32_t LCKR;
: } GPIO_TypeDef;
: int main(void)
: {
: GPIOB->CRH &= 0xFFFFFFF0;
: GPIOB->CRH |= 0x00000003;
: }
: 其中的指标写法:
: #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
: 请问大家,有没有简单的example code可以协助理解这种写法?
: 我找了很多网路资料都没有多说
: 在正规C语言中这种写法的关键字是什麽?查得到C语言正规教材吗?
: 谢谢!
0x0c00 本来只是常数,这里是把它强制转型为一个资料结构(GPIO_TypeDef)的指标,
所以:
GPIOB->CRH &= 0xFFFFFFF0;
实际上是:
((GPIO_TypeDef *)0x0c00)->CRH &= 0xFFFFFFF0;
这段程式是当成有一个 GPIO_TypeDef 的实例,存放在从 0x0c00 开始的位置,
然後从该位置开始往下索引到 CRH 的位置,对那个位置内的数值执行"& 0xFFFFFFF0"。
可以参考该IC的 reference manual,GPIO_TypeDef 内的成员对应的是实体的暂存器。
这些程式只是出於扩充方便而采用间接定址的方式去存取这些暂存器。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 175.181.154.224
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/ASM/M.1479541436.A.CE6.html
1F:→ goodzey: 谢谢! 11/20 08:53
2F:推 karamajean: 推专业 06/08 13:24