野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9938|回复: 4

实现RCC这个外设的寄存器结构体声明,把时钟相关的代码改成寄存器结构体操作的方式

[复制链接]
发表于 2018-7-21 10:17:22 | 显示全部楼层 |阅读模式
请教各位大神,我按照时频讲解的方式输入了我的代码,而且是直接再论坛下载的程序源码基础上修改的,为什么编译以后系统没有报错,但是灯不亮。以下是头文件定义
[mw_shl_code=c,true]// 用来存放STM32寄存器映射的代码

// 外设  perirhral

#define  PERIPH_BASE               ((unsigned int)0x40000000)
#define  APB1PERIPH_BASE           PERIPH_BASE
#define  APB2PERIPH_BASE          (PERIPH_BASE + 0x10000)
#define  AHBPERIPH_BASE           (PERIPH_BASE + 0x20000)


#define  RCC_BASE                (AHBPERIPH_BASE + 0x1000)
#define  GPIOB_BASE              (APB2PERIPH_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;


#define GPIOB   ((GPIO_TypeDef*)GPIOB_BASE)

typedef struct       //作业
{
  uint32_t CR;
        uint32_t CFGR;
        uint32_t CIR;
        uint32_t APB2RSTR;
        uint32_t APB1RSTR;
        uint32_t AHBENR;
        uint32_t APB1ENR;
        uint32_t APB2ENR;
        uint32_t BDCR;
        uint32_t CSR;
        uint32_t AHBRSTR;
        uint32_t CFGR2;

}RCC_TypeDef;

#define RCC ((RCC_TypeDef*)RCC_BASE)
[/mw_shl_code]


以下是main.c

[mw_shl_code=c,true]#include "stm32f10x.h"

int main (void)
{
#if 0       
        // 打开 GPIOB 端口的时钟
        *( unsigned int * )0x40021018 |=  ( (1) << 3 );
       
        // 配置IO口为输出
        *( unsigned int * )0x40010C00 &=  ~( (0x0f) << (4*0) );
        *( unsigned int * )0x40010C00 |=  ( (1) << (4*0) );
       
        // 控制 ODR 寄存器
        *( unsigned int * )0x40010C0C &= ~(1<<0);
       
#elif 0
       
        // 打开 GPIOB 端口的时钟
        RCC->APB2ENR  |=  ( (1) << 3 );
       
        // 配置IO口为输出
        GPIOB_CRL &=  ~( (0x0f) << (4*0) );
        GPIOB_CRL |=  ( (1) << (4*0) );
       
        // 控制 ODR 寄存器
        GPIOB_ODR &= ~(1<<0);
        //GPIOB_ODR |= (1<<0);

#elif 1
                // 打开 GPIOB 端口的时钟
        RCC->APB2ENR  |=  ( (1) << 3 );
       
        // 配置IO口为输出
        GPIOB->CRL &=  ~( (0x0f) << (4*0) );
        GPIOB->CRL |=  ( (1) << (4*0) );
       
        // 控制 ODR 寄存器
        GPIOB->ODR &= ~(1<<0);
        //GPIOB->ODR |= (1<<0);
#endif
}


void SystemInit(void)
{
        // 函数体为空,目的是为了骗过编译器不报错
}[/mw_shl_code]

而且我输入了->以后并没有显示结构体指针的指向,而仅仅显示了uint32_t
回复

使用道具 举报

发表于 2018-7-21 10:42:15 | 显示全部楼层
在main函数的末尾加个 while(1);  死循环看看

“而且我输入了->以后并没有显示结构体指针的指向,而仅仅显示了uint32_t”
这个是mdk的问题,不是代码问题,mdk的这个功能不好用
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-7-21 10:49:36 | 显示全部楼层
左丘冰 发表于 2018-7-21 10:42
在main函数的末尾加个 while(1);  死循环看看

“而且我输入了->以后并没有显示结构体指针的指向,而仅仅 ...

加了循环也不亮灯。那这个mdk问题如何解决?
回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-21 11:52:10 | 显示全部楼层
禁一翻。 发表于 2018-7-21 10:49
加了循环也不亮灯。那这个mdk问题如何解决?

直接对比下跟野火的代码有什么区别咯,或者直接学习后面就算了,后面用库操作就不这么纠结了

那个功能平时也不用,不要依赖它
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-21 13:40:26 | 显示全部楼层
东门安芙 发表于 2018-7-21 11:52
直接对比下跟野火的代码有什么区别咯,或者直接学习后面就算了,后面用库操作就不这么纠结了

那个功能 ...

好的,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 03:26 , Processed in 0.044571 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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