STM32库函数之GPIO初始化代码分析
来源:互联网 发布:好看的耽美文知乎 编辑:程序博客网 时间:2024/06/10 04:10
首先我们先看GPIO的寄存器有哪些
1. 端口低配置寄存器 复位值:0x4444 4444
2.端口高配置寄存器 复位值:0x4444 4444
3.端口输入数据寄存器 复位值:0x0000 XXXX
4.端口输出数据寄存器 复位值: 0x0000 0000
5.端口位设置/清除寄存器 复位值: 0x0000 0000
6:端口位清除寄存器 复位值:0x0000 0000
7:端口配置锁定寄存器 复位值: 0x0000 0000
偏移地址从0x00一次加四到0x18
因为是32位寄存器,四个字节,
共七个寄存器
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)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)
通过这样的一段代码就可以将结构体中的七个变量分别指向GPIOC对应的7个寄存器的地址
把GPIOC中的C改为ABCDEFG,就是对应GPIO的端口
再看看GPIO的初始化的代码
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO初始化函数原型是
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
GPIOx用GPIOA,B,C等替代
主要的是GPIO_InitTypeDef这个结构体
typedef struct
{
uint16_t GPIO_Pin;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOMode_TypeDef GPIO_Mode;
}GPIO_InitTypeDef;
#define GPIO_Pin_0 ((uint16_t)0x0001)
#define GPIO_Pin_1 ((uint16_t)0x0002)
#define GPIO_Pin_2 ((uint16_t)0x0004)
#define GPIO_Pin_3 ((uint16_t)0x0008)
#define GPIO_Pin_4 ((uint16_t)0x0010)
#define GPIO_Pin_5 ((uint16_t)0x0020)
#define GPIO_Pin_6 ((uint16_t)0x0040)
#define GPIO_Pin_7 ((uint16_t)0x0080)
#define GPIO_Pin_8 ((uint16_t)0x0100)
#define GPIO_Pin_9 ((uint16_t)0x0200)
#define GPIO_Pin_10 ((uint16_t)0x0400)
#define GPIO_Pin_11 ((uint16_t)0x0800)
#define GPIO_Pin_12 ((uint16_t)0x1000)
#define GPIO_Pin_13 ((uint16_t)0x2000)
#define GPIO_Pin_14 ((uint16_t)0x4000)
#define GPIO_Pin_15 ((uint16_t)0x8000)
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
这里说明一下枚举当第一个参数设置后,后面的参数的值会依次递增
typedef enum
{ GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
不难看出,这些程序最终的目标是给参数一个数值,而参数需要得到这个数值后,通过判断这个参数,把这个数值写到对应的寄存器中,这也就是
GPIO_Init(GPIOC,&GPIO_InitStructure);所做的工作,当然这些数值需要进行一些判断,转化的过程,这个具体的过程在
GPIO初始化函数中具体实现。
总结一下初始代码的实现需要的参数是端口,速率,模式;
端口 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)中的GPIO_TypeDef * GPIOX以及结构体
GPIO_InitStruct中的GPIO_Pin_x,x,0,1,2...
速率 结构体GPIO_InitStructure中的 GPIO_Speed_10MHz GPIO_Speed_2MHz GPIO_Speed_50MHz;
模式 结构体GPIO_InitStructure中的 模拟输入模式 浮空输入模式 上拉/下拉输入模式
通用推挽输出模式 通用开漏输出模式 复用功能推挽输出模式 复用功能开漏输出模式 即
GPIO_Mode_AIN = 0x0, 模拟输入
GPIO_Mode_IN_FLOATING = 0x04, 浮空输入
GPIO_Mode_IPD = 0x28,下拉
GPIO_Mode_IPU = 0x48,上拉
GPIO_Mode_Out_OD = 0x14, 推挽输出
GPIO_Mode_Out_PP = 0x10, 开漏输出
GPIO_Mode_AF_OD = 0x1C, 复用推挽
GPIO_Mode_AF_PP = 0x18 复用开漏
- STM32库函数之GPIO初始化代码分析
- STM32 GPIO初始化步骤
- stm32库函数GPIO_PinRemapConfig分析
- STM32库函数端口初始化说明
- stm32—GPIO操作(库函数)
- STM32之GPIO笔记
- STM32之GPIO
- STM32之GPIO&AFIO
- STM32之GPIO
- STM32之GPIO
- STM32之GPIO输入输出
- stm32之GPIO
- STM32之GPIO
- STM32 入门之 GPIO
- 【读书笔记】STM32之GPIO
- stm32之GPIO
- STM32之GPIO
- STM32 之GPIO
- 二维数组找数
- 使用Python生成PDF格式的文档
- ~~~~~
- Weblogic如何通过JMX监控JDBC资源(数据源)数据
- linux学习总结(1)
- STM32库函数之GPIO初始化代码分析
- 365. Water and Jug Problem
- C语言系列——局部变量和全局变量
- android内存优化
- POJ 1011Sticks【DFS】
- STM32学习--外部中断
- ActiveMQ的消息持久化到Mysql数据库
- ap聚类算法(java实现)
- 10进制转二进制