STM32 系列单片机 GPIO 资料收集及总结
一、GPIO 配置
1.1 I/O 口的输出模式下,有 3 种输出速度可选(2MHz、10MHz 和 50MHz),这个速度是指 I/O 口驱动电路的
响应速度而不是输出信 的速度,
输出信 的速度与程序有关
(芯片内部在 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 口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
2、推挽输出与开漏输出的区别
推挽输出:可以输出高,低电平,连接数字器件;开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般 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
3、在 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)
实例总结:
(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
4、IO 低功耗:
关于模拟输入&低功耗,根据 STM32 的低功耗 AN(AN2629)及其源文件,在 STOP 模式下,为了得到尽量低的功耗,确实把所有的 IO(包括非 A/D 输入的 GPIO)都设置为模拟输入
5、程序
(1)时钟:
(2)IO 配置:
(3)输出输入:
简单来说开漏是 0 的时候接 GND 1 的时候浮空 推挽是 0 的时候接 GND 1 的时候接 VCC
关于 STM32 上电复位瞬间 I/O 口的电平状态STM32 上电复位瞬间 I/O 口的电平状态默认是浮空输入,因此是高阻。做到低功耗.STM32 的 IO 管脚配置口默认为浮空输入,把选择权留给用户,这是一个很大的优势:一方面浮空输入确保不会出现用户不希望的默认电平(此时电平取决于用户的外围电路);另一方面降低了功耗,因为不管是上拉还是下拉,都会有电流消耗。从另一个角度来看,不管 I/O 管脚的默认配置如何,还是需要在输出的管脚外加上拉或下拉,这是为了保证芯片上电期间和复位时,输出的管脚始终处于已知的电平。
─ 输入浮空
─ 输入上拉
─ 输入下拉
─ 模拟输入
─ 开漏输出
─ 推挽式输出
─ 推挽式复用功能
─ 开漏复用功能
IO 端口复位后处于浮空状态,也就是其电平状态由外围电路决定,这很重要,如果设计工业品的话,这是必须要确定的;IO 引脚可以兼容 5V 电源;
stm32 串口 1,2,3,4,5 为什么不工作br> 请注意一些常规问题,譬如:
UART3 和 SPI2 有冲突,要把 SPI 的时钟关掉。仔细分析程序,最有可能的就是 rcc 了,我把她们全都打开了,结果我逐一调试,发现RCC_APB1Periph_I2C1,RCC_APB1Periph_I2C2 打开导致 usart3 不正常,RCC_AHBPeriph_SDIO 打开导致usart4 不正常,想的可能是管脚冲突,打开管教定义,呵呵,的确如此。
usart1 是 APB2,USART2,3,UART4,5 都是 APB1 的, 这个不会搞错的。
一般来说,代码要处理一下几部分内容:
STM32 UART 的使用过程
1、使用 UART 前必须启动相应的外设时钟,其主要用到固件库的 RCC_APBnPeriphClockCmd 函数。使能 UART1:使用
使能 UART2:使用
2、使用中断进行 UART 操作的需要配置 NVIC,设置中断优先级。如:
3、配置相应的 GPIO 口。
如 果 系 统 的 UART 需 要 进 行 重 映 射 , 需 要 使 用 GPIO_PinRemapConfig 函 数 进 行 重 映 射 , 如 :
将 Rx 配置为:浮空输入模式,Tx 配置为带上拉的第二功模式。并用 GPIO_Init() 函数初始化。如:
4、配置 UART
当在 conf 文件种配置正确的外晶振后,在 USART_InitTypeDef 定义的结构体种直接写入 UART 的波特率、
通讯长顿、模式、硬件通讯控制,收发模式。再用 USART_Init()进行初始化。如:
而后使能收发中断。如:
注意:一般不将 TXE 中断使能。因为一旦将此中断使能,如果 UART 发送缓冲区空,则会立即进入 UART 中
断中,因此可在程序中需要发送数据处,使能 TXE 中断。在 UART 中断种用 USART_SendData()来发送数
据。
完成中断使能后,还需要使能 UART 口:
如:
中断程序(stm32f10x_it.c)可以如下完成发送:注意所有的的串口中断需要在中断服务程序中判断中断
源以分别处理。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!