构建库函数(STM32)

本文介绍了STM32中GPIO和RCC外设的基地址定义,详细阐述了GPIO结构体和RCC寄存器的使用方法,包括如何配置GPIO引脚、启用时钟并进行低电平输出。通过实例展示了GPIO初始化、工作模式设置和端口操作的库函数实现。
摘要由CSDN通过智能技术生成

一、定义外设的各基地址,参考存储器映射

// 由存储器的映射可知,片上外设基地址0x4000 0000
#define PERIPH_BASE ((unsigned int)0x4000000)

// APB2 总线的基地址
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)

// AHB 总线基地址 
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)

// GPIO 外设基地址,由系统框图可知,GPIO挂靠在APB2总线上
#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 GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)

// RCC 外设基地址 在AHB总线上
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
F103系统框图

在这里插入图片描述

F103存储器映射

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、定义GPIO与RCC寄存器结构体

#define __IO volatile             //volatile 表示易变的变量,防止编译器的优化
typedef unsigned int uint32_t     //一个int型可看做四个字节,32位
typedef unsigned short uint16_t

// 定义GPIO寄存器结构体
typedef struct{
   
  __IO uint32_t CRL;   // 端口配置低寄存器, 地址偏移 0X00
  __IO uint32_t CRH;   // 端口配置高寄存器, 地址偏移 0X04
  __IO uint32_t IDR;   // 端口数据输入寄存器, 地址偏移 0X08
  __IO uint32_t ODR;   // 端口数据输出寄存器, 地址偏移 0X0C
  __IO uint32_t BSRR;  // 端口位设置/清除寄存器,地址偏移 0X10
  __IO uint32_t BRR;   // 端口位清除寄存器, 地址偏移 0X14
  __IO uint32_t LCKR;  // 端口配置锁定寄存器, 地址偏移 0X18
}GPIO_typeDef;

// 定义时钟CRR结构体
typedef struct{
   
    __IO uint32_t CR;          // 时钟控制寄存器, 地址偏移 0X00
    __IO uint32_t CFGR;        // 时钟配置寄存器, 地址偏移 0X04
    __IO uint32_t CIR;         // 时钟中断寄存器, 地址偏移 0X08
    __IO uint32_t APB2RSTR;    // APB2外设复位寄存器,地址偏移 0X0C
    __IO uint32_t APB1RSTR;    // APB1外设复位寄存器,地址偏移 0X10
    __IO uint32_t AHBENR;      // AHB外设时钟使能寄存器,地址偏移 0X14
    __IO uint32_t APR2ENR;     // APB2外设时钟使能寄存器,地址偏移 0X18
    __IO uint32_t ApR1ENR:     //APB1外设时钟使能寄存器, 地址偏移 0X1C
    __IO uint32_t BDCR;        //备份域控制寄存器, 地址偏移 0X20
    __IO uint32_t CSR;         //控制/状态寄存器, 地址偏移 0X24
}RCC_TypeDef;

在stm32中,程序的存储器,数据存储器,寄存器和输入输出端口被组织在一个4GB(4294967296)的线性空间中,即从地址0x0000 0000 到 地址0xFFFF FFFF。且被分为8个block。一个block的大小为512MB,注意,这里的存储单位是一个字节。而GPIO中一个寄存器的存储空间是4个字节,上面的七个寄存器的存储空间是连续的。一个uint32_t刚好也为4个字节。因此只需要给结构体传入GPIO的基地址即可。

// GPIOA_BASE只是一串数字,将它转换成GPIO_TypeDef类型指针

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值