Skip to content

lancitx/STM32

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

STM32开发

目录[Todo]


1. 寄存器开发

程序存储器数据存储器寄存器I/O端口排列在同一顺序的4GB地址空间内。

memory_map

如图所示,可将存储器空间划分为:

序号 用途 地址范围
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;外设一般挂载在其上,外设地址由:基地址+偏移量构成,查看外设地址:

例如,对STM32的GPIO口进行置位操作:

  1. 封装总线和外设基地址
//定义外设基地址
#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)
  1. 控制GPIOF引脚的输出
//控制GPIOF 第9 管脚输出一个低电平
*(unsigned int *)GPIOF_BSRR = (0x01<<(16+9));
//控制GPIOF 第9 管脚输出一个高电平
*(unsigned int *)GPIOF_BSRR = (0x01<<9);
  1. 用结构体封装一类寄存器
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;

2. 标准库开发

2.1 CMSIS标准

从官网获得标准库开发:STM32标准外设软件库

CMSIS:Cortex MicroController Software Interface Standard,ARM Cortex微控制器软件标准

CMSIS包含:

  • 核内外设访问层:定义处理器内部寄存器地址以及功能函数。
  • 中间件外设访问层:定义访问中间件的通用API
  • 外设访问层:定义硬件寄存器的地址以及外设的访问函数

一个标准的固件库工程应该包含:

keil5-project

查看库函数API接口函数: STM32F4xx固件库手册

chm-function


2.2 创建标准库模板

创建: STM32F4XX_Template,根据编译器选择启动文件及内核文件

D:.
├─Libraries
│  ├─CMSIS
│  │  ├─core
│  │  └─device
│  │      ├─inc
│  │      └─src
│  │          ├─arm
│  │          ├─gcc_ride7
│  │          └─iar
│  └─STM32F4xx_StdPeriph_Driver
│      ├─inc
│      └─src
├─Obj
└─User

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published