[其他ST产品] STM32的GPIO(STM32F103RCT6-LED)

[复制链接]
1331|9
 楼主| 过期的塔头 发表于 2024-2-27 14:39 | 显示全部楼层 |阅读模式
前言
简单的描述一下GPIO和GPIO的八种工作模式,及GPIO相关寄存器,写一个点灯

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

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

6696665dd83a878c58.png

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

7331165dd83b80692f.png
 楼主| 过期的塔头 发表于 2024-2-27 14:40 | 显示全部楼层
输入:模拟输入配置
模拟输入模式关闭了施密特触发器,不接上、下拉电阻,经由另一线路把电压信号传送到片上外设模块。如传送给 ADC 模块,由ADC 采集电压信号。所以使用 ADC外设时,必须设置为模拟输入模式。
8773165dd83d464cc4.png
 楼主| 过期的塔头 发表于 2024-2-27 14:40 | 显示全部楼层
输出:通用输出配置
如图6.3所示,图中箭头表示信号流动方向输出缓冲器是由 P-MOS 和 N-MOS 管组成的单元电路,推挽/开漏输出模式是根据其工作方式来命名的。

当I/O端口被配置为输出时,输出缓冲器被激活,施密特触发输入被激活,弱上拉和下拉电阻被禁止。
2552565dd83e267c8f.png
 楼主| 过期的塔头 发表于 2024-2-27 14:40 | 显示全部楼层
输出:复用输出配置
当I/O端口被配置为复用功能时,输出缓冲器被打开,内置外设的信号驱动输出缓冲器,施密特触发输入被激活,弱上拉和下拉电阻被禁止。

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

7996665dd83f766731.png
 楼主| 过期的塔头 发表于 2024-2-27 14:41 | 显示全部楼层
GPIO相关寄存器
1622965dd840e36ae1.png
 楼主| 过期的塔头 发表于 2024-2-27 14:41 | 显示全部楼层
LED灯点亮
LED0是PA8,LED1是PD2,且都是共阳极,高电平灭,低电平亮
3700865dd841c9e236.png
 楼主| 过期的塔头 发表于 2024-2-27 14:41 | 显示全部楼层
主函数

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

int main()
   
{
   
   
    LED_Init();
    while(1)
{
         
    }
     
   
}
 楼主| 过期的塔头 发表于 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灭
       
       
       
       
       
       
       
       
}
Henryko 发表于 2024-2-29 23:12 | 显示全部楼层
复用到底是怎么个意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

999

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部