野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15596|回复: 0

关于STM32结构体指针的问题,视频第9讲第1节

[复制链接]
发表于 2020-5-23 23:26:33 | 显示全部楼层 |阅读模式
视频中有讲到,将GPIO的寄存器定义成结构体。代码如下:
#define PERIPH_BASE                   ((unsigned int ) 0x40000000)         //声明外设基地址为0x4000 0000
#define APB2PERIPH_BASE                (PERIPH_BASE + 0x10000)                        //声明APB2基地址0x4001 0000
#define GPIOA_PERIPH_BASE                (APB2PERIPH_BASE + 0x0800)                        //声明GPIOA基地址0x4001 0800


typedef struct     //定义GPIO寄存器结构体
{
        uint32_t CRL;        //0x00
        uint32_t CRH;        //0x04       
        uint32_t IDR;        //0x08
        uint32_t ODR;        //0x0c
        uint32_t BSRR;        //0x10
        uint32_t BRR;        //0x14
        uint32_t LCKR;        //0x18

}GPIO_TypeDef;

#define GPIOA  ((GPIO_TypeDef *) GPIOA_PERIPH_BASE )     //将GPIOA的基地址强制转换成GPIO_TypeDef类型的指针。




RCC_APB2ENR |= (1<<2);                             //打开GPIOA的时钟
GPIOA->CRH &=~((0x0f)<<(4*0)) ;                //将GPIOA的CRH寄存器清零 即GPIOA_8
GPIOA->CRH |= (1<<(4*0));                        //将GPIOA的CRH寄存器配置为0x0001


//在主函数里面操作是直接访问结构体成员变量的。
//但是在之前的视频中带有指针的都需要有取指符 *
//这个为啥可以直接访问。
//即之前都是这样的:

*( unsigned int * )(0x40021000 + 0x18) |= (1<<2); //打开GPIOA的时钟
*( unsigned int * )(0x40010800 + 0x04) &=~((0x0f)<<(4*0)); //先要将CRH寄存器清零
*( unsigned int * )(0x40010800 + 0x04) |= (1<<(4*0));


//这个位置是有取指符的
//而GPIOA->CRH ;等于 ((GPIO_TypeDef *) GPIOA_PERIPH_BASE + CRH(地址))  ,这句直接按照地址映射为 (GPIO_TypeDef *)(0x4001 0800+0x04) ; ?
//(GPIO_TypeDef *)(0x4001 0800+0x04) ;显示出来的就没有取指符 ?

上面理解的有问题吗,还是我理解错了,请大神帮忙解释一下,谢谢!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 00:23 , Processed in 0.026274 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表