【学习笔记】STM32F407探索者HAL库开发(三)IO分配

在这里插入图片描述

1 STM32F407 IO资源分配表

IO分配就是在完成最小系统设计以后,根据项目需要对 MCU的 IO口进行分配,连接不同的器件,从而实现整体功能。比如: GPIO、 IIC、 SPI、 SDIO、 FSMC、 USB、中断等。遵循:先分配特定外设 IO,再分配通用 IO,最后微调的原则。

分配外设说明
特定外设IICIIC 一般用到 2 根线:IIC_SCL 和 IIC_SDA(ST 叫 I2C)数据手册有 I2C_SCL、I2C_SDA 复用功能的GPIO 都可选用。
特定外设SPISPI 用到 4 根线:SPI_CS/MOSI/MISO/SCK 一般 SPI_CS 我们使用通用 GPIO 即可,方便挂多个 SPI 器件数据手册有 SPI_MOSI/MISO/SCK 复用功能的GPIO 都可选用。
特定外设TIM根据需要可选:TIM_CH1/2/3/4/ETR/1N/2N/3N/BKIN 等,数据手册有 TIM_CH1/2/3/4/ETR/1N/2N/3N/BKIN 复用功能的GPIO 都可选用。
特定外设USART/UARTUSART 有USART_TX/RX/CTS/RTS/CK 信号,UART 仅有UART_TX/RX 两个信号,一般用到 2 根线:U(S)ART_TX 和U(S)ART_RX,数据手册有 U(S)ART_TX/RX 复用功能的GPIO 都可选用。
特定外设USBUSB 用到 2 根线:USB_DP 和USB_DM,数据手册有 USB_DP、USB_DM 复用功能的GPIO 都可选用。
特定外设CANCAN 用到 2 根线:CAN_RX 和 CAN_TX,数据手册有 USB_DP、USB_DM 复用功能的GPIO 都可选用。
特定外设ADCADC 根据需要可选:ADC_IN0 ~ ADC_IN15,数据手册有 ADC_IN0 ~ ADC_IN15 复用功能的GPIO 都可选用。
特定外设DACDAC 根据需要可选:DAC_OUT1 / DAC_OUT2,DAC 固定为:DAC_OUT1 使用 PA4、DAC_OUT2 使用 PA5。
特定外设SDIOSDIO 一般用到 6 根线:SDIO_D0/1/2/3/SCK/CMD,数据手册有 SDIO_D0/1/2/3/SCK/CMD 复用功能的GPIO 都可选用。
特定外设FSMC根据需要可选:FSMC_D0~15 / A0~25/ NBL0~1 / NE1~4 / NCE2~3 / NOE / NWE / NWAIT / CLK 等。数据手册有 FSMC_D0~15 / A0~25 / NBL0~1 / NE1~4 / NCE2~3 / NOE / NWE/NWAIT/CLK 复用功能的GPIO 都可选用。
通用GPIO在完成特定外设的IO 分配以后,就可以进行GPIO 分配了,比如将按键、LED、蜂鸣器等仅需要高低电平读取/输出的外设连接到空闲的普通GPIO 即可。
微调IO微调主要包括两部分:1,当 IO 不够用的时候,通用GPIO 和特定外设可能要共用 IO 口。2,为了方便布线,可能要调整某些IO口的位置。这两点,得根据实际情况进行调整设置,做到:尽可能多的可以同时使用所有功能,尽可能方便布线。

2 STM32F407ZGT6 引脚定义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 IO分配的重要性

3.1 硬件设计优化

  1. 资源合理利用
    STM32 微控制器通常具有丰富的 I/O 引脚,但不同型号的芯片在 I/O 数量和功能上会有所差异。了解 IO 分配可以帮助设计师根据具体项目需求,合理选择芯片型号,并充分利用可用的 I/O 资源,避免资源浪费。
  2. 外设连接
    在硬件设计中,需要将各种外设连接到 STM32 的 I/O 引脚。了解 IO 分配可以确保正确地连接外设,避免引脚冲突和错误连接。例如,将 UART 通信模块连接到正确的 I/O 引脚,以实现与其他设备的通信。
  3. 信号完整性
    合理的 IO 分配可以提高信号完整性。通过将高速信号和敏感信号分配到合适的 I/O 引脚,可以减少信号干扰和噪声,提高系统的稳定性和可靠性。例如,将高速数字信号分配到具有较短布线长度和较少干扰的 I/O 引脚。

3.2 软件编程

  1. 驱动开发
    了解 IO 分配对于编写 STM32 的驱动程序非常重要。在驱动开发中,需要根据具体的 I/O 引脚配置来初始化和控制外设。例如,配置 GPIO 引脚为输入或输出模式,设置中断触发方式等。
  2. 代码可维护性
    合理的 IO 分配可以提高代码的可维护性。通过使用有意义的引脚名称和注释,可以使代码更加清晰易懂,便于后续的维护和升级。例如,将连接到 LED 的 GPIO 引脚命名为 “LED_PIN”,并在代码中添加注释说明其功能。
  3. 跨平台移植
    如果需要将代码移植到不同型号的 STM32 芯片上,了解 IO 分配可以使移植过程更加顺利。通过使用相对的引脚编号或宏定义,可以在不同芯片之间轻松调整 I/O 分配,减少移植工作量。

3.3 系统性能提升

  1. 功耗管理
    合理的 IO 分配可以帮助实现功耗管理。通过将不使用的 I/O 引脚设置为低功耗模式,可以降低系统的整体功耗。例如,将未连接外设的 GPIO 引脚设置为输入下拉模式,以减少漏电流。
  2. 中断处理
    了解 IO 分配可以优化中断处理。通过将中断源连接到合适的 I/O 引脚,并正确配置中断优先级和触发方式,可以提高系统的响应速度和实时性。例如,将紧急中断信号连接到具有较高中断优先级的 I/O 引脚。
  3. 并行处理
    在某些应用中,需要同时处理多个任务。了解 IO 分配可以实现并行处理,提高系统的性能。例如,将多个传感器连接到不同的 I/O 引脚,并使用中断或 DMA 方式同时采集数据。

4 F1/F7/H7芯片的IO分配差异

不同系列的 STM32 芯片的 IO 分配存在一些差异,主要体现在以下方面。

4.1 引脚数量和分组

  1. STM32F1 系列:以 STM32F103ZET6 芯片为例,它是 144 脚的芯片,具有 GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF 和 GPIOG 七组 GPIO 口,每组 16 个 IO 口,共有 112 个 IO 口可供编程使用。
  2. STM32F4 系列:如 STM32F407ZGT6 芯片,一共分成 A - G 组,每一组里面有 16 个 IO 口(以 0 - 15 进行编号),所以这款芯片一共有 112 个 GPIO 口。
  3. STM32H7 系列:以 STM32H750VBT6 芯片为例,它是 100 脚的芯片,IO 口有 82 个,分为 5 组,分别是 GPIOA - GPIOE,其中 GPIOA - GPIOE 有 16 * 5 = 80 个 IO 口,另外两个是 PH0 和 PH1,用于连接外部高速晶振。

4.2 功能模式

不同系列的 STM32 芯片都具备多种 GPIO 功能模式,但在一些细节上可能存在差异。常见的功能模式包括:

4.2.1 输入模式

  1. 浮空输入:引脚的电平完全由外部电路决定,如果引脚没有连接其他设备,其输入电平不确定,可用于按键检测等,如 STM32F1、F4、H7 系列都有此模式。
  2. 上拉输入:内部上拉电阻导通,默认引脚为高电平,但上拉电流较小,为 “弱上拉”,在需要外部上拉电阻时可节省一个外部电阻,各系列基本都具备。
  3. 下拉输入:内部下拉电阻导通,默认引脚为低电平,同样为 “弱下拉”,STM32F1、F4、H7 等系列具有此模式。
  4. 模拟输入:用于 ADC 采集或 DAC 输出,或者在低功耗下省电,施密特触发器关闭,双 MOS 管也关闭,常见于各系列芯片。

4.2.2 输出模式

  1. 开漏输出:输出端相当于三极管的集电极,所以要得到高电平必须要接上拉电阻,这种模式得到的输出电流比较大,适合做电流型的驱动,其吸收电流的能力相对强(一般在20ma左右)。 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点是通过改变供 上拉电源的电压,便可以改变传输电平。比如加上上拉电阻就可以提供TTL/CMOS 电平输出等。这种模式下,芯片内部的 P - MOS 管被关闭,N - MOS 管受输出寄存器控制。当输出寄存器为 “0” 时,N - MOS 导通,引脚输出低电平;当输出寄存器为 “1” 时,N - MOS 截止,引脚呈现高阻态。可以实现 “线与” 功能,常用于 IIC 等需要多设备共享总线的通信场景,如 STM32F1、F4、H7 系列均支持。
    在这里插入图片描述

  2. 推挽输出
    可以输出高、低电平,连接数字器件;简单点来说就是这种模式下,你的输出是严格的数字信号,所以可以直接连接数字器件,但是由于不能获得大电流的输出,不能用来接需要大电流驱动的外设。推挽电路是由两个参数相同的三极管或者MOS组成,这种电路的优点是既提高了电路的负载能力,又提高了开关速度。芯片内部的 P - MOS 和 N - MOS 管根据输出寄存器的值交替导通。当输出 “0” 时,P - MOS 截止,N - MOS 导通,引脚连接到 VSS(地),输出低电平;当输出 “1” 时,P - MOS 导通,N - MOS 截止,引脚连接到 VDD,输出高电平。该模式驱动能力较强,可输出较大电流,常用于驱动 LED 灯等外设,各系列基本都支持。
    在这里插入图片描述

4.2.3 复用功能模式

  1. 复用开漏输出:GPIO 口被用作第二功能时的配置情况,此时输出为开漏模式,常用于片上外设功能,如 STM32F1、F4、H7 系列中的一些特定外设引脚。
  2. 复用推挽输出:GPIO 口用作第二功能时,输出为推挽模式,也是用于片上外设功能,不同系列的具体复用功能引脚会有所不同。

4.3 电气特性:

  1. 工作电压:不同系列的 STM32 芯片工作电压范围可能有所不同。例如,STM32F1 的工作电压为 2V ≤ VDD ≤ 3.6V,而 STM32H7 的工作电压范围可能会有所差异。
  2. 输出电流:单个 GPIO 的最大输出电流也可能存在差别。比如,有的系列单个 GPIO 最大输出电流为 25mA,但不同系列在具体的电流驱动能力上可能会根据芯片的性能和定位有所调整。
  3. 引脚的电平兼容性:部分 STM32 系列的芯片引脚对不同电平的兼容性不同。例如,STM32H750 的绝大部分 IO 口都兼容 5V,凡是有 FT 标志的,都是兼容 5V 电平的 IO 口,可以直接接 5V 的外设;而没有 FT 标志的引脚则不建议接 5V,否则可能烧坏 MCU。而其他系列的芯片可能在引脚的电平兼容性上有不同的规定和限制。

4.4 复用功能的多样性

不同系列的 STM32 芯片由于面向的应用场景和具备的外设资源不同,其 GPIO 引脚的复用功能也会有很大差异。例如,STM32F1 系列可能在某些特定引脚具有特定的复用功能,如串口、SPI 等外设的对应引脚;而 STM32F4 系列由于其性能和外设资源的丰富性,可能在更多的引脚或者特定的引脚组上具有更复杂多样的复用功能,如以太网、USB 等高速外设的引脚复用。STM32H7 系列则可能在高性能计算和高速通信等方面具有独特的复用功能配置,以满足其在高端应用场景下的需求。

4.5 速度等级

不同系列的 STM32 芯片 GPIO 的速度等级可能不同。一些高性能的系列可能支持更高的速度等级,以满足对数据传输速度要求较高的应用场景,例如高速通信接口、实时数据采集等。而较低性能的系列可能速度等级相对较低,适用于对速度要求不那么高的一般性应用。在配置 GPIO 时,需要根据具体的应用需求和芯片的数据手册来选择合适的速度等级,以确保信号的正确传输和系统的稳定性。

在这里插入图片描述

注:笔记内容来自正点原子官方HAL库开发教程,配合STM32F407探索者开发板

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F407探索者开发板是一款基于STM32F407芯片的开发板,它提供了丰富的外设和接口,方便开发者进行各种应用的开发HAL库STM32Cube软件包中的一个组件,它提供了一套高级别的API函数,简化了对STM32外设的操作。 TCS34725是一款数字式颜色传感器,可以用于检测周围环境的颜色。下面是一个使用HAL库驱动TCS34725的示例代码: ```c #include "stm32f4xx_hal.h" #include "tcs34725.h" I2C_HandleTypeDef hi2c1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_I2C1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_I2C1_Init(); TCS34725_Init(&hi2c1); while (1) { uint16_t red, green, blue, clear; TCS34725_GetRawData(&hi2c1, &red, &green, &blue, &clear); // 在这里可以根据读取到的颜色数据进行相应的处理 HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } static void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 400000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 = 0; hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 = 0; hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(&hi2c1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); 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); } ``` 这段代码使用了HAL库的I2C和GPIO模块来初始化和操作TCS34725传感器。在主循环中,通过调用TCS34725_GetRawData函数可以获取到传感器读取到的原始颜色数据,你可以根据需要进行相应的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值