打印
[其他ST产品]

STM32的GPIO(STM32F103RCT6-LED)

[复制链接]
680|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
简单的描述一下GPIO和GPIO的八种工作模式,及GPIO相关寄存器,写一个点灯

一、1. STM32 I/O简介
在 STM32 中I/O 引脚,又称为GPIO (General-Purpose I/O),主要分为GPIOA、GPIOB、 GPIOC……不同的组,每组端口分为 0~15,共 16 个不同的引脚。
不同型号的芯片,具有不同的端口组和不同的引脚数量。
可以被软件设置成各种不同的功能及模式。

二、GPIO的8种工作方式
输入输出模式结构都可以由软件分别配置成8种模式,包括:浮空输入、上拉输入、下拉输入 、模拟输入、通用开漏输出、通用推挽式输出、复用推挽式输出和复用开漏输出,见表




使用特权

评论回复
沙发
过期的塔头|  楼主 | 2024-2-27 14:39 | 只看该作者
输入:上拉、下拉和浮空输入配置
在上拉/下拉/浮空输入模式中,输出缓冲器被禁止,施密特触发器输入被激活,根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接,读输入数据寄存器的值可得到I/O状态

使用特权

评论回复
板凳
过期的塔头|  楼主 | 2024-2-27 14:40 | 只看该作者
输入:模拟输入配置
模拟输入模式关闭了施密特触发器,不接上、下拉电阻,经由另一线路把电压信号传送到片上外设模块。如传送给 ADC 模块,由ADC 采集电压信号。所以使用 ADC外设时,必须设置为模拟输入模式。

使用特权

评论回复
地板
过期的塔头|  楼主 | 2024-2-27 14:40 | 只看该作者
输出:通用输出配置
如图6.3所示,图中箭头表示信号流动方向输出缓冲器是由 P-MOS 和 N-MOS 管组成的单元电路,推挽/开漏输出模式是根据其工作方式来命名的。

当I/O端口被配置为输出时,输出缓冲器被激活,施密特触发输入被激活,弱上拉和下拉电阻被禁止。

使用特权

评论回复
5
过期的塔头|  楼主 | 2024-2-27 14:40 | 只看该作者
输出:复用输出配置
当I/O端口被配置为复用功能时,输出缓冲器被打开,内置外设的信号驱动输出缓冲器,施密特触发输入被激活,弱上拉和下拉电阻被禁止。

复用输出中:至于选择复用开漏输出还是复用推挽输出,是根据 GPIO 复用功能来选择的,如 GPIO 的引脚用作串口输出,则使用复用推挽输出模式;如用在I2C、SMBUS 等这些需要“线与”功能的复用场合,就使用复用开漏模式。

使用特权

评论回复
6
过期的塔头|  楼主 | 2024-2-27 14:41 | 只看该作者
GPIO相关寄存器

使用特权

评论回复
7
过期的塔头|  楼主 | 2024-2-27 14:41 | 只看该作者
LED灯点亮
LED0是PA8,LED1是PD2,且都是共阳极,高电平灭,低电平亮

使用特权

评论回复
8
过期的塔头|  楼主 | 2024-2-27 14:41 | 只看该作者
主函数

#include "stm32f10x.h"                  // Device header
#include "led.h"

int main()
   
{
   
   
    LED_Init();
    while(1)
{
         
    }
     
   
}

使用特权

评论回复
9
过期的塔头|  楼主 | 2024-2-27 14:42 | 只看该作者
led.c
#include "led.h"
#include "stm32f10x.h"                  // Device header
#include "stm32f10x_gpio.h"             // Keil::Device:StdPeriph Drivers:GPIO

void LED_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);//使能PA,PD时钟
       
    //定义PA8,GPIO设置
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;        //设置引脚
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 设置输出速度
    GPIO_Init(GPIOA,&GPIO_InitStructure);          //初始化GPIO
    GPIO_ResetBits(GPIOA,GPIO_Pin_8);     //PA8输出低电平,L0亮
       
       
        //定义PD2,GPIO设置
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;        //设置引脚
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 设置输出速度
    GPIO_Init(GPIOD,&GPIO_InitStructure);          //初始化GPIO
    GPIO_SetBits(GPIOD,GPIO_Pin_2);     //PA8输出高电平,L1灭
       
       
       
       
       
       
       
       
}

使用特权

评论回复
10
Henryko| | 2024-2-29 23:12 | 只看该作者
复用到底是怎么个意思

使用特权

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

本版积分规则

81

主题

955

帖子

0

粉丝