楼主一直是一个实用主义者(虽然还是菜鸟一个),所以我们就不啰嗦了,直接从使用开始,具体的GPIO的各种属性,输入输出的配置等请自行查看相关资料。
我们打开一个ST官方库文件中的GPIO例子,(打开方法参考我的博客中的《如何使用ST官方库文件中的例子程序》一文)
《如何使用ST官方库文件中的例子程序》连接地址:
http://blog.csdn.net/thebestleo/article/details/44155611
我们剪辑出其中的重要程序部分,为了清晰,我删除了其中的一些英文注释,下面还会增加一下中文的注释
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
while (1)
{
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
}
}
程序中while循环里使用了寄存器的方式来完成GPIO的操作,这里我们来改一下,全部用库文件的方式来完成,这里我们不考虑外围设备的状态(如LED灯的状态取决于硬件电路与STM32之间的连接,才能知道STM32输出高低电平后LED的亮灭),只考虑GPIO管脚的输出状态(0或者1)
此程序应该是一个双灯闪烁实验,在实际应用中应该加上一个延时程序,这里我们只介绍一下用法,所以不必过分纠结,此处我们只留一组寄存器操作代码作为对比
注解:程序中我习惯用//来注释一句程序,用/* */来注释下面的一段程序
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure; //定义一个GPIO_InitTypeDef类型的结构体
int main(void)
{
/* 1、初始化GPIO */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // 使能GPIOD的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2; // 配置所用到的管脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置所用到的管脚的输入输出模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置所用到的管脚的速度
// 将GPIOD和GPIO_InitStructure结构体的首地址作为参数传递给GPIO初始化函数GPIO_Init
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* 2、操作GPIO */
while (1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_0); // D端口,0管脚置1
GPIO_SetBits(GPIOD,GPIO_Pin_2); // D端口,2管脚置1
GPIO_ResetBits(GPIOD,GPIO_Pin_0); // D端口,0管脚置0
GPIO_ResetBits(GPIOD,GPIO_Pin_2); // D端口,0管脚置0
/* Set PD0 and PD2 */
GPIOD->BSRR = 0x00000005;
/* Reset PD0 and PD2 */
GPIOD->BRR = 0x00000005;
}
}
分析上面的程序我们可以得出如下结论:GPIO的操作一共分为2步
1、对所用的GPIO进行初始化设置,初始化又分为3个步骤,
1)、使能GPIOD的时钟
2)、填充GPIO的属性结构体
3)、传递参数至初始化函数
2、对GPIO进行操作