STM32的GPIO设置

发布者:MysticJourney最新更新时间:2016-09-30 来源: eefocus关键字:STM32  GPIO设置 手机看文章 扫描二维码
随时随地手机看文章
最近刚开始学习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_TypeDef GPIO 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.06 and 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-STM32F中LCDdemo做例子

  这个试验中把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 as output 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);

关键字:STM32  GPIO设置 引用地址:STM32的GPIO设置

上一篇:STM32时钟初始化函数SystemInit()详解
下一篇:STM32 FSMC LCD 液晶的驱动—ILI9320

推荐阅读最新更新时间:2024-03-16 15:12

stm32舵机驱动程序分享
  STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M3内核。按内核架构分为不同产品:   其中STM32F系列有:   STM32F103“增强型”系列   STM32F101“基本型”系列   STM32F105、STM32F107“互联型”系列   增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz,以16位产品的价格得到比16位产品大幅提升的性能,是32位产品用户的最佳选择。两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。时钟频率72MHz时,从闪存执行代码,STM32功耗36mA,相当于0.5mA/MHz。
[单片机]
stm32.cube(五)——HAL.RCC
一、RCC特性 1.1 HIS内部高速时钟 HIS 时钟信号通过一个 8MHz 的 RC 振荡器产生,上电复位时,被自动选做系统时钟。但由于HIS的稳定性较差,受温度、电压等环境参数影响较大,一般只作为备用时钟使用。在芯片初始化的startup.s里,通常会调用一个c编写的函数system_init(),里面会将系统时钟源从HIS设置成HSE。 1.2 HSE外部高速时钟 由晶振或者外部时钟源提供的时钟,较为稳定。 1.3 PLL PLL可用于将 HIS RC 振荡器的输出时钟频率倍频,具体的原理要参考锁相环电路的相关知识。 1.4 LSE外部低速时钟 LSE 振荡器是一个 32.768kHz 的低速外部晶体或者陶瓷共振器
[单片机]
一文教会你STM32使用内部振荡器及其和外部晶体振荡器的区别和STM32L031性能分析和比较
在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出‘0’。此方法可以减小功耗并(相对上面 首先要明确的是STM32没有内部晶振,HSI是内部RC振荡器。 HSI内部8MHz的RC振荡器的误差在1%左右 内部RC振荡器的精度通常比用HSE(外部晶振
[单片机]
一文教会你<font color='red'>STM32</font>使用内部振荡器及其和外部晶体振荡器的区别和STM32L031性能分析和比较
有关STM32外设配置的几个常见问题
在做STM32开发应用的过程中,常常会遇到这样那样的问题,其中相当部分问题是与各外设及相关GPIO的配置有关的。就这方面的问题,这里一起总结交流下。 目前的STM32芯片是基于ARM内核的可编程微处理器,我们可以简单地把内核以外的东西统称为外设,比方 TIMER、UART、SPI、USB、I2C、存储器等功能模块。以32F427芯片功能框图为例,那些红圈上的都是。 好,我们直接切入主题。围绕外设的配置,我们遇到的问题,大致可以分为两大类。 一、时钟问题,就这方面的问题又可以细分为几小点。 1.1 时钟没打开就使用。 这个不难理解,就是相关外设的时钟没有打开。比如UART5的时钟没有打开,SPI的时钟没打开
[单片机]
有关<font color='red'>STM32</font>外设配置的几个常见问题
STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 ▲驱动流程 01、使用FSMC驱动LCD 关于FSMC,把数据写入相应的地址,FSMC就会把地址从FSMC_A出去,写入的数据会会从FSMC_D发出去。至于片选等信号线都是自动的。读的话,直接读相应的地址,就会拿到改地址上的数据。 FSMC驱动外部SRAM时,外部SRAM的控制一般有: 地址线(如A0~A25) 数据线(如D0~D15) 写信号(WE,即WR) 读信号(OE,即
[单片机]
<font color='red'>STM32</font>驱动LCD原理
一个关于STM32 CAN出错恢复的话题
最近有个STM32 用户咨询: 最近在使用stm32f105做双can通信,can驱动芯片使用的TJA1042,发现将canH canL 短路再放开以后,can出错恢复不回来?之前在K40上使用的时候没有这个问题,不知道这个情况大家有什么指导建议啊? 另外,他还附上了基于STM32CUBEMX工具配置的相关代码如下: hcan1.Instance = CAN1; hcan1.Init.Prescaler = 2; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SJW = CAN_SJW_1TQ; hcan1.Init.BS1 = CAN_BS1_8TQ; hc
[单片机]
一个关于<font color='red'>STM32</font> CAN出错恢复的话题
单片机stm32你了解多少
stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm32的视频资料便于学习参考。 什么是串口 UART : Universal Asynchronous Receiver/Transmitter 通用异步收发器 USART : Universal Synchronous Asynchronous Receiver/Transmitter 通用同步/异步收发器 一种是常用也是最简单的串行数据传输协议。数据线只需要两根就可以实现全双工。 Tx: 发送数据线 Rx: 接收数据线 A B TX
[单片机]
STM32中电源各引脚说明分析
一、数字电路中,电源符号 VCC:C=circuit,表示电路的意思,即接入电路的电压; VDD:D=Device,表示器件的意思,即器件的工作电压; VSS:S=Series,表示公共连接的意思,通常指电路公共接地端电压。 总结来说,VCC接电路的电源(±),VSS接电路的地,VDD接器件的电源引脚(±)。 二、STM32中电源各引脚说明 VDDA:A=Analog,表示模拟的意思,所以就是表示模拟器件的工作电压; VSSA:表示模拟器件的公共端地。 VBAT:给后备区域供电,维持包括RTC/BKP寄存器等在内的一些数据的保存。 100引脚的封装中: VREF-:A/D的参考,当需要使用时,必须绑定到VSSA(使得所有模拟器
[单片机]
<font color='red'>STM32</font>中电源各引脚说明分析
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved