stm32读取gpio高低电平速度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32读取gpio高低电平速度相关的知识,希望对你有一定的参考价值。

参考技术A STM32读取GPIO高低电平的速度受到许多因素的影响,包括GPIO口的数目、开启的时钟频率、中断设置和外设的负载等。一些实用的技巧可以用来提高GPIO读取速度:

1. 确保GPIO口的外设时钟已经开启并且合适速度的外设时钟被选择。

2. 最好使用IVC方式设置GPIO口。使用IVC可以加快GPIO端口的读取速度。芯片的文档,Clock sources for STM32 devices 也可以解释这个问题。

3. 避免使用轮询方式读取GPIO口。中断方式和DMA方式都比轮询方式更快。其中,DMA方式的速度更快,因为它利用DMA通道转移数据,芯片的中断服务程序不需要频繁地去读取GPIO口。

4. 将GPIO口的中断优先级设置较低。因为如果中断优先级过高,当有多个GPIO口发生中断时,系统的优先级切换会变得非常频繁,会降低整体读取速度。

5. 待检查的GPIO口的数量尽可能少。因为每个GPIO口需要单独进行检查,所以如果检查的GPIO口越多,整体速度就会越慢。

通过这些技巧,你可以最大限度地提高STM32读取GPIO高低电平的速度。

STM32学习笔记

STM32笔记

GPIO输出

GPIO(general purpose input output)通用输入输出

引脚电平:0V ~ 3.3V,部分引脚可容忍5V

输出模式下可控制端口输出高低电平,控制LED、蜂鸣器、模拟通信协议输出时序等

输入模式下可读取端口的额高低电平活电压,用于按键读取、外界模块电平信号输入、ADC电压猜忌、模拟通信协议接收数据等

单独操作输出数据寄存器的某一位的方法

  • &=和|=操作,比较麻烦效率不高
  • 操作位设置\\清除寄存器,
  • 读写"位带"区域,在stm32中,专门分配的一段地址区域,这段地址区域映射了RAM和外设寄存器的所有的位,操作相应的地址就相当于操作某一位

GPIO8种模式

代码操作

  • 使用RCC开启GPIO的时钟
  • 使用GPIO_Init函数初始化GPIO
  • 使用输入输出函数控制GPIO

RCC常用函数

// 外设使能或失能
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

GPIO常用函数

// GPIO复位
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
// GPIO初始化
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

typedef struct

  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.
                                      This parameter can be any value of @ref GPIO_pins_define */

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.
                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.
                                      This parameter can be a value of @ref GPIOMode_TypeDef */
GPIO_InitTypeDef;


推挽开漏

推挽输出高低电平均有驱动能力

开漏高电平相当于高阻态,没有驱动能力,低电平有驱动能力

以上是关于stm32读取gpio高低电平速度的主要内容,如果未能解决你的问题,请参考以下文章

STM32学习笔记

stm32 GPIO的八种工作模式

Arduino STM32如何让pa11输出高低电平?

STM32--GPIO口的八种工作模式

在 stm32中如何判断管脚的状态呀·~。。能不能详细的写出来。 比如我要判断PA6是不是为高电平。。。还有字库

关于STM32 GPIO的上拉输入和下拉输入