打印
[STM32F1]

STM32F103_USART_GPIO配置及相应的IO口设置(翻译)

[复制链接]
369|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
回复就哭哭|  楼主 | 2024-3-31 00:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32 系列单片机 GPIO 资料收集及总结
一、GPIO 配置

(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 复用推挽输出
GPIO_Speed_10MHz 最高输出速率 10MHz
GPIO_Speed_2MHz 最高输出速率 2MHz
GPIO_Speed_50MHz 最高输出速率 50MHz

1.1 I/O 口的输出模式下,有 3 种输出速度可选(2MHz、10MHz 和 50MHz),这个速度是指 I/O 口驱动电路的
响应速度而不是输出信号的速度,

使用特权

评论回复
沙发
回复就哭哭|  楼主 | 2024-3-31 00:37 | 只看该作者
输出信号的速度与程序有关

(芯片内部在 I/O 口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声 控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的 EMI 性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是 GPIO 的引脚速度跟应用匹配(推荐 10 倍以上?)。比如:

1.1.1 对于串口,假如最大波特率只需 115.2k,那么用 2M 的 GPIO 的引脚速度就够了,既省电也噪声小。

1.1.2 对于 I2C 接口,假如使用 400k 波特率,若想把余量留大些,那么用 2M 的 GPIO 的引脚速度或许不够,这时可以选用 10M 的 GPIO 引脚速度。

1.1.3 对于 SPI 接口,假如使用 18M 或 9M 波特率,用 10M 的 GPIO 的引脚速度显然不够了,需要选用 50M的 GPIO 的引脚速度。

1.2 GPIO 口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。

1.3 在复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式。

1.4 所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。

1.5 GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。

使用特权

评论回复
板凳
回复就哭哭|  楼主 | 2024-3-31 00:37 | 只看该作者
推挽输出与开漏输出的区别
推挽输出:可以输出高,低电平,连接数字器件;开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内).
推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.
要实现 线与 需要用 OC(open collector)门电路.是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出既可以向负载灌电流,也可以从负载抽取电流当端口配置为输出时:开漏模式:输出 0 时,N-MOS 导通,P-MOS 不被激活,输出 0。

输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出 1(需要外部上拉电路);此模式可以把端口作为双向 IO使用。
推挽模式:输出 0 时,N-MOS 导通,P-MOS 高阻 ,输出 0。
输出 1 时,N-MOS 高阻,P-MOS 导通,输出 1(不需要外部上拉电路)。
简单来说开漏是 0 的时候接 GND 1 的时候浮空 推挽是 0 的时候接 GND 1 的时候接 VCC

使用特权

评论回复
地板
回复就哭哭|  楼主 | 2024-3-31 00:38 | 只看该作者
在 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 ——片内外设功能(I2C 的 SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

使用特权

评论回复
5
回复就哭哭|  楼主 | 2024-3-31 00:38 | 只看该作者
实例总结:

(1)模拟 I2C 使用开漏输出_OUT_OD,接上拉电阻,能够正确输出 0 和 1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读 IO 的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

(2)如果是无上拉电阻,IO 默认是高电平;需要读取 IO 的值,可以使用;带上拉输入_IPU 和浮空输入_IN_FLOATING 和 开漏输出_OUT_OD

使用特权

评论回复
6
回复就哭哭|  楼主 | 2024-3-31 00:38 | 只看该作者
IO 低功耗:
关于模拟输入&低功耗,根据 STM32 的低功耗 AN(AN2629)及其源文件,在 STOP 模式下,为了得到尽量低的功耗,确实把所有的 IO(包括非 A/D 输入的 GPIO)都设置为模拟输入

使用特权

评论回复
7
回复就哭哭|  楼主 | 2024-3-31 00:38 | 只看该作者
程序
(1)时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC, ENABLE);

使用特权

评论回复
8
回复就哭哭|  楼主 | 2024-3-31 00:39 | 只看该作者
IO 配置:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; // IR 输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

使用特权

评论回复
9
回复就哭哭|  楼主 | 2024-3-31 00:39 | 只看该作者
输出输入:
输出 0:GPIO_ResetBits(GPIOB, GPIO_Pin_0)
输出 1:GPIO_SetBits(GPIOB, GPIO_Pin_0)
输入: GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)

使用特权

评论回复
10
回复就哭哭|  楼主 | 2024-3-31 00:39 | 只看该作者
简单来说开漏是 0 的时候接 GND 1 的时候浮空 推挽是 0 的时候接 GND 1 的时候接 VCC
关于 STM32 上电复位瞬间 I/O 口的电平状态STM32 上电复位瞬间 I/O 口的电平状态默认是浮空输入,因此是高阻。做到低功耗.STM32 的 IO 管脚配置口默认为浮空输入,把选择权留给用户,这是一个很大的优势:一方面浮空输入确保不会出现用户不希望的默认电平(此时电平取决于用户的外围电路);另一方面降低了功耗,因为不管是上拉还是下拉,都会有电流消耗。从另一个角度来看,不管 I/O 管脚的默认配置如何,还是需要在输出的管脚外加上拉或下拉,这是为了保证芯片上电期间和复位时,输出的管脚始终处于已知的电平。

使用特权

评论回复
11
回复就哭哭|  楼主 | 2024-3-31 00:41 | 只看该作者
─ 输入浮空
─ 输入上拉
─ 输入下拉
─ 模拟输入
─ 开漏输出
─ 推挽式输出
─ 推挽式复用功能
─ 开漏复用功能

使用特权

评论回复
12
回复就哭哭|  楼主 | 2024-3-31 00:41 | 只看该作者
IO 端口复位后处于浮空状态,也就是其电平状态由外围电路决定,这很重要,如果设计工业品的话,这是必须要确定的;IO 引脚可以兼容 5V 电源;

stm32 串口 1,2,3,4,5 为什么不工作?
请注意一些常规问题,譬如:
UART3 和 SPI2 有冲突,要把 SPI 的时钟关掉。仔细分析程序,最有可能的就是 rcc 了,我把她们全都打开了,结果我逐一调试,发现RCC_APB1Periph_I2C1,RCC_APB1Periph_I2C2 打开导致 usart3 不正常,RCC_AHBPeriph_SDIO 打开导致usart4 不正常,想的可能是管脚冲突,打开管教定义,呵呵,的确如此。

使用特权

评论回复
13
回复就哭哭|  楼主 | 2024-3-31 00:41 | 只看该作者
usart1 是 APB2,USART2,3,UART4,5 都是 APB1 的, 这个不会搞错的。
一般来说,代码要处理一下几部分内容:

1)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);

使用特权

评论回复
14
回复就哭哭|  楼主 | 2024-3-31 00:42 | 只看该作者
2)NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
15
回复就哭哭|  楼主 | 2024-3-31 00:42 | 只看该作者
3)/* Configure UART4 Rx (PC.11) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* Configure UART4 Tx (PC.10) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);

使用特权

评论回复
16
回复就哭哭|  楼主 | 2024-3-31 00:42 | 只看该作者
4)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_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

使用特权

评论回复
17
回复就哭哭|  楼主 | 2024-3-31 00:42 | 只看该作者
5)USART_Init(UART4, &USART_InitStructure);
/* Enable USART4 Receive and Transmit interrupts */
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
/* Enable the USART4 */USART_Cmd(UART4, ENABLE);

使用特权

评论回复
18
回复就哭哭|  楼主 | 2024-3-31 00:42 | 只看该作者
STM32 UART 的使用过程
1、使用 UART 前必须启动相应的外设时钟,其主要用到固件库的 RCC_APBnPeriphClockCmd 函数。使能 UART1:使用

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)
1
使能 UART2:使用

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 , ENABLE)

使用特权

评论回复
19
回复就哭哭|  楼主 | 2024-3-31 00:42 | 只看该作者
使用中断进行 UART 操作的需要配置 NVIC,设置中断优先级。如:
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

使用特权

评论回复
20
回复就哭哭|  楼主 | 2024-3-31 00:43 | 只看该作者
配置相应的 GPIO 口。
如 果 系 统 的 UART 需 要 进 行 重 映 射 , 需 要 使 用 GPIO_PinRemapConfig 函 数 进 行 重 映 射 , 如 :
GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//注意:Rx 为浮空,Tx 为第二功能上拉。

使用特权

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

本版积分规则

16

主题

261

帖子

0

粉丝