目录
前言
存储器本身没有地址,给存储器分配地址的过程叫存储器映射。在存储器 Block2 这块区域,设计的是片上外设,它们以四个字节为一个单元,共32bit,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。寄存器按位操作有比较好的可读性和扩展性。
一、GPIO是什么?
GPIO是stm32的外设,是通用输入输出端口的总称,简单来说就是STM32可控制的引脚,其基本功能是控制引脚输出高电平或者低电平。
1.1GPIO的寄存器地址
GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节, 在该外设的基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。例如GPIO的端口寄存器的地址表:
寄存器名称 | 寄存器地址 | 相对GPIOB地址的偏移 |
GPIOB_CRL | 0x4001 0c00 | 0x00 |
GPIOB_CRH | 0x4001 0c04 | 0x04 |
GPIOB_IDR | 0x4001 0c08 | 0x08 |
GPIOB_ODR | 0x4001 0c0c | 0x0c |
GPIOB_BSRR | 0x4001 0c10 | 0x10 |
GPIOB_BRR | 0x4001 0c14 | 0x14 |
GPIOB_LCKR | 0x4001 0c18 | 0x18 |
1.2GPIO的工作模式
输入模式
-输入浮空(GPIO_Mode_IN_FLOATING)
-输入上拉(GPIO_Mode_IPU)
-输入下拉(GPIO_Mode_IPD)
-模拟输入(GPIO_Mode_AIN)
输出模式
-开漏输出(GPIO_Mode_Out_OD)
-开漏复用功能(GPIO_Mode_AF_OD)
-推挽式输出(GPIO_Mode_Out_PP)
-推挽式复用功能(GPIO_Mode_AF_PP)
二、STM32F103芯片的地址映射和存储器映射原理
内存映射:事实并非如此,一般的外设为了加快处理速度都有自己的片内RAM(比如说显存,你也知道显存对显卡性能的重要性),分出去的地址空间也就与片内RAM物理连接起来,这样CPU就能像访问内存一样去访问外设的片内RAM,这也就是所谓的内存映射
存储器映射原理:在存储器的区域单元中,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射
三、c语言进行流水灯点灯
1.创建工程
选择STM32F103C8芯片:
添加文件:
不要忘记点击魔法棒勾选生成HEX文件: