GPIO Setting for Different Speed

前言

這邊因在操作SPI,但SPI速度提升超過10MHz會出現CPOL/CPHA錯位的怪異現象,後來查詢許多方式,發現貓膩在GPIO設定上面,這邊針對踩雷部份GPIO SPEED SETTING做詳細設定說明,不限定在SPI上面所有通訊協定皆通用。

 STM32 GPIO Ports 

在STM32上面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 復用推挽輸出

 STM32 GPIO Speed

STM32CubeMX配置GPIO 輸出引腳,都會有速度GPIO_InitStruct.Speed

  GPIO_InitStruct.Pin = GPIO_PIN_5;	
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;	
  GPIO_InitStruct.Pull = GPIO_NOPULL;	
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;	
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

不同MCU型號,速度選項,有些有3個,有些有4個。一般定義在xxx_gpio.h文件中

#define GPIO_Speed_2MHz  GPIO_Speed_Level_1   /*!< I/O output speed: Low 2 MHz  */	
#define GPIO_Speed_10MHz GPIO_Speed_Level_2   /*!< I/O output speed: Medium 10 MHz */	
#define GPIO_Speed_50MHz GPIO_Speed_Level_3   /*!< I/O output speed: High 50 MHz */
#define  GPIO_SPEED_FREQ_LOW        (0x00000000u)  /*!< Low speed       */	
#define  GPIO_SPEED_FREQ_MEDIUM     (0x00000001u)  /*!< Medium speed    */	
#define  GPIO_SPEED_FREQ_HIGH       (0x00000002u)  /*!< High speed      */	
#define  GPIO_SPEED_FREQ_VERY_HIGH  (0x00000003u)  /*!< Very high speed */

STM32CubeMX配置,這邊default為設置最低因此如果要更動到其他高傳輸速度需要更動設定

PS:如果输出速度和配置速度不匹配,會明顯看到波形不正常這邊選用高低速差異如下

Leave a Comment

Your email address will not be published. Required fields are marked *

Shopping Cart