stm32f103 gpio模式407gpio有哪几种模式

stm32f4中这是什么 GPIO_OType = GPIO_OType_PP;_百度知道
stm32f4中这是什么 GPIO_OType = GPIO_OType_PP;
提问者采纳
推挽输出就是单片机引脚可以直接输出高电平电压,甚至可能烧坏引脚,推挽方式不用接上拉电阻,高电平时不接地,而且驱动力可以更大。低电平时接地,高电平时输出单片机电源电压。下面是开漏和推挽的区别,则在输出高电平时电压会拉到上拉电阻的电源电压,这个时候输出高电平可能引发单片机运行不稳定。这种方式可以不接上拉电阻:开漏输出就是不输出电压,低电平时接地。但如果输出端可能会接地的话。如果外接上拉电阻。这种方式适合在连接的外设电压比单片机电压低的时候GPIO_OType_PP为推挽方式
提问者评价
谢谢,解答很详细。。
来自团队:
其他类似问题
为您推荐:
gpio的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁查看: 2388|回复: 6
STM32F407 PC13-PC15作为GPIO的方法
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
第一次用STM32F407,因为没有用到RTC,无意中将PC-13-PC15作为了普通IO口使用了。接下来悲催的事情发生了,PC13-PC15是很特殊的pin,STM32F103,很多人讨论过怎么设置成GPIO,并且成功了。看STM32F407的资料,说只能有一个作为输出,即便如此我也认了,现在是也搞不定,都设置成输入,是高阻,通过上拉电阻可以得到高电平,设置成输出,则都是低电平,把某一路设置成输出,三路的输出就有点乱套。整个PCB的工程非常大,STM32F407在里面只是辅助功能,所以重新修改设计只能是下次了。因为RTC是需要在低功耗情况下运行的,所以IC设计的时候这些端口的驱动电路都会和普通的IO不一样,前车之鉴呀。哪位大神碰到过类似的问题,还望赐教!现在我的代码是这样的,控制不了输出电平情况。
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC &, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_OFF);
GPIO_InitStructure.GPIO_Pin = & GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
&我们的探索者F4开发板,就用了PC13来控制触摸屏的片选信号,代码如下:
[mw_shl_code=c,true]
RCC-&AHB1ENR|=1&&1;
//使能PORTB时钟
RCC-&AHB1ENR|=1&&2;
//使能PORTC时钟
RCC-&AHB1ENR|=1&&5;
//使能PORTF时钟
GPIO_Set(GPIOB,PIN1|PIN2,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);
//PB1/PB2 设置为上拉输入
GPIO_Set(GPIOB,PIN0,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SP ...
主题帖子精华
在线时间36 小时
&我们的探索者F4开发板,就用了PC13来控制触摸屏的片选信号,代码如下:
[C] 纯文本查看 复制代码
RCC-&AHB1ENR|=1&&1;
//使能PORTB时钟
RCC-&AHB1ENR|=1&&2;
//使能PORTC时钟
RCC-&AHB1ENR|=1&&5;
//使能PORTF时钟
GPIO_Set(GPIOB,PIN1|PIN2,GPIO_MODE_IN,0,0,GPIO_PUPD_PU);
//PB1/PB2 设置为上拉输入
GPIO_Set(GPIOB,PIN0,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
//PB0设置为推挽输出
GPIO_Set(GPIOC,PIN13,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PC13设置为推挽输出
GPIO_Set(GPIOF,PIN11,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); //PF11设置推挽输出
没任何特殊的地方。
倒是PC14,15,还没用过。
我的淘宝小店:
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
问题解决了,PC13-PC15都可以作为GPIO使用,而且都可以作为输出,手册中说只能有一个作为输出是因为在三个PIN总的输出电流不能超过4mA,如果输出电流很小,则都可以作为输出。VBAT可以不和VDD连接在一起,VDD上电后,内部电路会自动切换到VDD上。代码如下:
GPIO_InitTypeDef GPIO_InitS
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC &, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR &, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_OFF);
GPIO_InitStructure.GPIO_Pin = &GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC-&BSRRH = GPIO_Pin_13;
GPIOC-&BSRRH = GPIO_Pin_14;
GPIOC-&BSRRH = GPIO_Pin_15;
这次碰到的主要问题是STM32库的问题,BSRRH 和BSRRL是反的,修改了库中的定义的顺序,一切解决。不知道是我用的库被人修改过还是,ST公司本来就错了,不知道还有谁碰到过这样的问题?太相信库了,就是这样的结果。
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
谢谢站长的回复!周一我再试试,另外我的VBAT&nbspIN没有和VDD接在一起,是悬空的,不知道是否会影响对这部分的操作?
主题帖子精华
在线时间36 小时
回复【3楼】bg4tfw:
---------------------------------
最好连接在一起
我的淘宝小店:
主题帖子精华
在线时间36 小时
回复【5楼】bg4tfw:
---------------------------------
谢谢分享
我的淘宝小店:
主题帖子精华
初级会员, 积分 157, 距离下一级还需 43 积分
在线时间11 小时
问题解决了,PC13-PC15都可以作为GPIO使用,而且都可以作为输出,手册中说只能有一个作为输出是因为在三个P ...
可以作为输入吗?作为输入怎么感觉不好使呢??
Powered by【转载】STM32GPIO八种工作模式区别
14:55:09  
在Cortex-M3里,对于GPIO的配置种类有8种:(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出
I/O端口位的基本结构
1、推挽输出
& & 推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
2、开漏输出
& &&&输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).开漏形式的电路有以下几个特点
& & a、利用外部电路的驱动能力,减少IC内部的驱动。当IC内部MOSFET导通时,驱动电流是从外部的VCC流经R pull-up ,MOSFET到GND。IC内部仅需很下的栅极驱动电压。
& &b、开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS电平输出等。(上拉电阻的阻值决定了逻辑电平转换的沿的速度 。阻值越大,速度越低功耗越小,所以负载电阻的选择要兼顾功耗和速度。)
& & c、可以将多个开漏输出的Pin,连接到一条线上。通过一只上拉电阻,在不增加任何器件的情况下,形成“与逻辑”关系。这也是I2C,SMBus等总线判断总线占用状态的原理。
& &弱点:带来上升沿的延时。因为上升沿是通过外接上拉无源电阻对负载充电,所以当电阻选择小时延时就小,但功耗大;反之延时大功耗小。所以如果对延时有要求,则建议用下降沿输出。
3、复用开漏输出、复用推挽输出
& &理解为GPIO口被用作第二功能时的配置情况
4、浮空输入
& & &&由于浮空输入一般多用于外部按键输入,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。
5、上拉输入模式
& && &&&区别在于没有输入信号的时候默认输入高电平(因为有弱上拉)。上拉电阻就是为了保证无信号输入时输入端的电平为高电平,同样还有下拉电阻它是为了保证无信号输入时输入端的电平为低电平。
6、下拉输入模式
& && &区别在于没有输入信号的时候默认输入低电平(因为有弱下拉)
7、模拟输入
& && &输入模拟信号
在STM32中常用IO模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(TX1,I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(MOSI,MISO.SCK.SS)
通常有5种方式使用某个引脚功能,它们的配置方式如下:
1)作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2)作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4)作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。
助理工程师
09:37:21  
这个资料很好,许多入门电子工程师,最基本的就应该要了解IO的内部结构,如此才能理解工作原理;
包括我遇到一个10年的单片机软件工程师,居然不知道单片机接口可以设置成多种状态。
站长推荐 /5
Powered bytaobao - Taocode
(C)&&2013&&Alibaba&&Inc.&&All&&rights&&resvered.
Powered by19:45 提问
STM32F407 UART5没反应,波形也不对
#include "usart.h"
#include "stm32f4xx.h"
GPIO_SetBits(GPIOE,GPIO_Pin_1);//1 拉高
GPIO_ResetBits(GPIOE, GPIO_Pin_1);//0
void uart_init(void)
USART_InitTypeDef
USART_InitS
NVIC_InitTypeDef
NVIC_InitS
GPIO_InitTypeDef
GPIO_InitS
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_UART5);
//UART5_RX
GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_UART5);
//UART5_TX
GPIO_PinAFConfig(GPIOE, GPIO_PinSource1, GPIO_AF_UART5);
//uart5_DE
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOE, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(UART5, &USART_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(UART5, ENABLE);
USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
static void delay(unsigned int dl)
unsigned int i,y;
for(i = 0; i & 500; i++)
for(y = 0; y & y++);
void UART5_IRQHandler(void)
uint8_t x,y,z;
uint16_t checksum1,checksum2;
if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
x=USART_ReceiveData(UART5);
USART_SendData(UART5,x);
void uartsend(int ch)
delay(100);
while(RESET == USART_GetFlagStatus(UART5,USART_FLAG_TXE));
USART_SendData(UART5, (uint8_t) ch);
delay(100);
用的是STM32F407的片子,现在接受和发送数据都没有,这是为什么呢?
按赞数排序
这怎么讲呢 进入硬件debug看寄存器UART5的值有没有变化,该置位的有没有置位
示波器测了下
PC12(UART5_RX)波形是 、PD2(UART5_TX)波形只拉低,再不变了,PE1(UART_DE --&是uart5
1发送数据 0接受数据) 正常。
AB口波形正常。
PC12波形不正常,但是是方波。
PC12波形不正常,但是是方波。
相关参考资料}

我要回帖

更多关于 stm32f407 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信