日期:2025/04/07 13:21来源:未知 人气:53
本文通过介绍GPIO寄存器,介绍寄存器编程方法,实现与前一章库函数编程类似的控制功能。 本系列源码地址: https://gitee.com/xundh/stm32_arm_learn
STM32 的4G地址空间以512M为单位划分为8个地址区域:
以下是8个区域每个区域的功能描述:
block 0 是Flash的第一块,它是Flash存储器的重要部分,主要有以下作用:
block1 也是Flash存储器的区块,用来设计片内SRAM。
通常用于存储片内外设的配置信息、参数设置 以及其它相关数据,这是寄存器编程控制外设的重点,下表是STM32外设空间映射表:
用于配置和设置外部存储器接口FSMC(Flexible Static Memory Controller)。
也是用于FSMC。
预留 。
ARM内部使用。
在STM32微控制器中,APB(Advanced Peripheral Bus)是一种总线结构,用于连接微控制器内部的外设。STM32微控制器通常具有两个或多个APB总线,包括APB1、APB2等。这些总线的作用是连接微控制器的核心部件(如CPU、存储器等)与外设之间,以实现外设的控制和数据传输。
AHB(Advanced High-performance Bus)总线是STM32微控制器中的一种高性能总线,通常有更高的带宽和速度。 AHB总线被分为主AHB总线和备用AHB总线。
AHB的外设从前表的 SDIO~CRC。
寄存器映射是一种将硬件设备内部的控制寄存器映射到处理器的内存地址空间中的技术(即对内存单元取一个别名),使得处理器可以通过读写这些特定的内存地址来控制和配置硬件设备的功能和参数。 寄存器映射使用#define。
位带操作是一种针对特定位进行操作的技术,它可以在单条指令中对某个位进行设置、清除或者翻转,从而实现对寄存器中的单个位的操作,而不影响寄存器中的其他位。
假设找GPIOC的第 0 管脚 , 首先,要通过手册知道GPIOC挂在APB2上,总线的基地址如下:
C定义:
// 外设基地址#define PERIPH_BASE ((unsigned int)0x40000000)// APB2 总线基地址#define APB2PERIPH_BASE ((PERIPH_BASE + 0x00010000)
0x4001 1000~ 0x4001 13FF
C 定义:
在 stm32f10x.h 里可以找到它的定义:
GPIOC的寄存器偏移根据手册查询:
C 定义:
typedef struct{ IO uint32_t CRL; __IO uint32_t CRH; IO uint32_t IDR; IO uint32_t ODR; __IO uint32_t BSRR; IO uint32_t BRR; __IO uint32_t LCKR;} GPIO_TypeDef;#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
这样使用 GPIOC->CRL 就可以操作对应的寄存器。
根据前一章的介绍,GPIO的CRL和 CRH是工作模式寄存器。如果要设置推挽输出,可以使用:
GPIOC->CRL = 0x33333333; // 配置低八位引脚为推挽输出模式 GPIOC->CRH = 0x33333333; // 配置高八位引脚为推挽输出模式
在 STM32 中,每个外设都需要时钟信号来工作,在使用外设之前需要先打开对应外设的时钟。
RCC 寄存器中的 RCC_APB2ENR 用于控制 APB2 总线上的外设时钟使能。寄存器编程时,使用宏定义:RCC_APB2ENR_IOPCEN 用来让 GPIOC 的时钟使能位,它对应于 RCC_APB2ENR 寄存器中的 GPIOC 时钟使能位。
以下是 RCC_APB2ENR 寄存器中常用的一些位定义:
编程时,使用 |= 运算符把相应位置为 1,如:RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;。