您的位置:首页 > 其它

STM32 GPIO 的配置与使用

2013-01-23 15:07 169 查看
最近正在学习STM32,之前一直在用51和AVR单片机,都是八位机,第一次接触32位机,虽然是第一次接触但是根据经验无外乎就是那些东西,配置寄存器,驱动单片机工作。STM32的寄存器相比于51和avr来说可以说不是一个数量级上,由于太多,所以刚开始接触的时候对它的配置并不能得心应手,但是ST公司想到的了这点,他们自己做了一个库,在这个库中把各个寄存器都配置好了,并且做好了各种API函数,用户调用库中的函数,并且配置到相应的各个参数就可以快速的完成对STM32的配置,这样不仅降低了STM32的学习门槛还降低了它的开发成本。

学习一款单片机首先要从点灯开始:

STM32的GPIO(输入输出I/O)有八种配置模式对应定义在头文件中:

GPIO_Mode_AIN 模拟输入

GPIO_Mode_IN_FLOATING 浮空输入

GPIO_Mode_IPD 下拉输入

GPIO_Mode_IPU上拉输入

GPIO_Mode_Out_OD 开漏输出

GPIO_Mode_Out_PP 推挽输出

GPIO_Mode_AF_OD 复用开漏输出

GPIO_Mode_AF_PP 复用推挽输出

对GPIO 的配置主要分成以下几个步骤:

①配置GPIO的始终使能

②配置GPIO的输入输出模式

③选择引脚

④配置GPIO的翻转速率(输出时考虑,输入不用考虑)

⑤初始化以上四步 GPIO_Init()

其中ST已经讲②③④封装在 GPIO_InitTypeDef 结构体中了,在使用时我们只需要调用这个结构体就行了

View Code

/*
*copyright(c) 2013.01.17
*All rights reserved
*
*文件名称:STM32_LED
*当前版本:1.0
*作者: 郑春雨
*邮箱地址:zhengchunyu_1989@sina.com
*完成日期:2013/01/17
*/
#include "stm32f10x.h"

#define RCC_KEY1 RCC_APB2Periph_GPIOA
#define KEY1     GPIO_Pin_0
#define RCC_KEY2 RCC_APB2Periph_GPIOC
#define KEY2     GPIO_Pin_13
#define RCC_KEY3 RCC_APB2Periph_GPIOA
#define KEY3     GPIO_Pin_8
#define RCC_KEY4 RCC_APB2Periph_GPIOD
#define KEY4     GPIO_Pin_3

GPIO_InitTypeDef  GPIO_InitStructure;//定义结构体,GPIO的配置信息
void delay(void)
{
u16 count,t;
for(count=0;count<10000;count++)
{
for(t=0;t<1000;t++);
}
}
void init_Periph_Config(void)
{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能GPIO时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置端口输出模式输出推挽
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
GPIO_Init(GPIOF,&GPIO_InitStructure);//初始化GPIO

/*KEY1*/
RCC_APB2PeriphClockCmd(RCC_KEY1,ENABLE);//使能KEY1时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
GPIO_InitStructure.GPIO_Pin = KEY1;//选择引脚
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO

/*KEY2*/
RCC_APB2PeriphClockCmd(RCC_KEY2,ENABLE);//使能GPIO时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
GPIO_InitStructure.GPIO_Pin = KEY2;//选择引脚
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIO

/*KEY3*/
RCC_APB2PeriphClockCmd(RCC_KEY3,ENABLE);//使能GPIO时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
GPIO_InitStructure.GPIO_Pin = KEY3;//选择引脚
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO

/*KEY4*/
RCC_APB2PeriphClockCmd(RCC_KEY4,ENABLE);//使能GPIO时钟
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//配置端口输入上拉
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择引脚
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//配置速率
GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化GPIO
}

int main(void)
{

init_Periph_Config();
GPIO_ResetBits(GPIOF,GPIO_Pin_All);//点亮4个LED
while(1)
{
if(!GPIO_ReadInputDataBit(GPIOA,KEY1))    //按键1按下
{

GPIO_SetBits(GPIOF,GPIO_Pin_6);//LED1灭
}
else GPIO_ResetBits(GPIOF,GPIO_Pin_6);//LED1亮

if(!GPIO_ReadInputDataBit(GPIOC,KEY2))    //按键2按下
{
GPIO_SetBits(GPIOF,GPIO_Pin_7);    //LED2灭
}
else GPIO_ResetBits(GPIOF,GPIO_Pin_7);//LED2亮

if(!GPIO_ReadInputDataBit(GPIOA,KEY3))    //按键3按下
{
GPIO_SetBits(GPIOF,GPIO_Pin_8);    //LED3灭
}
else GPIO_ResetBits(GPIOF,GPIO_Pin_8);//LED3亮
if(!GPIO_ReadInputDataBit(GPIOD,KEY4))    //按键4按下
{
GPIO_SetBits(GPIOF,GPIO_Pin_9);        //    LED4灭
}
else GPIO_ResetBits(GPIOF,GPIO_Pin_9);// LED4亮
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: