历史上的今天
今天是:2024年09月03日(星期二)
2019年09月03日 | STM32库函数之GPIO初始化代码分析
2019-09-03 来源:eefocus
首先我们先看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 复用开漏
史海拾趣
|
VisualAudio设计和开发环境是设计和开发音频系统的新软件,它的实时架构特别适合音频产品的开发.本文简短介绍VisualAudio,然后描述它的构架,音频模块和在音频产品上的应用… 查看全部问答> |
|
PXA270核心板方案: CPU:PXA270 SDRAM:128M FLASH:32M 接口:USB、SDCARD、SERIAL等 LCD+TOUCH:3.5‘ 支持WIFI 方案可提供:SCH + PCB + BOOM + WINCE ...… 查看全部问答> |
|
CoCreateInstance返回:没有注册类别(wince6.0 emulator sdk 中使用msxml) 大家好!我想在Wince的模拟器上使用msxml发送xml文件,代码如下: MSXML2::IXMLHTTPRequest* pIXMLHTTPRequest = NULL; CoInitialize(NULL); HRESULT hr; hr = CoCreateInstance (__uuidof(MSXML2::XMLHTTPRequest), NU ...… 查看全部问答> |
|
我想问下,驱动什么的都弄好了,板上只有一个usb口,我外接了一个四口的USB HUB,接四个摄像头 再在dev文件夹中新建设备文件video0,video1,video2,video3,这四个摄像头能否同时使用啊 我现在只能做到四个来回的切换,想实现一个窗口中同时显示四 ...… 查看全部问答> |
|
请问:拉丁文(西班牙语)是否支持7bit编码方式? 在给客户做一个短信终端,客户要求已7bit编码方式实现拉丁文的短信内容 多谢!… 查看全部问答> |
|
徐家骏:从应届毕业生到年薪千万2009-03-02 14:48从一个应届毕业生,到年薪千万的华为副总裁,再到离开华为转战百度,徐家骏(博客)的十年从业经历和经验对于今年的应届毕业生来说绝对可资借 鉴,我们从中也可以一窥华为公司的运作过程和徐的职 ...… 查看全部问答> |




