版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/D_Katter/article/details/79806802
1.什么是寄存器和寄存器映射
有特定功能的内存单元,通常我们给这个特殊的内存单元取一个名字。这个给已经分配好的地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
2.什么是存储器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就成为存储器映射。再分配一个地址叫重映射。
对于STM32来说Cortex-M3内核是由ARM设计的,ST公司设计其他的部分。
3.操作地址
根据芯片的中文参考手册,要实现点亮LED必须操作单片机的对应的IO口,输出对应的电平。
假如实现PC2口输出低电平就可以点亮LED。操作的程序如下:
/*配置RCC寄存器,使能GPIO口的时钟 */
*(unsigned int *)0X40021018 |= (1<<4);
/* 配置CRL寄存器,配置为输出模式*/
*(unsigned int *)0X40011000 |= ( 1<<(4*2) );
/*配置ODR寄存器 */
*(unsigned int *)0X4001100C &= ~( 1<<2 );
要实现片上外设的工作,首先就必须打开时钟,找到RCC寄存器组的起始地址,为0X40021000,偏移地址为0X18,挂在上面的GPIOC引脚需要将RCC的第4位置1。因此出现上面第一行的代码。
GPIOC的PC2要能正常输出一个低电平,才能点亮LED,需要配置CRL寄存器,即引脚的控制寄存器,能够控制引脚的输入输出状态和速度等等。4位控制一个引脚。
PC2输出低,还需要ODR数据寄存器来是实现最后到底是输出1还是输出0
4.封装地址
/*所有的外设基地址*/
#define PERIPH_BASE ((unsigned int )0X40000000)
/*总线基地址*/
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE+0X00010000)
#define AHBPERIPH_BASE (PERIPH_BASE+0X00018000)
/*寄存器组基地址*/
#define GPIOA_BASE (APB2PERIPH_BASE+0X0800)
#define GPIOB_BASE (APB2PERIPH_BASE+0X0C00)
#define GPIOC_BASE (APB2PERIPH_BASE+0X1000)
#define GPIOD_BASE (APB2PERIPH_BASE+0X1400)
/*寄存器地址*/
#define GPIOC_CRL ( GPIOC_BASE+0X00)
#define GPIOC_CRH ( GPIOC_BASE+0X04)
#define GPIOC_IDR ( GPIOC_BASE+0X08)
#define GPIOC_ODR ( GPIOC_BASE+0X0C)
#define GPIOC_BSRR ( GPIOC_BASE+0X10)
#define GPIOC_BRR ( GPIOC_BASE+0X14)
#define GPIOC_LCKR ( GPIOC_BASE+0X18)
5.总结
可以利用C语言指针的内容对底层地址进行操作,实现相应引脚的功能,也可以定义好各种寄存器的地址。这种方法是从51单片机过渡到STM32库的基础部分。