STM32F10X 寄存器映射

之前我写过一些关于微处理器的博客,都是关于使用ST公司给我们的固件库来编写的,这样的编写无疑是很高效的,但是为什么这些固件库就可以实现我们想要的功能呢,这个就是需要涉及到单片机的底层地址,那下面我们就深入到单片机的最底层来一探究竟吧。
首先,我们想找各个寄存器和外设的地址,我们就要找到芯片手册中,有一项是存储器的映射,这张图里面就是告诉了我们开发者,各个存储器的地址都是什么,比如我们可以找到APB1,APB2,AHB,GPIOA等等(图可能看不清,你们可以看看自己的芯片手册)STM32F10X 寄存器映射_第1张图片

下面我们就以点亮一个小灯为例,来看看我们怎么通过操作底层的地址来点亮我们的小灯。
首先我们点亮一个小灯之前,需要打开我们这个端口的系统时钟,根据我的原理图,可以看到,我的小灯是连接在PB5这个端口上的(这个因为每个人用到的板子是不一样的,所以每个人的电路连接图也是不一样的)。
所以我们在寄存器手册上找到寄存器RCC_APB2ENR,这里为什么是APB2不是APB1呢,这是因为我通过看数据手册,发现GPIOB这个口是挂载在APB2这个时钟上的,所以我们需要把APB2使能。
STM32F10X 寄存器映射_第2张图片

我们找到这个寄存器,然后发现这边有个偏移地址,这就是表示在RCC基地址的基础上,偏移了0x18,RCC的地址我们在之前也说了怎么查找,所以下面我们就可以通过控制这个地址来打开GPIOB的时钟。
STM32F10X 寄存器映射_第3张图片

//.h文件里面的定义
#ifndef __STM32F10X_H
#define __STM32F10X_H

#define  RCC_BASE  0x40021000
#define  RCC_APB2ENR  *(unsigned int*)(RCC_BASE + 0X18)

#endif
//保存文件名为led.h
//main函数
#ifndef __STM32F10X_H1
#define __STM32F10X_H1

#include "led.h"
RCC_APB2ENR &= ~(1 << 3); // 清零操作
RCC_APB2ENR |= (1 << 3);  

#endif

这样就可以完成APB2端口的时钟使能了,接下来就是使得我们的GPIOB的PIN_5置为1,这样就可以点亮一个led灯了。
和上面的RCC一样,GPIOB的基地址我们可以找到,然后就是通过找到GPIO_CRL和GPIO_ODR寄存器的地址,就可以完成操作了。
STM32F10X 寄存器映射_第4张图片STM32F10X 寄存器映射_第5张图片

这里不难发现找出这两个寄存器的位置,所以下面直接通过代码的编写来完成。

//led.h文件的编写
#ifndef __STM32F10X_H
#define __STM32F10X_H

#define GPIOB_BASE  0x4001 0c00
#define GPIOB_CRL  *(unsigned int*)GPIOB_BASE
#define GPIOB_ODR  *(unsigned int*)(GPIOB_BASE + 0xCh)

#endif
//main函数的实现
#ifndef __STM32F10X_H1
#define __STM32F10X_H1

#include "led.h"
GPIOB_CRL &= ~(0X0F << (4*5)); //位清零
GPIOB_CRL |= (3 << 20);
GPIOB_ODR &= ~1 << 5; // 清零  
GPIO_ODR |= (1 << 5);

#endif

上面如果置零和置一的操作还有疑问的话,可以在网上查一查,这里我就不过多的赘述了。
这样的话,我们就可以点亮板子上的一个led灯了。实现了我们的一个寄存器的映射。
但这样还存在一个问题,一个可以优化的地方,就是如果我们一个一个去写这些寄存器的地址,工程量会非常的大。但我们发现,因为这是一个32位的单片机,每个寄存器的偏移量就正好是4个字节,所以我们可以通过c语言俩面的结构体自动分配地址的这个性质,来更加方便快捷的完成寄存器的映射。
下面就以GPIOB的寄存器映射为例。

//led.h文件
typedef struct
{
	uint32_t CRL;
	uint32_t CRH;
	uint32_t IDR;
	uint32_t ODR;
	uint32_t BSRR;
	uint32_t BRR;
	uint32_t LCKR;
}GPIOX_Typedef;

#define GPIOB (GPIOX_Typedef*)GPIOB_BASE;

这样我们就只用找到基地址,就可以完成其他所有寄存器的地址。
当然,这些事情呢也都不需要我们字自己来实现,ST公司在开发一块板子的时候,就有专门的人员已经完成了这项工作,以后我们只学要include 一个文件,我们就可以随心所欲的使用里面所有的固件库了。

你可能感兴趣的:(STM32F103,stm32,单片机)