
GPIO Setting for Different Speed
前言
這邊因在操作SPI,但SPI速度提升超過10MHz會出現CPOL/CPHA錯位的怪異現象,後來查詢許多方式,發現貓膩在GPIO設定上面,這邊針對踩雷部份GPIO SPEED SETTING做詳細設定說明,不限定在SPI上面所有通訊協定皆通用。
STM32 GPIO Ports
在STM32上面GPIO結構如下圖
- GPIO_Mode_AIN 模式輸入
- GPIO_Mode_IN_FLOATING 浮空輸入
- GPIO_Mode_IPD 下拉輸入
- GPIO_Mode_IPU 上拉輸入
- GPIO_Mode_Out_OD 開露輸入
- GPIO_Mode_Out_PP 推挽輸出
- GPIO_Mode_AF_OD 復用開漏輸出
- 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:如果输出速度和配置速度不匹配,會明顯看到波形不正常這邊選用高低速差異如下
