寄存器就是一个已经分配好地址的特殊的内存空间取的一个别名,这个特殊的内存空间可以通过指针操作。
stm32f10x.h文件
/*片上外设基地址*/
#define PERIPH_BASE ((unsigned int)0x40000000)
/*总线基础地址,GPIO都挂载在APB2上*/
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
/*RCC挂载在AHB上*/
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)
/*GPIOB外设基地址*/
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0c00)
/*RCC外设基础地址*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
/*GPIO寄存器地址,强制转换成指针*/
#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+Ox10)
#define GPIOB_BRR *(unsigned int*) (GPIOB_BASE+0x14)
#define GPIOB_LCKR *(unsigned int*) (GPIOB_BASE+0X18)
/*RCC的AHB1时钟使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*) (RCC_BASE+0x18)
起始地址 | 外设 | 总线 |
---|---|---|
0x40010C00-0x40010FFF | GPIO端口B | APB2 |
0x40021000-0x400213FF | RCC | AHB |
地址偏移(GPIOB外设0x40010C00) | 寄存器 |
---|---|
0x00 | GPIOB_CRL |
0x04 | GPIOB_CRH |
0x08 | GPIOB_IDR |
0x0C | GPIOB_ODR |
0x10 | GPIOB_BSRR |
0x14 | GPIOB_BRR |
0x18 | GPIOB_LCKR |
地址偏移(RCC外设0x40021000) | 寄存器 |
---|---|
0x00 | RCC_CR |
0x04 | RCC_CFGR |
0x08 | RCC_CIR |
0x0C | RCC_APB2RSTR |
0x10 | RCC_APB1RSTR |
0x14 | RCC_AHBENR |
0x18 | RCC_APB2ENR |
0x1C | RCC_APB1ENR |
main.c文件
#include "stm32f10x.h"
void SystemInit(void)
{
}
int main (void)
{
//开启GPIOB端口时钟
RCC_APB2ENR |= (1<<3);
//清空控制PB0的端口
GPIOB_CRL &= ~(0x0F<<(4*0));
//配置PB0为通用推挽输出,速度为10M
GPIOB_CRL |= (1<<4*0);
//PB0输出低电平
GPIOB_ODR &=~(0x01<<0);
while (1);
}
APB2外设时钟使能寄存器(RCC_APB2ENER)
端口配置低寄存器(GPIOx_CRL)(x=A…E)
位 31:10 27:26 23:22 19:18 15:14 11:10 7:6 3:2 | CNFy[1:0]:端口x配置位(y=0…7) 软件通过这些位配置相应的I/O端口 在输入模式(MODE[1:0]=00): 00:模拟输入模式 01:浮空输入模式(复位后的状态) 10:上拉/下拉输入模式 11:保留 在输出模式(MODE[1:0]>00): 00:通用推挽输出模式 01:通用开漏输出模式 10:复用功能推挽输出模式 11:复用功能开漏输出模式 |
---|---|
位29:28 25:24 21:20 17:16 13:12 9:8 5:4 1:0 | MODEy[1:0]:端口x的模式位(y=0…7)软件通过这些位配置相应的I/O端口 00:输入模式(复位后的状态) 01:输出模式,最大速度10MHz 10:输出模式,最大速度2MHz 11:输出模式,最大速度50MHz |
端口输出数据寄存器(GPIOx_ODR)(x=A…E)
位31:16 | 保留,始终读为0 |
---|---|
位15:0 | ODRy[15:0]:端口输出数据(y=0…15) 这些位可读可写并只能以字(16位)的形式操作 注:对GPIOx_BSRR(x=A…E),可以分别地对各个ODR位进行独立的设置/清除 |