野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14733|回复: 10

typedef struct不太会,有没有大佬细心指导指导?

[复制链接]
发表于 2018-3-22 13:53:21 | 显示全部楼层 |阅读模式
//用来存放寄存器映射的代码

//外设 Perirhral
#define PERIRPH_BASE            ((unsigned int)0x40000000)//这里要别加*号就都别加不然出问题
#define APB1PERIRPH_BASE        PERIRPH_BASE
#define APB2PERIRPH_BASE        (PERIRPH_BASE+0x10000)
#define AHBPERIRPH_BASE         (PERIRPH_BASE+0x20000)

#define RCC_BASE                (AHBPERIRPH_BASE+0x1000)   
#define GPIOB_BASE              (APB2PERIRPH_BASE+0x0c00)

#define RCC_APB2ENR             *(unsigned int*)(RCC_BASE+0x18)
       
//#define GPIOB_CRL               *(unsigned int*)(GPIOB_BASE+0x00)
//#define GPIOB_CRH               *(unsigned int*)(GPIOB_BASE+0x04)
//#define GPIOB_IDR               *(unsigned int*)(GPIOB_BASE+0x08)
//#define GPIOB_ODR               *(unsigned int*)(GPIOB_BASE+0x0C)
//#define GPIOB_BSRR              *(unsigned int*)(GPIOB_BASE+0x10)
//#define GPIOB_BRR               *(unsigned int*)(GPIOB_BASE+0x14)
//#define GPIOB_LCKR              *(unsigned int*)(GPIOB_BASE+0x18)
       

typedef unsigned int   uint32_t;
typedef unsigned short uint16_t;
typedef struct
{
  uint32_t CRL;
        uint32_t CRH;
        uint32_t IDR;
        uint32_t ODR;
        uint32_t BSRR;
        uint32_t BRR;
        uint32_t LCKR;
}GPIO_TypeDef;


typedef struct
{
  uint32_t CR;
        uint32_t CFGR;
        uint32_t CIR;
        uint32_t APB2RSTR;
        uint32_t APB1RSTR;
        uint32_t AHBENR;
        uint32_t APB2ENR;
        uint32_t APB1ENR;
        uint32_t BDCR;
        uint32_t CSR;
}RCC_TypeDef;

#define GPIOB ((GPIO_TypeDef*)GPIOB_BASE)















这里图片里面的看不懂,为什么可以用,还有就是内存是不是在结构体定义的时候被直接使用了

这里图片里面的看不懂,为什么可以用,还有就是内存是不是在结构体定义的时候被直接使用了
回复

使用道具 举报

 楼主| 发表于 2018-3-22 13:54:28 | 显示全部楼层
求大佬指点指点哇,小白看到这里都是蒙圈的啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 13:54:52 | 显示全部楼层
#include "stm32f10x.h"
int main(void)
{
        #if 0
        //打开GPIO_B端口的时钟
        *(unsigned int*)0x40021018 |=(1<<3);
        //控制CRL寄存器(配置I/O口为输出),|置一操作,这里(4*0)的意思是四个为一组。
        *(unsigned int*)0x40010c00 |=((1)<<(4*0));
        //控制ODR寄存器,这里& ~ 置0操作
  *(unsigned int*)0x40010c0c &=~(1<<0);
        #elif 0
        //打开GPIO_B端口的时钟
    RCC_APB2ENR |=(1<<3);
        //控制CRL寄存器(配置I/O口为输出),|置一操作,这里(4*0)的意思是四个为一组。
          GPIOB_CRL |=((1)<<(4*0));
        //控制ODR寄存器,这里& ~ 置0操作
    GPIOB_ODR &=~(1<<0);
        #elif 1
                //打开GPIO_B端口的时钟
    RCC->APB2ENR |=(1<<3);
        //控制CRL寄存器(配置I/O口为输出),|置一操作,这里(4*0)的意思是四个为一组。
          GPIOB->CRL &=~((0x0f)<<(4*0));
          GPIOB->CRL |=((1)<<(4*0));
        //控制ODR寄存器,这里& ~ 置0操作
          GPIOB->ODR &=~(1<<0);
//                GPIOB->ODR |=(1<<0);
        #endif
}
//置位 |=   清零 &=~
void SystemInit(void)
{
   //函数体为空。目的是为了骗过编译不报错。
}

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 13:56:46 | 显示全部楼层
看到这里真心不会用啊,还有有的是点也不会用,感觉好牛逼 #define GPIOB ((GPIO_TypeDef*)GPIOB_BASE)这句话看不懂哇
回复 支持 反对

使用道具 举报

发表于 2018-3-22 14:49:41 | 显示全部楼层
这个网上百度百度,或者看看C语言书籍,巩固下基础
回复 支持 反对

使用道具 举报

发表于 2018-3-22 14:52:36 | 显示全部楼层
GPIOB_BASE =  (APB2PERIRPH_BASE+0x0c00) 就是所谓的外设基地址加上偏移地址。这个地址是寄存器的地址,固定了的。
然后根据芯片设计的寄存器地址,定义了GPIO_TypeDef结构体。结构体的成员顺序是和寄存器是一一对应的。
GPIO_TypeDef的成员都是uint32_t 就是4个字节所以就有了(+4)
//#define GPIOB_CRL               *(unsigned int*)(GPIOB_BASE+0x00)
//#define GPIOB_CRH               *(unsigned int*)(GPIOB_BASE+0x04)
(GPIO_TypeDef*)GPIOB_BASE将 GPIOB_BASE这个地址,强制转换为指向GPIO_TypeDef的指针。
. 直接成员访问操作符
-> 间接成员访问操作符
GPIOB->CRL 是结构体指针访问成员。跟( *GPIOB).CRL 作用是一样的。
#define GPIOB ((GPIO_TypeDef*)GPIOB_BASE) 就只是个宏定义而已。目的就是方便使用。
我也是小白,仅供参考哈。
回复 支持 反对

使用道具 举报

发表于 2018-3-22 15:40:05 | 显示全部楼层
主要是没搞清楚地址和结构体赋值之类的吧,

首先地址不用加星号,例如地址 a
然后把地址转换成指针要使用(unsigned int*)a  强制转换得到指针 p
如果要对地址进行赋值,就要进行*号取指针操作,如*p = 0x123,就对地址a里的内容赋值为0x123了

最后,给结构体GPIOA 的地址指向a,访问它的成员是不需要用*号的,直接GPIOA->CRL = 0x123就可以赋值
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 23:35:22 | 显示全部楼层
浪费 发表于 2018-3-22 14:52
GPIOB_BASE =  (APB2PERIRPH_BASE+0x0c00) 就是所谓的外设基地址加上偏移地址。这个地址是寄存器的地址, ...

谢谢大神哇,又学到好东西了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 23:36:17 | 显示全部楼层
flyleaf 发表于 2018-3-22 15:40
主要是没搞清楚地址和结构体赋值之类的吧,

首先地址不用加星号,例如地址 a

嗯,基础的也会,基地址还有指针转换啥的,就是结构体定义那边还有强制类型转换接地址啥的,蒙圈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-22 23:36:39 | 显示全部楼层
a5820736 发表于 2018-3-22 14:49
这个网上百度百度,或者看看C语言书籍,巩固下基础

再看,也再百度,是在愚钝
回复 支持 反对

使用道具 举报

发表于 2018-5-3 17:28:32 | 显示全部楼层
赶紧过来学习一下。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-6 05:26 , Processed in 0.050110 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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