【STM32】GPIO从电路到程序实例

【百问网】物联网学习笔记3

硬件电路:

1.STM32F103C8T6一共有48个引脚(封装LQFP48)

2.按A、B、C分组,每组16个引脚,编号为0~15

STM32F103C8T6有2组GPIO,每组16个引脚,即32个GPIO引脚。

根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配置成多种模式。

输出模式四种:推挽输出、开漏输出、复用推挽输出、复用开漏输出。

Push-Pull ,Open-Drain, Alternate Function Push-Pull/Open-Drain

前两种模式受GPIO寄存器控制,复用后受片上外设控制。

复用功能体现在选择器。

I/O端口位的基本结构

推挽输出:一个PMOS,一个NMOS,VDD=3.3V,VSS为地。

当输出控制为高电平时,PMOS导通、NMOS断开(看作不存在);当输出控制为低电平,NMOS导通,相当于IO引脚接到VSS。

效果:原本是输出控制接到IO输出高低电平,变成输出控制去控制VDD或VSS接到IO口,使输出电流增大,提高了输出引脚的驱动能力、电路的负载能力、开关的工作速度。

推挽输出

上拉输入默认输入高电平,下拉输入默认输入低电平。

输入浮空/上拉/下拉配置

从个人经验来看,大部分时候,输出就推挽输出,输入就上拉输入

或者设置为复用功能

GPIO接LED配置低速即可,如果复用为IIC、SPI等通信引脚使用中高速。

 从引脚图看到PA1连接着LED,这关系到写驱动时的引脚宏定义

点灯代码:

主函数:

//文件名称:main.c
#include "stm32f1xx_hal.h"
#include "stm32f1xx_clk.h"
#include "driver_led.h"

int main(void)
{    
    // 初始化HAL库函数必须要调用此函数
    HAL_Init();
    // 系统时钟即AHB/APB时钟配置
    SystemClock_Config();
    
    // 初始化LED
    LedGpioInit();
	// 循环闪烁
    while(1)
    {
        BLED(ON);
        HAL_Delay(1000);
        BLED(OFF);
        HAL_Delay(1000);
    }
}

 LED驱动:

//文件名称:driver_led.c
#include "driver_led.h"

/*
 *  函数名:void LedGpioInit(void)
 *  函数作用:初始化LED的引脚,配置为上拉推挽输出
*/
void LedGpioInit(void)
{
    // 定义GPIO的结构体变量
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    // 使能LED的GPIO对应的时钟
    B_LED_GPIO_CLK_EN();

    GPIO_InitStruct.Pin   = B_LED_GPIO_PIN;         // 选择LED的引脚
    GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;   // 设置为推挽输出模式
    GPIO_InitStruct.Pull  = GPIO_PULLUP;           // 默认上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  // 引脚输出速度设置为慢

    // 初始化引脚配置
    HAL_GPIO_Init(B_LED_GPIO_PORT, &GPIO_InitStruct);

    // 默认LED灭:OFF-灭,ON-亮
    BLED(OFF);
}
//文件名称:driver_led.h
#ifndef __DRIVER_LED_H
#define __DRIVER_LED_H

#include "stm32f1xx_hal.h"

// 引脚宏定义
#define B_LED_GPIO_PIN        GPIO_PIN_1
#define B_LED_GPIO_PORT       GPIOA
#define B_LED_GPIO_CLK_EN()   __HAL_RCC_GPIOA_CLK_ENABLE()

// 函数宏定义
// LED亮灭函数宏定义

#define ON  GPIO_PIN_RESET
#define OFF GPIO_PIN_SET
    
#define BLED(flag)        HAL_GPIO_WritePin(B_LED_GPIO_PORT, B_LED_GPIO_PIN, flag)     

/*  函数名:void LedGpioInit(void)
 *  函数作用:初始化LED的引脚,配置为上拉推挽输出
*/
extern void LedGpioInit(void);

#endif

参考资料:

👨‍💻百问网资料下载中心 — 百问网资料下载中心 3.0 文档http://download.100ask.net/

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值