历史上的今天
今天是:2025年03月26日(星期三)
2020年03月26日 | 单片机引脚模式配置
2020-03-26 来源:eefocus
单片机STM32的引脚有多种方式可以选择。
如果你是用直接写寄存器来配置的话,那么,看上手册,给“配置寄存器”对应的位写0或者1就可以达到目的。如下图:

如果是用库函数来配置的话,就需要知道下面这个结构体中的变量代表的意义。

库函数,选择好GPIO_Mode之后,就要使用GPIO_Init()函数来配置,你可以打开这个配置函数,实际上也是在对“配置寄存器”进行写操作。
先解释一下这个结构体中的各个变量的意思:
GPIO_Mode_AIN:模拟输入模式
GPIO_Mode_IN_FLOATING:浮空输入模式
GPIO_Mode_IPD:下拉输入模式
GPIO_Mode_IPU:上拉输入模式
GPIO_Mode_Out_OD:通用开漏输出模式
GPIO_Mode_Out_PP:通用推挽输出模式
GPIO_Mode_AF_OD:复用开漏输出模式
GPIO_Mode_AF_PP:复用推挽输出模式
前四个是输入模式,后四个是输出模式。
输入和输出
从51过来的人,对输入和输出比较陌生。51单片机不用设置输入和输出模式,自动变换,无需程序配置,当我们写程序读引脚的电平的时候,实际上就是作为输入模式来使用,当我们写程序让引脚输出电平的时候,实际上就是作为输出模式来使用。也就是说,并不是51单片机没有输入和输出这个概念,而是你已经使用了很久却没有发现。
STM32与51的区别就是:当我们要读引脚电平的时候,也就是作为输入,我们必须要先把引脚设置为输入功能,才可以读。当我们要控制引脚高低电平的时候,也就是作为输出,我们必须要先把引脚设置为输出功能,才可以设置。
上拉与下拉
概念比较抽象,你只需要记住:在引脚上没有外界干扰的情况下,上拉就是把引脚设置为高电平了,你用万用表量上拉引脚,就是高电平;下拉就是把引脚设置为低电平了,你用万用表量下拉引脚,就是低电平,也就是0V。
推挽与开漏
概念比较抽象,你只需要记住:设置为推挽,就是提高了引脚的输出电流能力。设置为开漏,就是提高了引脚的输入电流能力。然后还要知道,设置为开漏时,如果外部不加上拉电阻,默认输出是低电平。
通用与复用
通用就是作为普通的输入和输出引脚。复用就是该引脚可以作为SPI引脚I2C引脚等其他功能的引脚。
使用介绍
结合上面讲的,可以得到一些简单的应用设置方式。
比如检测按键,就应该设置为输入,如果外部没有加上拉电阻,你就需要设置引脚为上拉输入,这样如果检测到引脚是低电平,就是按下按键了。如果外部加了上拉电阻,你这时既可以把引脚设置为上拉输入,也可以设置为浮空输入,设置为这两种,由于外部上拉电阻的原因,默认就是高电平,同样,检测到低电平时,就是按键按下了。
当你要控制引脚高低电平做应用时,就是需要把引脚设置为输出功能。例如驱动一个器件,驱动一个发光二极管等。如果你要使用高电平点亮发光二极管,就需要把引脚设置为推挽输出,以增大电流输出能力,如果你设置为开漏输出,发光二极管肯定是点不亮了。但是如果你使用低电平点亮发光二极管,那么设置为开漏和推挽输出都可以正常点亮发光二极管。
上面内容比较抽象,需要结合实际才可深入理解。暂时理解不了的,不用着急,接触的多了,自然会理解透彻的。
史海拾趣
|
就业问题! 专业是自动化,刚接触楼宇自控这个行业,现在在一个小公司实习,感觉对这个方向爱做的东西比较感兴趣,可是又很迷茫,现在的公司很小,不知道以后的发展如何,想向各位前辈请教一下,不知道这个行业的前景怎样?… 查看全部问答> |
|
本人以前没有学习过WinCE/Windows mobile开发, 想快速入手,现欲觅WinCE/Windows mobile开发指导老师。 辅导时间:1~2个周末,比如4月18日~4月19日 条件: 1。精通WinCE/Windows mobile开发; 2。精通BSP开发和Windows mobile上的应用开发; ...… 查看全部问答> |
|
各位大侠: STM32F101R8T6MCU的PC7口用推挽输出只有2V(系统供电3.3V)?测试时已把PC7的外部电路全部去掉,就让PC7,输出一个方波。用示波器看,方波最高电压也是2V。 另我感到奇怪的是!与PC7同样的IO PC6却有3.3V的输出, ...… 查看全部问答> |
|
你用过C2000吗? 是否也曾想过DIY 一个最小系统? 实现过吗? 和大家一起分享下,你电脑里所有的关于C2000硬件设计的资料。 我先顶一个 TMS320F28xx和TMS320F28xxx DSCs的硬件设计指南。 … 查看全部问答> |
|
MSP430 LAUNCH PAD 2553g这个平台我利用内部温度传感,但是计算是用int类型来运算的,我放在1.8寸液晶是用char的变量来送显示,如何转换啊。 TEMP=ADC10_Result-746; g=(unsigned char)TEMP/100; 我是这样转换的 但是不管如何转换结果都是得符号 ...… 查看全部问答> |




