STM32 GPIO应用笔记

发布者:等风来88888最新更新时间:2015-10-09 来源: eefocus关键字:STM32  GPIO  应用笔记 手机看文章 扫描二维码
随时随地手机看文章
          STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出)

① 浮空输入_IN_FLOATING

② 带上拉输入_IPU  

③ 带下拉输入_IPD           

④ 模拟输入_AIN
⑤ 开漏输出_OUT_OD     

⑥ 推挽输出_OUT_PP

⑦ 复用功能的推挽输出_AF_PP 

⑧ 复用功能的开漏输出_AF_OD

1.1         I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。

关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。比如:

1.1.1       对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。

1.1.2       对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。

1.1.3       对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。

1.2         GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。

1.3         在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。

1.4         所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。

1.5         GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
 

          在STM32中如何配置片内外设使用的IO端口

首先,一个外设经过 ①配置输入的时钟和 ②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。

对应到外设的输入输出功能有下述三种情况:
一、外设对应的管脚为输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏输出。
二、外设对应的管脚为输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。
三、ADC对应的管脚:配置管脚为模拟输入。

如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。将管脚配置成复用输出功能后,如果外设没有被激活,那么它的输出将不确定。

 

          通用IO端口(GPIO)初始化:

3.1            GPIO初始化

3.1.1       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | B | C, ENABLE):使能APB2总线外设时钟

3.1.2       RCC_ APB2PeriphResetCmd (RCC_APB2Periph_GPIOA | B | C, DISABLE):释放GPIO复位

3.2            配置各个PIN端口(模拟输入_AIN、输入浮空_IN_FLOATING、输入上拉_IPU、输入下拉_IPD、开漏输出_OUT_OD、推挽式输出_OUT_PP、推挽式复用输出_AF_PP、开漏复用输出_AF_OD)

3.3            GPIO初始化完成

 

 

 

 

 

 

 

下面我就在做个抛砖引玉,根据ST手册上的内容,简单地综述一下GPIO的功能:
一、共有8种模式,可以通过编程选择:
  1. 浮空输入
  2. 带上拉输入
  3. 带下拉输入
  4. 模拟输入
  5. 开漏输出——(此模式可实现hotpower说的真双向IO)
  6. 推挽输出
  7. 复用功能的推挽输出
  8. 复用功能的开漏输出
模式7和模式8需根据具体的复用功能决定。

二、专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。

三、每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。

四、I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。

五、所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。

六、大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。

七、具有独立的唤醒I/O口。

八、很多I/O口的复用功能可以重新映射。

九、GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。

 

 

STM32第一个例子

/
#include "stm32f10x_lib.h"


GPIO_InitTypeDef GPIO_InitStructure;

void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);

}[page]

void LED_TurnOn(u8 led)
{
  
}

void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}

main()
{

//RCC_Configuration();
LED_Init();

while(1)
{
   GPIO_SetBits(GPIOC, GPIO_Pin_9);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_9);
   Delay(0x8ffff);
   GPIO_SetBits(GPIOC, GPIO_Pin_10);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_10);
   Delay(0x8ffff);
   GPIO_SetBits(GPIOC, GPIO_Pin_11);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_11);
   Delay(0x8ffff);
   GPIO_SetBits(GPIOC, GPIO_Pin_12);
   Delay(0x8ffff);
   GPIO_ResetBits(GPIOC, GPIO_Pin_12);
   Delay(0x8ffff);
}
}
注意:在这里用到了RCC和GPIO的库函数,所以必须把这两个函数加入工程。
  
关于固件库函数在文件夹:C:/Keil/ARM/RV31/LIB/ST/STM32F10x 
为了不在操作过程中避免改变KEIL文件夹下的库函数,可以固件函数库放到其他文件夹下,如:E:/jy/work/STM/WxlStm32/LAB/library
其中stm32f10x_lib.c文件是整个库的一些定义,是必须要的。
加入后的工程为:

GPIO库函数简单说明:
函数名称 功能描述
GPIO_DeInit 重新初始化外围设备GPIOx相关寄存器到它的默认复位值
GPIO_AFIODeInit 初始化交错功能(remap, event control和 EXTI 配置) 寄存器
GPIO_Init 根据GPIO_初始化结构指定的元素初始化外围设备GPIOx
GPIO_StructInit 填充GPIO_初始化结构(GPIO_InitStruct)内的元素为复位值
GPIO_ReadInputDataBit 读指定端口引脚输入数据
GPIO_ReadInputData 读指定端口输入数据
GPIO_ReadOtputDataBit 读指定端口引脚输出数据
GPIO_ReadOtputData 读指定端口输出数据
GPIO_SetBits 置1指定的端口引脚
GPIO_ResetBits 清0指定的端口引脚
GPIO_WriteBit 设置或清除选择的数据端口引脚
GPIO_Write 写指定数据到GPIOx端口寄存器
GPIO_ANAPinConfig 允许或禁止 GPIO 4 模拟输入模式
GPIO_PinLockConfig 锁定GPIO引脚寄存器
GPIO_EventOutputConfig 选择GPIO引脚作为事件输出
GPIO_EventOutputCmd 允许或禁止事件输出
GPIO_PinRemapConfig 改变指定引脚的影射
GPIO_EMIConfig 允许或禁止GPIO 8 和 9 的EMI 模式
拓展实验:
在上面LED灯流水显示的基础之上加上按键程序,首先来看看按键的原理图:

当然这个原理图也是相当之简单的,不用读解释了,唯一注意的是OK键与其他三个键的区别是按下为高电平,其余三个按下为低电平。
加入后的完整清单如下:
/
#include "stm32f10x_lib.h"

GPIO_InitTypeDef GPIO_InitStructure;
//键盘定义
#define    KEY_OK     GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) 
#define    KEY_DOWN    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)
#define    KEY_UP     GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)
#define    KEY_ESC    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)
//LED初始化
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
//按键初始化
void KEY_Init (void)
{
    GPIO_InitTypeDef gpio_init;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    gpio_init.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    gpio_init.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &gpio_init);
}
//延迟函数
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
//主函数
main()
{
//RCC_Configuration();
LED_Init();
KEY_Init ();

while(1)
{
   if(!KEY_ESC)
   {
    while(!KEY_ESC) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_9);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_9);
    Delay(0x8ffff);
   }
   else if(!KEY_UP)
   {
    while(!KEY_UP) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_10);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_10);
    Delay(0x8ffff);
   }
   else if(!KEY_DOWN)
   {
    while(!KEY_DOWN) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_11);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_11);
    Delay(0x8ffff);
   }
   else if(KEY_OK)
   {
    while(KEY_OK) ;
    GPIO_SetBits(GPIOC, GPIO_Pin_12);
    Delay(0x8ffff);
    GPIO_ResetBits(GPIOC, GPIO_Pin_12);
    Delay(0x8ffff);
   }
}
}
该例子是按下不同的按键,闪烁对应的LED灯。

关键字:STM32  GPIO  应用笔记 引用地址:STM32 GPIO应用笔记

上一篇:STM32-CAN总线滤波器的使用
下一篇:STM32_ADC时钟

推荐阅读最新更新时间:2024-03-16 14:34

STM32 UART的使用过程
1、使用UART前必须启动相应的外设时钟,其主要用到固件库的RCC_APBnPeriphClockCmd函数。 使能UART1:使用RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE) 使能UART2:使用RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE) 2、使用中断进行UART操作的需要配置NVIC,设置中断优先级。如: /* Configure the NVIC Preemption Priority Bits */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
[单片机]
基于STM32+SIM800C+IoT开发平台设计的森林火灾预警系统(联动控制)
1. 功能介绍 自从地球上出现森林以来,每年平均发生森林火灾超过20万次。森林火灾不仅烧毁树木,直接减少森林面积,而且严重破坏森林结构和森林环境,导致森林生态系统失衡,森林生物量下降,生产力下降,牲畜减少和鸟类减少,甚至牺牲一些重要东西。高强度的火灾会破坏土壤的化学和物理性质,降低水的积累和土壤的渗透性,使部分林区地下水位升高而溃败,造成沼泽;此外,通过焦化和使土壤表面变暖,也会加速焦土的干燥,导致杂草过度生长。近年来,世界各地每年都会发生许多火灾。大多数国家的火灾直接损失超过国民经济总量的0.2%。事实上,除了直接的经济死亡和财产损失外,火灾后还有重大的间接损失,因此,有必要发展和加强防火和火灾报警。 这篇文章就采用华为云i
[单片机]
基于STM32+SIM800C+IoT开发平台设计的森林火灾预警系统(联动控制)
STM32内存之四(CCM)
CCM(Core Coupled Memory)是给F4内核专用的全速64KB RAM, 它们没有经过总线矩阵, F4内核与之直接相连, 地址空间在0x1000_0000 ~ 0x1000_FFFF. 由于其地址空间和常规的SRAM不连续, 加之DMA和外设也无法直接使用它们, 就使得一般的用户程序完全视而不见这64KB全速RAM, 罪过啊 ... 言归正传, 既然是全速又专用的SRAM, 可以这么使用来充分发挥F4性能: 1. 作堆栈. 修改链接脚本, 找到 CCMRAM_region, block CSTACK 和 block HEAP 关键词. 把原先 place in RAM_region {...} 的命令改
[单片机]
<font color='red'>STM32</font>内存之四(CCM)
关于初学STM32中肯的几点建议
通过观察后台提问的内容来看,关注我的人中STM32初学者占大部分,而且大多处于小白阶段。所以,今天暂且写下几点内容给这些朋友。 1查找资料去官网 许多初学者总是在问:能给我一份xxx手册吗?你有关于xxx的资料吗?同时,我也常在某些“技术群”里看到类似这种“给资料”的对话。 这样说吧,你们向别人获取的“资料”,别人基本上也是从官网下载而来的。而且,别人给你的资料不一定是最新版本。 因此,建议初学者查找资料,寻找资料尽量找官方原版资料,毕竟官方的才具有权威性。 STM32官方整理的资料很多,而且针对每一种型号的MCU都有各种资料。夸一点的说:你想要的都有。 针对你MCU芯片型号,进入对应的网址即可(具体这里就不说过程了): ht
[单片机]
在Keil环境编程中发现STM32内存管理存在的问题
非常简单的一个工程,没有用到任何IO操作,与STM32有关的仅仅只有芯片的选择,即其SRAM大小有区别。图1是工程示意图,从图中可以看出,除了自己编写的代码外,仅仅增加了2个文件,即system_stm32f10x.c和startup_stm32f10x_hd.s,其中为了对startup_stm32f10x_hd.s进行修改,将其从库文件夹复制到了项目文件夹中。 图1 代码1 int main() { int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(3): warning: #550-D: variable c was set but never used linkin
[单片机]
在Keil环境编程中发现<font color='red'>STM32</font>内存管理存在的问题
STM32实战一 初识单片机
一直用PLC搞智能控制,最近研发新产品,因为控制点太多,想改用单片机,一阵某度之后,选用STM32,功能足够。开始想自己设计电路,很久没有Altium了,水平本来也不高,放弃了。从宝宝上买了一块开发板STM32F103VET6(单片机主体),一个ST-LINK仿真器(下载和调试程序),一些杜邦线(各种公母头),一些发光管(实际没有用上),开始奇妙的单片机旅程。 与客服联系,要了好多资料,客服不是很专业,不能回答技术问题,简单的安装和使用还行,专业问题要在工作时间找技术支持。一共有3G多的资料,首先安装驱动和软件。 ST-LINK+V2++WIN10+驱动.zip 这是WIN10的驱动。首先安装这个。 mdk472
[单片机]
<font color='red'>STM32</font>实战一 初识单片机
STM32比较常见的BUG总结
STM32是一款处理器,具有高性能、完整的系统和易于使用的特性。随着STM32在各个领域的应用越来越广泛,在开发过程中也存在一些常见的Bug。 1. 在使用该处理器的时候可能会出现无法正确保存设置的问题。此时,用户可以通过更新芯片驱动程序来解决该问题。 2. 在执行某些操作时可能会出现温度过高或电压过低的情况,导致处理器出现异常。此时,用户可以检查处理器的工作环境,确保环境温度及电压在正常范围内。 3. 可能会出现无法正常识别外部设备的问题,此时要检查连接电路是否正常,并将外设重新安装驱动程序。 4. 在编译过程中可能会出现各种报错信息,此时要检查代码是否满足编译要求,同时使用更新的编译工具来避免编译报错。 5
[单片机]
stm32编译出问题解决
.FWlibincstm32f10x_conf.h(33): warning: #14-D: extra text after expected end of preprocessing directive 额外的文本在在预处理命令后面出现 #include stm32f10x_dma.h */ 出问题的地方就是这个 */ 仿照原子自己建立工程的时候出现的问题修改: 问题及修改: 1)..SYSTEMdelaydelay.c(27): error: #20: identifier SysTick_CLKSource_HCLK_Div8 is undefined 解决方法:在delay.c中添加
[单片机]
热门资源推荐
热门放大器推荐
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

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