3. STM32的GPIO的深入学习

时间:2022-04-23 17:50:02

         最近一直在学习TCP/IP协议族,它很复杂,让我很难理清整个TCP/IP的脉络,没有入门,也就没心情来写学习报告,而且学习TCP/IP协议的这段过程,正好可以

对嵌入式Cortex-M3的学习换个心情,一直学习嵌入式,写代码也很枯燥的,当然看协议也很枯燥,只是方式不同,汗。。。正好抽空巩固总结一下之前的所学,之后

的外设我还会继续学习。  

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

   做过流水灯的知道,SetBit和ResetBit这两个函数,你有没有想过有一个函数能实现这两个功能呢,或者有函数能实现对一整个GPIO进行配置呢,上面的函数就实

现了这个目的。这两个函数和之前运用的单独复位置位的库函数其实就是操作下面两个寄存器。

    端口复位置位寄存器(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管脚引出,即复用功能的引出脚位是可通过程序改变的。就是上面库函数。

3. STM32的GPIO的深入学习

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