• STM32学习笔记(三) STM32的GPIO的深入学习


     STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置。STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32与外部连接的端口,难度不高,却十分重要。从深入解析GPIO外设开始,一步步熟悉掌握STM32各个模块,就是STM32的整个学习流程。

    GPIO模块回顾

        在嵌入式软件开发中,几乎所有功能的实现都需要GPIO端口输出才能发挥作用。GPIO端口的操作包括时钟使能,寄存器配置,端口信息修改。这些基础的东西上一章已经讲过,我这里就不在细说,我这里主要讲GPIO涉及到的其它库函数。

    1. 读取GPIO端口数据函数

        GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_y);//读取单个输入端口的数据

        GPIO_ReadInputData(GPIOx);//读取整个输入端口的数据

        GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin_y);//读取单个输出端口的数据

        GPIO_ReadOutputData (GPIOx);//读取整个输入出端口的位数据

        这4个库函数是用来直接读取端口数据的,其中x:A-G y: 0~15

        上面的函数实现的是读取当前GPIO口或位的输入输出数据,库函数没有什么可说的。

        但这几个函数涉及到下面两个寄存器:

        端口数据输入寄存器(GPIOA_IDR~GPIOG_IDR);

        端口数据输出寄存器(GPIOA_ODR~GPIOG_ODR);

        这两个寄存器都是16位的,高16位保留,读取值为0,低16位代表着对应GPIO端口位[15:0]的状态,偏移值位0cH,具体地址可参考寄存器表。上面的库函数读取Data就是读取这两个寄存器中选定那个的低16位,读取DataBit就是读取选定寄存器16位中的任意选定位。

     2 . 写入GPIO端口数据函数

       GPIO_WriteBit(GPIOx, GPIO_Pin_y,BIT_SET/BIT_RESET);//置位或者复位单个输出端口的数据

       GPIO_Write(GPIOx, 0x1111);//置位或者复位整个输出端口的数据

       其中x:A-G y: 0~15

       这两个函数是对GPIO_SetBits和GPIO_ResetBits的补充,可以满足对多个端口同时设置状态的特性。

       端口复位置位寄存器(GPIOA_BSRR~GPIOG_BSRR) ,32bit复位置位寄存器,w(只写,下同),

       [31~16]写0无效,写1对应GPIOx_ODR位置0

       [15~0]写0无效,写1对应GPIOx_ODR位置1

       端口复位寄存器(GPIOA_BRR~GPIOG_BRR),32bit复位寄存器w

      高16位保留,低16位

       [15~0]写0无效,写1对应GPIOx_ODR位置0 若GPIOx_BRR和GPIOx_BSRR同时设置,以GPIOx_BSRR为准。

     3. GPIO功能锁存函数

       GPIO_PinLockConfig(GPIOx, GPIO_Pin_y);//锁存选择端口配置寄存器的对应位

      端口锁存寄存器(GPIOA_LCKR~GPIOG_LCKR),32bit寄存器,高16位保留,低16可随时读出,1代表对应配置位被激活锁存,0代表可以被激活,激活是有固定的写入顺序的。锁存是不能乱用的,如果锁存了一个端口的功能寄存器,那么在下次系统复位前,端口的功能就不可更改,这在某些情况下是有利的,特别是在程序中如果重新定义某些GPIO口的功能时,在确定其中某一GPIO端口在整个系统运行中状态保持不变,锁存就避免误修改,但是如果锁存的GPIO在后续的代码段中有不同的功能,就会无法修改,产生错误。因此锁存和GPIO_StructInit, GPIO_DeInit,GPIO_AFIODeInit这些初始化函数一样,使用前要考虑清楚。

    4.GPIO特殊功能函数

      函数GPIO_EventOutputConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcey);事件输出。

      函数GPIO_EXTILineConfig(GPIO_PortSourceGPIOx, GPIO_PinSourcey); 外设端口作为中断线号输入

      这两个函数我就不多说了,在EXTI-NVIC中会有详细解释。

      函数GPIO_PinRemapConfig(u32GPIO_Remap, FunctionalState NewState);改变指定管脚的映射,很多复用功能的引出脚可以通过重映射,从不同的I/O管脚引出,即复用功能的引出脚位是可通过程序改变的。就是上面库函数。

    函数GPIO_AFIODeInit(); 取消所有的复用功能。

    相关代码参考:按键控制LED灯

  • 相关阅读:
    打赏
    996315便捷扫码接口的使用方法
    openjdk ImageIO.write()时出现Invalid argument to native writeImage
    CentOS7通过rpm包升级openssh8.8
    python docx转pdf
    python生成币私钥公钥
    二叉树的非递归后序遍历算法
    STM32引脚做输入时,有开漏,浮空输入,弱上拉,弱下拉,等多种方式,如何选择????
    TLC2551驱动问题
    connot launth the modelsimaltera softwarre because you did not specify the path to the executables of the modelsimaltera softwarre
  • 原文地址:https://www.cnblogs.com/zc110747/p/4660514.html
Copyright © 2020-2023  润新知