STM32外设之GPIO

发布者:Lianai最新更新时间:2022-09-27 关键字:STM32  外设  GPIO 手机看文章 扫描二维码
随时随地手机看文章

一、GPIO是什么?

全称:General-purpose input/output(通用型输入输出)


操作要点:


1. 使能 GPIO 端口时钟。


2. 初始化 GPIO 目标引脚为推挽输出模式。


3. 编写简单测试程序,控制 GPIO 引脚输出高、低电平


二、使用步骤

1.GPIO功能与模式

1.输入浮空 :输入模式施密特触发器打开及GPIO端口内部上下拉开关打开, 并且状态不确定。


2.输入上拉:输入模式施密特触发器打开及GPIO端口内部上拉开关关闭,默认为高电平。


3.输入下拉 :输入模式施密特触发器打开及GPIO端口内部下拉开关关闭,默认为低电平。


4.模拟输入 : 模拟输入施密特触发器关闭─,输入数据寄存器禁止,实现模拟信号采集。


5.开漏输出 : 开漏输出即在输出数据寄存器为‘0’时,控制NMOS打开,Pmos关闭,在数据寄存器为‘1时将端口置为高阻态,IO口状态由外部上下拉决定。


6.推挽输出 :POMS,NMOS均启用,输入数据寄存器输出‘1’时PMOS打开,为高电平状态,反之为低电平。


7. 推挽复用功能 :GPIO端口复用功能输出推挽。


8. 开漏复用功能:GPIO端口复用功能输出开漏。


2.寄存器操作

        GPIOX_CRL --端口配置低寄存器 ---设置输入输出模式及速度0-7    config register low


        GPIOX_CRH--端口配置高寄存器---设置输入输出模式及速度8-15    config register hight


        GPIOX_IDR--端口输入数据寄存器---低16位有效,读对应IO口状态   input date register


        GPIOX_ODR--端口输出数据寄存器---低16位有效,写状态  output date register


        GPIOX_BSRR--端口位设置/清除寄存器--操作ODR寄存器置1置0  bit set reset register 


        GPIOX_BRR--端口位清除寄存器--操作ODR寄存器置0  bit  reset register 


        GPIOX_LCKR--端口配置锁定寄存器


        存储器映像   GPIOA  起始地址  0x4001 0800 -0x4001 0BFF


#define GPIOA_CRL     *(unsigned int*)(0x40010800+0x00)  //强制类型转换先转换成指针

#define GPIOA_CRH     *(unsigned int*)(0x40010800+0x04)  //然后指针解引用,给对应寄存器赋值

#define GPIOA_IDR     *(unsigned int*)(0x40010800+0x08)  //地址位GPIOA基地址+偏移值

#define GPIOA_ODR     *(unsigned int*)(0x40010800+0x0C)

#define GPIOA_BSRR     *(unsigned int*)(0x40010800+0x10)

#define GPIOA_BRR     *(unsigned int*)(0x40010800+0x14)

#define GPIOA_LCKR     *(unsigned int*)(0x40010800+0x18)

 

 

gpio.c文件中为结构体类型

 

typedef struct    

{

    unsigned int CRL;

unsigned int CRH;

unsigned int IDR;

unsigned int ODR;

unsigned int BSRR;

unsigned int BRR;

unsigned int LCKR;

}GPIO_TypeDef;

 

#define GPIOA ((GPIO_TypeDef*)GPIOA_BASE)  //强制类型转换为结构体指针类型,指向上边的结构体。


3.库函数操作

#include "led.h"

#include "stm32f10x.h"                  // Device header

 

void LED_init(void)

{

  //1.创建结构体变量

  GPIO_InitTypeDef led_init;

  //2.使能APB2 GPIOB

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

  

  //3.结构体配置

  

  led_init.GPIO_Mode =GPIO_Mode_Out_PP;

  led_init.GPIO_Pin=GPIO_Pin_5 ;

  led_init.GPIO_Speed=GPIO_Speed_10MHz;

  GPIO_Init(GPIOB, &led_init);

  GPIO_SetBits(GPIOB,GPIO_Pin_5); 

  led_init.GPIO_Mode =GPIO_Mode_Out_PP;

  led_init.GPIO_Pin=GPIO_Pin_5 ;

  led_init.GPIO_Speed=GPIO_Speed_10MHz;

  GPIO_Init(GPIOE, &led_init);

  GPIO_SetBits(GPIOE,GPIO_Pin_5); 

  

}


总结

GPIO是目前操作的第一个外设,通过库函数操作还是很简单的,步骤比较一致。


1.使能对应外设时钟


2.配置相关对应寄存器/结构体配置


3.初始换GPIO

关键字:STM32  外设  GPIO 引用地址:STM32外设之GPIO

上一篇:STM32F10x外部中断EXTI
下一篇:STM32F10X库函数逻辑

推荐阅读最新更新时间:2024-11-11 18:58

stm32的TIM2作为实例一步步配置成为定时器
下面以stm32的TIM2作为实例一步步配置成为定时器: 1:对定时器的基本配置 TIM_TimeBaseStructure.TIM_Period = 65535; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 100; //分频计数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBase
[单片机]
stm32 中断函数名称表
stm32 中断服务函数的名称有点特别,它们的名称是固定的, 但是表面看起来又好像没什么规律, 还是老办法,写下来死记了。 WWDG_IRQHandler PVD_IRQHandler TAMPER_IRQHandler RTC_IRQHandler FLASH_IRQHandler RCC_IRQHandler EXTI0_IRQHandler EXTI1_IRQHandler EXTI2_IRQHandler EXTI3_IRQHandler EXTI4_IRQHandler DMA1_Channel1_IRQHandler DMA1_Channel2_IRQHan
[单片机]
stm32 GPIO速率
GPIO的输出速率:GPIO电平每秒切换的最大次数, 单纯GPIO意义不大,不过在通讯方面对于GPIO是有要求的。 这个输出速率主要体现I/O驱动电路的输出反应能力,通过选择不同的输出驱动速率,实现最佳的噪声与和功耗控制。不难理解,选择输出驱动速率越高,噪声也越大,相应的芯片功耗也会越大。所以对于这个输出频率的选择,不要太随意,合适就好。在满足应用的需求的前提下,就不要随意往高端速率选择 gpio不同速率设置对实际开发的影响: 1、LED闪烁快慢不一致 2、Audio 噪声 其中有I2S的音频播放功能。在调试时用到Printf串口打印,发现使用printf输出时会出现噪音,如果关闭printf则正常。直到将UART的TX输出端口
[单片机]
【AVR ASF4库函数学习笔记】二、GPIO
平台:Microchip Studio (原Atmel Studio 7) 欣世纪 DMAVR-L Atmega 128A - AU 头文件为port.h 枚举类型 enum port_pull_mode { PORT_PULL_OFF, PORT_PULL_UP, }; enum port_dir { PORT_DIR_IN, PORT_DIR_OUT, PORT_DIR_OFF, }; 函数 X = ABCDEFG static inline bool PORTX_get_pin_level(const uint8_t pin) 读取连接到端口的引脚上的电平 stat
[单片机]
ARM学习笔记015之GPIO(汇编、key、led接线、int main、-wall)
1、makefile中警告命令:用-Wall,而不能都是大写或小写。如果是都小写则出现如下错误提示: arm-none-linux-gnueabi-gcc: unrecognized option '-wall' 2、c文件中main函数必须是int型,不能是void型,不然会: warning: return type of 'main' is not 'int' 3、汇编语句中关于地址的需要用=号: ldr r0,=0x56000000 //没有等号就会出现这样的错误 crt0.s: Assembler messages:crt0.s:8: Err
[单片机]
ARM学习笔记015之<font color='red'>GPIO</font>(汇编、key、led接线、int main、-wall)
STM32位段别名位
1. 什么是位段、位带别名区? 2. 它有什么好处? 答1: 是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作, MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0置。 而现在STM32的位段、位带别名区就为了实现这样的功能。 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。 它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT) 就对应SRAM或I/O的一位。
[单片机]
STM32——流水灯
stm32f10x_conf.h:打开stm32f10x_gpio.h和stm32f10x_rcc.h; stm32f10x_gpio.c 和 stm32f10x_rcc.c加入工程模板中,只说重点。 【stm32f10x_rcc.c用于配置系统时钟 和外设时钟,由于每个外设都要配置时钟,所以它是每个外设都需要用到的库文件。】 // 新建led.h led.c #ifndef _LED_H_ #define _LED_H_ #include stm32f10x.h #define ON 0 #define OFF 1 #define LED1(a) if (a) GPIO
[单片机]
大型车辆内轮差危险区域双向示警系统设计
摘 要:大型车辆由于自身车长,轴距长等特点在转弯过程中前轮与后轮轨迹不重合,形成“内轮差”区域。大型车辆发生的恶性 交通事故 中,由于“内轮差”引发的事故占70%以上。针对大型车辆转弯视觉盲区“内轮差”问题,本设计提出一套大型车辆 内轮差危险区域 双向示警系统的设计方案。整个系统模拟真实车辆转向过程。主控模块采用 STM32 进行控制,通过连接电路、实验调试后,该系统可以模拟真实车辆转向过程,并计算“内轮差”危险区域,进行相关 双向声光示警 ,能够达到预期目标,对有效减少大型车辆“内轮差”事故的发生提供解决方案。 *本项目获得“2020全国大学生集成电路创新创业大赛·创新实践项目组”辽宁省一等奖、东北赛区二等奖、国家级三等奖。
[汽车电子]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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