• stm32 学习笔记:GPIO输出


    一、GPIO简介

           引脚电平 0-3.3V,部分可容忍5V,对输出而言最大只能输出3.3V,

           只要可以用高低电平来控制的地方,都可以用GPIO来完成,如果控制的功率比较大的设备,只需加入驱动电路即可

            GPIO 通用输入输出口,可配置为 8种 输入输出模式。

    • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等。而如果控制的是功率比较大的设备,只需要再添加驱动电路即可。

    • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入(GPIO甚至还能配置成模拟信号输入的模式,配合内部的ADC外设就能直接读取模拟电压了)、ADC电压采集、模拟通信协议接收数据等。

    二、GPIO基本结构

      所有的 GPIO 都是挂载在 ABP2 总线结构上的
      每个 GPIOX 外设有 16 个引脚,编号从 0~15,比如GPIOA 的第0引脚称为 PAO
      每个 GPIO 模块内,主要包含了寄存器和驱动器这些东西,内核可以通过 APB2 总线对寄存器进行读写。
      stm32 是32位单片机,所以寄存器是32位,GPIO模块的寄存器只有低 16 对应IO 引脚
      其中的驱动器是用来增加信号的驱动能力,比如电灯操作

    三、 (重要)GPIO 位结构电路

    四、GPIO模式

    我们可以看到输入部分。
    如果输入引脚啥都不接,那到底是高电平还是低电平,实际上,这时输入就会处于一种浮空的状态,引脚的输入电平极易受外界干扰而改变。为了避免引脚悬空导致的输入数据不确定,我们需要在这里加上上拉或者下拉电阻。
    如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平·(上拉输入称为默认为高电平的输入模式) ,下拉同理。
    上拉电阻和下拉电阻的阻值比较大,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作。
    由于浮空输入的电平不确定,因此端口一定要接上一个连续的驱动源,不能出现悬空的状态。

    模拟输入GPIO无效,引脚直接接入到内部ADC。(这个是连接到ADC,因为ADC需要接受模拟量,所以这根线是接到施密特触发器前面的)

    复用功能:这个是连接到其他需要读取端口的外设上,比如串口的输入引脚等,这根线接收的是数字量,所以在施密特触发器后面

    推挽、开漏或关闭
    在推挽输出模式下,P-Mos和N-Mos均有效。(这种模式下,高低电平均有较强的驱动能力,所以推挽输出可以叫做强推输出模式)

    开漏模式:P-Mos无效,只有N-Mos工作。(它只有低电平有驱动能力,高电平是没有驱动能力的)
    数据寄存器为1时,下管断开,这是输出相当于断开,也就是高阻模式。

    五、外设GPIO配置

    六、LED和蜂鸣器模块

    七、外设硬件电路

         GPIO在推挽输出模式下,高低电平均有较强的驱动能力,但在单片机里,一般用第一种,因为使用高电平弱驱动 ,低电平强驱动的规则

    八、LED闪烁电路接线:

     九、主要程序:

    1、第一步:使用RCC初始化GPIO时钟

    2、第二步:使用GPIO_Init函数初始化GPIO 

    3、第三步设置高低电平 

    1、点亮一个灯(低电平亮)(LED连接PA0口) 

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. int main(void)
    4. {
    5. //开启APB2外设时钟控制
    6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使用RCC初始化GPIO时钟
    7. //使用GPIO_Init函数初始化GPIO
    8. GPIO_InitTypeDef GPIO_InitStructure;
    9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //点灯通用 推挽输出
    10. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //用的是GPIOA外设的0号引脚
    11. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50兆hz的速度
    12. //推挽输出高低电平均有驱动能力,开漏输出高电平相当于高阻态,没有驱动能力,低电平有驱动能力
    13. //用结构体的函数初始化GPIO口
    14. GPIO_Init(GPIOA,&GPIO_InitStructure); //第二个参数为指向结构体的指针,故传地址
    15. GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
    16. //LED闪烁 主循环里面写上 点亮LED,延时一段时间,熄灭LED,延时一段时间
    17. while(1)
    18. {
    19. GPIO_ResetBits(GPIOA,GPIO_Pin_0); //低电平 点亮LED
    20. Delay_ms(500);
    21. GPIO_SetBits(GPIOA,GPIO_Pin_0); // 高电平 熄灭LED
    22. Delay_ms(500);
    23. //WriteBit函数
    24. GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //Bit_RESET : 清除端口值,置低电平 点亮LED
    25. //加两个延时函数
    26. Delay_ms(500);//毫秒延时函数(参数500)
    27. GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); //Bit_SET : 设置端口值,置低电平 熄灭LED
    28. Delay_ms(500);//毫秒延时函数(参数500)
    29. GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
    30. Delay_ms(500);//毫秒延时函数(参数500)
    31. //加两个延时函数
    32. GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
    33. Delay_ms(500);
    34. }
    35. }

    2、流水灯(低电平亮)(LED连接PA0~PA6)

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. int main(void)
    4. {
    5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    6. GPIO_InitTypeDef GPIO_InitStructure;
    7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //初始化所有端口 配置为推挽输出模式
    9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    10. GPIO_Init(GPIOA,&GPIO_InitStructure);
    11. GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
    12. while(1)
    13. {
    14. GPIO_Write(GPIOA,~0x0001); //0000 0000 0000 0001
    15. Delay_ms(500);
    16. GPIO_Write(GPIOA,~0x0002); //0000 0000 0000 0010
    17. Delay_ms(500);
    18. GPIO_Write(GPIOA,~0x0004); //0000 0000 0000 0100
    19. Delay_ms(500);
    20. GPIO_Write(GPIOA,~0x0008); //0000 0000 0000 1000
    21. Delay_ms(500);
    22. GPIO_Write(GPIOA,~0x0010); //0000 0000 0001 0000
    23. Delay_ms(500);
    24. GPIO_Write(GPIOA,~0x0020); //0000 0000 0010 0000
    25. Delay_ms(500);
    26. GPIO_Write(GPIOA,~0x0040); //0000 0000 0100 0000
    27. Delay_ms(500);
    28. GPIO_Write(GPIOA,~0x0080); //0000 0000 1000 0000
    29. Delay_ms(500);
    30. }
    31. }

    3、蜂鸣器(低电平的时候响)(蜂鸣器接口为PB12

    1. #include "stm32f10x.h" // Device header
    2. #include "Delay.h"
    3. int main(void)
    4. {
    5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    6. GPIO_InitTypeDef GPIO_InitStructure;
    7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    9. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    10. GPIO_Init(GPIOB,&GPIO_InitStructure);
    11. while(1)
    12. {
    13. GPIO_ResetBits(GPIOB,GPIO_Pin_12);
    14. Delay_ms(100);
    15. GPIO_SetBits(GPIOB,GPIO_Pin_12);
    16. Delay_ms(100);
    17. GPIO_ResetBits(GPIOB,GPIO_Pin_12);
    18. Delay_ms(100);
    19. GPIO_SetBits(GPIOB,GPIO_Pin_12);
    20. Delay_ms(700);
    21. }
    22. }

    十、下面是程序详解 :来自于博主的笔记:

  • 相关阅读:
    java计算机毕业设计信用卡逾期数据处理分析系统源程序+mysql+系统+lw文档+远程调试
    亚马逊云科技海外服务器初体验
    JDBCUtils的使用和事务
    Linux发展历程
    [附源码]计算机毕业设计JAVA星期八酒店管理系统
    Vue页面嵌入其他页面
    电力工作记录仪、智能安全帽、智能布控球助力智能电网建设
    Linux OOM killer
    【 C++ 】list的模拟实现
    购物车服务-----功能实现逻辑
  • 原文地址:https://blog.csdn.net/hmh520i/article/details/132687017