打印
[开发工具]

STM32学习之GPIO端口篇

[复制链接]
3171|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
energy1|  楼主 | 2015-3-27 00:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datasheet上对GPIO口的简单介绍:
每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器(GPIOx_LCKR)。
   GPIO 端口的每个位可以由软件分别配置成多种模式。每个I/O 端口位可以自由编程,然而I/0 端口寄存器必须按32 位字被访问(不允许半字或字节访问)。GPIOx_BSRR 和GPIOx_BRR 寄存器允许对任何GPIO 寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ 时不会发生危险。
    端口位配置 CNFx[1:0]=xxb,MODEx[1:0]=xxb
再看GPIO功能很强大:
1.通用I/O(GPIO):最最基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;
2.单独的位设置或位清除:方便软体作业,程序简单。端口配置好以后只需GPIO_SetBits(GPIOx,GPIO_Pin_x)就可以实现对GPIOx的pinx位为高电平;
3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;
4.复用功能(AF):复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式:(CNFx[1:0]=01b,MODEx[1:0]=00b)。
5.软件重新映射I/O复用功能:为了使不同器件封装的外设I/O 功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了;
6.GPIO锁定机制:主要针对复位设定的,当某端口位lock后,复位后将不改变的此端口的位配置。
GPIO基本设置
GPIOMode_TypeDefGPIO mode定义及偏移地址
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    //推挽复用
GPIO输入输出速度选择:
typedef enum
{
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz,
  GPIO_Speed_50MHz
}
GPIOSpeed_TypeDef;
#define IS_GPIO_SPEED(SPEED) ((SPEED ==GPIO_Speed_10MHz) || (SPEED == GPIO_Speed_2MHz) ||  (SPEED ==GPIO_Speed_50MHz))
做一个GPIO输出的试验
当I/O 端口被配置为推挽模式输出时:输出寄存器上的0 激活N-MOS,而输出寄存器上的1 将激活P-MOS。
用这段程序实现:GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
int main(void)
{
#ifdef DEBUG
  debug();
#endif
  /* 设置系统时钟 */
  RCC_Configuration();
   
  /* 嵌套中断设置*/
  NVIC_Configuration();
  /* 激活GPIOC clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  
  /* Configure PC.04, PC.05, PC.06and PC.07 as Output push-pull */
  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC,&GPIO_InitStructure);
  while (1)
  {
    /*本试验仅能实现LED1亮、熄功能*/
    GPIO_SetBits(GPIOC,GPIO_Pin_4); //设置PC.04 pin为高电平,点亮LED1
    Delay();
    GPIO_ResetBits(GPIOC,GPIO_Pin_4); //设置PC.04 pin为低电平,熄灭LED1
    Delay();
  }
}
做一个GPIO输入的试验:以EK-STM32FLCDdemo做例子
  这个试验中把GPIO的PD.04做为按键输入,当下降沿来临时触发。
LCDdemo中的例程如下:首先配置按键PD.03, PD.04为按键输入接口。
void Button_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
  /* Enable GPIOD clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
  /* Configure PD.03, PD.04 asoutput push-pull */
  GPIO_InitStructure.GPIO_Pin=  GPIO_Pin_3 | GPIO_Pin_4 ;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD,&GPIO_InitStructure);
}
下面为按键作用是启动外部中断
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource3);
  
  EXTI_InitStructure.EXTI_Line =EXTI_Line3;           //设定外部中断3
  EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;  //设定中断模式
  EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling; //设定下降沿触发模式
  EXTI_InitStructure.EXTI_LineCmd =ENABLE;
EXTI_Init(&EXTI_InitStructure);

沙发
powerful1| | 2015-3-27 00:30 | 只看该作者
最基本的GPIO

使用特权

评论回复
板凳
Vitality1| | 2015-3-27 00:42 | 只看该作者
GPIO功能很强大

使用特权

评论回复
地板
xiaolijun3420| | 2015-3-27 13:34 | 只看该作者
最基本的GPIO,经常要用到的

使用特权

评论回复
5
秋风式街球| | 2015-3-27 14:52 | 只看该作者
谢谢分享

使用特权

评论回复
6
tnc| | 2015-4-23 19:31 | 只看该作者
新人学习!

使用特权

评论回复
7
734774645| | 2015-4-23 23:13 | 只看该作者
端口位配置 CNFx[1:0]=xxb,MODEx[1:0]=xxb
好难理解。

使用特权

评论回复
8
yinhaix| | 2015-5-6 11:14 | 只看该作者
最基本的GPIO,经常要用到的

使用特权

评论回复
9
desertsailor| | 2015-5-6 11:30 | 只看该作者
这是F1的GPIO,F0的GPIO重新设计了

使用特权

评论回复
10
myxiexing| | 2015-5-6 23:15 | 只看该作者
确实强大...

使用特权

评论回复
11
shuiqinghan2012| | 2015-12-28 13:40 | 只看该作者
  GPIO_Mode_IPD =0x28,    //下拉输入
  GPIO_Mode_IPU =0x48,    //上拉输入

能否讲解一下上面两句中0x28和0x48是怎么来的,我看了半天 寄存器,还是算不出来

使用特权

评论回复
12
稳稳の幸福| | 2015-12-28 16:09 | 只看该作者
GPIO细分的话好像是有八种模式可以选择,常用的应该有4种。

使用特权

评论回复
13
木林森1| | 2016-9-5 15:24 | 只看该作者
稳稳の幸福 发表于 2015-12-28 16:09
GPIO细分的话好像是有八种模式可以选择,常用的应该有4种。

常用是三种,刚看到的

使用特权

评论回复
14
稳稳の幸福| | 2016-9-5 20:26 | 只看该作者
木林森1 发表于 2016-9-5 15:24
常用是三种,刚看到的

噢,应该是,我是看了手册说的,估计用的多的就三种吧。

使用特权

评论回复
15
sandman_guan| | 2016-9-8 13:14 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

94

主题

422

帖子

10

粉丝