目录[Todo]
程序存储器、数据存储器、寄存器和I/O端口排列在同一顺序的4GB地址空间内。
如图所示,可将存储器空间划分为:
序号 | 用途 | 地址范围 |
---|---|---|
Block 0 | SRAM(FLASH) | 0x0000 0000 ~ 0x1FFF FFFF (512MB) |
Block 1 | SRAM | 0x2000 0000 ~ 0x3FFF FFFF (512MB) |
Block 2 | On-chip peripherals(片上外设) | 0x4000 0000 ~ 0x5FFF FFFF (512MB) |
Block 3 | FSMC的bank1~bank2 | 0x6000 0000 ~ 0x7FFF FFFF (512MB) |
Block 4 | FSMC的bank3~bank4 | 0x8000 0000 ~ 0x9FFF FFFF (512MB) |
Block 5 | FSMC REGISTERS(FSMC寄存器) | 0xA000 0000 ~ 0xBFFF FFFF (512MB) |
Block 6 | NOT USED | 0xC000 0000 ~ 0xDFFF FFFF (512MB) |
Block 7 | Cortex-M4 internal peripherals(Cortex-M4 内部外设) | 0xE000 0000 ~ 0xFFF FFFF (512MB) |
片上外设分为四条总线:AHB1、AHB2、APB1、APB2;外设一般挂载在其上,外设地址由:基地址+偏移量构成,查看外设地址:
- STM32F4xx中文参考手册 :查看外设一般地址,P52
- STM32F4xx中文参考手册 :查看各外设控制寄存器,见目录
例如,对STM32的GPIO口进行置位操作:
- 封装总线和外设基地址
//定义外设基地址
#define PERIPH_BASE ((unsigned int)0x40000000)
//定义总线基地址
#define APB1PERIPH_BASE PERIPH_BASE
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000)
//定义GPIO 外设基地址
#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)
#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)
#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)
#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000)
#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)
#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800)
#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00)
//定义寄存器基地址这里以GPIOF 为例
#define GPIOF_MODER (GPIOF_BASE+0x00)
#define GPIOF_OTYPER (GPIOF_BASE+0x04)
#define GPIOF_OSPEEDR (GPIOF_BASE+0x08)
#define GPIOF_PUPDR (GPIOF_BASE+0x0C)
#define GPIOF_IDR (GPIOF_BASE+0x10)
#define GPIOF_ODR (GPIOF_BASE+0x14)
#define GPIOF_BSRR (GPIOF_BASE+0x18)
#define GPIOF_LCKR (GPIOF_BASE+0x1C)
#define GPIOF_AFRL (GPIOF_BASE+0x20)
#define GPIOF_AFRH (GPIOF_BASE+0x24)
- 控制GPIOF引脚的输出
//控制GPIOF 第9 管脚输出一个低电平
*(unsigned int *)GPIOF_BSRR = (0x01<<(16+9));
//控制GPIOF 第9 管脚输出一个高电平
*(unsigned int *)GPIOF_BSRR = (0x01<<9);
- 用结构体封装一类寄存器
typedef unsigned int uint32_t; /*无符号32 位变量*/
typedef unsigned short int uint16_t; /*无符号16 位变量*/
/* GPIO 寄存器列表*/
typedef struct
{
uint32_t MODER; /*GPIO 模式寄存器地址偏移: 0x00 */
uint32_t OTYPER; /*GPIO 输出类型寄存器地址偏移: 0x04 */
uint32_t OSPEEDR; /*GPIO 输出速度寄存器地址偏移: 0x08 */
uint32_t PUPDR; /*GPIO 上拉/下拉寄存器地址偏移: 0x0C */
uint32_t IDR; /*GPIO 输入数据寄存器地址偏移: 0x10 */
uint32_t ODR; /*GPIO 输出数据寄存器地址偏移: 0x14 */
uint16_t BSRRL; /*GPIO 置位/复位寄存器低16 位部分地址偏移: 0x18 */
uint16_t BSRRH; /*GPIO 置位/复位寄存器高16 位部分地址偏移: 0x1A */
uint32_t LCKR; /*GPIO 配置锁定寄存器地址偏移: 0x1C */
uint32_t AFR[2]; /*GPIO 复用功能配置寄存器地址偏移: 0x20-0x24 */
}GPIO_TypeDef;
从官网获得标准库开发:STM32标准外设软件库
CMSIS:Cortex MicroController Software Interface Standard,ARM Cortex微控制器软件标准。
CMSIS包含:
- 核内外设访问层:定义处理器内部寄存器地址以及功能函数。
- 中间件外设访问层:定义访问中间件的通用API
- 外设访问层:定义硬件寄存器的地址以及外设的访问函数
一个标准的固件库工程应该包含:
查看库函数API接口函数: STM32F4xx固件库手册
创建: STM32F4XX_Template,根据编译器选择启动文件及内核文件
D:.
├─Libraries
│ ├─CMSIS
│ │ ├─core
│ │ └─device
│ │ ├─inc
│ │ └─src
│ │ ├─arm
│ │ ├─gcc_ride7
│ │ └─iar
│ └─STM32F4xx_StdPeriph_Driver
│ ├─inc
│ └─src
├─Obj
└─User