打印
[STM32F1]

GPIO的高级操作

[复制链接]
1195|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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这些初始化函数一样,使用前要考虑清楚。

沙发
xuanhuanzi|  楼主 | 2018-3-6 17:58 | 只看该作者
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(); 取消所有的复用功能。

使用特权

评论回复
板凳
aizaixiyuanqian| | 2018-3-7 21:02 | 只看该作者
哈哈就是映射呗

使用特权

评论回复
地板
dongnanxibei| | 2018-3-8 16:57 | 只看该作者
让不同IO具备了不同的外设功能。

使用特权

评论回复
5
backlugin| | 2018-3-8 17:04 | 只看该作者
高级都是重新映射。

使用特权

评论回复
6
sdCAD| | 2018-3-8 17:05 | 只看该作者
都是库函数的功能呢

使用特权

评论回复
7
fengm| | 2018-3-8 17:05 | 只看该作者

使用特权

评论回复
8
jkl21| | 2018-3-8 17:06 | 只看该作者
主要还是配置IO

使用特权

评论回复
9
maqianqu| | 2018-3-8 17:06 | 只看该作者
这个上电之后是什么电平?

使用特权

评论回复
10
backlugin| | 2018-3-8 17:07 | 只看该作者
这个STM32IO重新映射高端了。

使用特权

评论回复
11
sdCAD| | 2018-3-8 17:07 | 只看该作者
我以为隐藏的功能呢

使用特权

评论回复
12
fengm| | 2018-3-8 17:07 | 只看该作者
xuanhuanzi 发表于 2018-3-6 17:58
4.GPIO特殊功能函数  函数GPIO_EventOutputConfig(GPIO_PortSourceGPIOx,GPIO_PinSourcey);事件输出。  函 ...

现在使用STM32Cube开发简单多了。

使用特权

评论回复
13
jkl21| | 2018-3-8 17:07 | 只看该作者
简单的配置IO可以实现你要的功能。

使用特权

评论回复
14
maqianqu| | 2018-3-8 17:07 | 只看该作者
应该是默认的低电平吧?

使用特权

评论回复
15
huangcunxiake| | 2018-3-8 21:42 | 只看该作者
现在流行库函数操作了。

使用特权

评论回复
16
蝴蝶泉2018| | 2018-3-9 00:55 | 只看该作者
啊....大半夜这么长,不想看,这肯定是不得了的东西...如果有隐藏功能,按就好了...厉害...

PS:上电默认是浮空输入..或者是AF输入..具体看RM的GPIO哪里就有呀..

使用特权

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

本版积分规则

173

主题

2211

帖子

3

粉丝