你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】【STM32F0系列学习】之—通用输入输出端口(GPIO)

[复制链接]
STMCU小助手 发布时间:2021-11-21 22:00
1、GPIO介绍
STM32F0x1/STM32F0x2/STM32F0x8系列每个通用I/O口都有4个32位配置寄存器(GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR 和 GPIOx_PUPDR),2个32位数据寄存器(GPIOx_IDR and GPIOx_ODR)和 1 个32位置位 / 复位寄存器 (GPIOx_BSRR)。GPIOA 和GPIOB 还含有 1 个 32 位锁定寄存器 (GPIOx_LCKR) 和 2 个 32 位替代功能寄存器 (GPIOx_AFRH and GPIOx_AFRL)

2、GPIO主要特性
输出状态: 带有上拉或下拉的推挽输出或开漏输出
从输出数据寄存器 (GPIOx_ODR) 或外设 ( 复用功能输出 ) 输出数据
可选的每个 I/O 口的速度
输入状态: 浮空、 上拉 / 下拉、 模拟输入
从输入数据寄存器 (GPIOx_IDR) 或外设输入数据 ( 复用功能输出 )
位置位 / 复位寄存器 (GPIOx_BSRR) 为对 GPIOx_ODR 寄存器提供位访问能力
GPIO端口锁定机制(GPIOx_LCKR) 配置
模拟功能
可选的复用功能
每两个时钟周期快速切换I/O值的能力
允许GPIO口和外设引脚的高灵活性复用

3、GPIO 功能描述
根据数据手册中列出的每个 I/O 端口的特定硬件特征, GPIO 端口的每个位可以由软件分别配
置成多种模式:

浮空输入
上拉输入
下拉输入
模拟输入
具有上拉或下拉能力的开漏输出
具有上拉或下拉能力的推挽输出
复用功能且具有上拉或下拉能力的推挽输出
复用功能且具有上拉或下拉能力的开漏输出
每个 I/O 端口位可以自由编程, 然而 I/0 端口寄存器可按 32 位字, 半字或字节访问。 GPIOx_
BSRR 寄存器允许对任何 GPIO 寄存器进行位读 / 改写访问。 这种情况下, 在读和更改访问之
间产生 IRQ 时也不会发生危险。

标准I/O端口位的基本结构

20200624112800430.png


5V 容忍I/O端口位的基本结构

20200624112816556.png


4、GPIO端口配置说明
① GPIO模式
GPIO_Mode_IN          输入模式 ( 复位状态 )
GPIO_Mode_OUT      通用输出模式
GPIO_Mode_AF         复用功能模式
GPIO_Mode_AN         模拟模式

输出模式类型:
GPIO_OType_PP        推免输出
GPIO_OType_OD        开漏输出

② 是否带上/下拉
GPIO_NOPULL               不带上/下拉
GPIO_PULLUP               带上拉
GPIO_PULLDOWN         带下拉

③ 输出速度
GPIO_Speed_2MHz            2 MHz
GPIO_Speed_10MHz         10 MHz
GPIO_Speed_50MHz         50 MHz

5、GPIO工作模式配置
5.1【标准库】的配置方式
步骤:
1、配置对应端口的RCC时钟

  1. /************************************************
  2. 函数名称 : RCC_Configuration
  3. 功    能 : 时钟配置
  4. 参    数 : 无
  5. 返 回 值 : 无
  6. 作    者 : JayYang
  7. *************************************************/
  8. void RCC_Configuration(void)
  9. {
  10.   /* 使能AHB时钟 */
  11.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
  12.                         RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
  13. }
复制代码

2、配置GPIO工作模式

  1. /************************************************
  2. 函数名称 : GPIO_Configuration
  3. 功    能 : 基本输入输出引脚配置
  4. 参    数 : 无
  5. 返 回 值 : 无
  6. 作    者 : JayYang
  7. *************************************************/
  8. void GPIO_Configuration(void)
  9. {
  10.     GPIO_InitTypeDef GPIO_InitStructure;                  // 定义GPIO初始化结构体

  11.     //GPIO配置为 推免输出模式
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式
  14.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
  16.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
  17.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的0脚为高速推免输出模式

  18.     //GPIO配置为 开漏输出模式
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;             // 配置使用的GPIO管脚号:1
  20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;         // 设置GPIO的模式为输出模式
  21.     GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;        // 设置端口输出类型为:开漏输出
  22.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
  23.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
  24.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的1脚为开漏输出模式

  25.     //GPIO配置为 上拉输入模式
  26.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;            // 配置使用的GPIO管脚号:12
  27.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式
  28.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          // 配置 I/O 口的上拉或下拉:上拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_DOWN
  29.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的12脚为上拉输入模式

  30.     //GPIO配置为 下拉输入模式
  31.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;            // 配置使用的GPIO管脚号:13
  32.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;          // 设置GPIO的模式为输入模式
  33.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;        // 配置 I/O 口的上拉或下拉:下拉,还可选:GPIO_PuPd_NOPULL,GPIO_PuPd_UP
  34.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的13脚为下拉输入模式

  35.     //GPIO配置为 模拟输入输出模式
  36.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;             // 配置使用的GPIO管脚号:0
  37.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;          // 设置GPIO的模式为输入模式
  38.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
  39.     GPIO_Init(GPIOC, &GPIO_InitStructure);                // 初始化GPIOC的0脚为模拟输入模式

  40.     //GPIO配置为 复用输出模式
  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             // 配置使用的GPIO管脚号:9
  42.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          // 设置GPIO的模式为复用模式
  43.     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        // 设置端口输出类型为:推免输出
  44.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     // 配置 I/O 口的速度为:50MHz,还可选:GPIO_Speed_2MHz,GPIO_Speed_10MHz
  45.     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;     // 配置 I/O 口的上拉或下拉:无上下拉(浮空),还可选:GPIO_PuPd_UP,GPIO_PuPd_DOWN
  46.     GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化GPIOA的9脚为复用推免输出模式
  47.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_2);  // 配置GPIOA的9号引脚复用为 TIM1_CH2 定时器1的通道2输出引脚

  48. }
复制代码


5.2【HAL库】的配置方式

步骤:
1、通过STM32CubeMX软件配置RCC时钟

20200624152114980.png


选择【Clock Configutration】选项卡进行时钟的设置,如图下图:
20200624152258136.png


2、选择需要配置的GPIO引脚的输入输出模式,这边的配置只是一个大方面的配置,比如是要配置为输入还是输出

20200624153132751.png


下面进行每个管脚的具体参数配置

2020062415342131.png


点击 上图中的 GPIO 后会在左侧显示所有使用到的GPIO管脚,进入如下界面,点击每一个管脚可以进行详细配置:

20200624153642205.png


20200624154553694.png


在【gpio.c】文件下,查看生成的GPIO工作模式配置代码,此处配置的是推免输出、开漏输出、上下拉输入和模拟输入的引脚

  1. void MX_GPIO_Init(void)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};

  4.   /* GPIO Ports Clock Enable */
  5.   __HAL_RCC_GPIOC_CLK_ENABLE();
  6.   __HAL_RCC_GPIOF_CLK_ENABLE();
  7.   __HAL_RCC_GPIOA_CLK_ENABLE();

  8.   /*Configure GPIO pin Output Level */
  9.   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);

  10.   /*Configure GPIO pin : PC13 */
  11.   GPIO_InitStruct.Pin = GPIO_PIN_13;
  12.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  13.   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  14.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  15.   /*Configure GPIO pin : PC0 */
  16.   GPIO_InitStruct.Pin = GPIO_PIN_0;
  17.   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  18.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  19.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  20.   /*Configure GPIO pin : PA0 */
  21.   GPIO_InitStruct.Pin = GPIO_PIN_0;
  22.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  23.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  24.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  25.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  26.   /*Configure GPIO pin : PA1 */
  27.   GPIO_InitStruct.Pin = GPIO_PIN_1;
  28.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  29.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  30.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  31.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  32.   /*Configure GPIO pin : PC12 */
  33.   GPIO_InitStruct.Pin = GPIO_PIN_12;
  34.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  35.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  36.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  37. }
复制代码

至于复用功能的引脚,比如此例中将 PA9 复用为 TIM1_CH2 定时器1的通道2,则需要在tim.c文件中查看代码,一般都在相应外设的初始化源文件中

  1. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
  2. {

  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   if(timHandle->Instance==TIM1)
  5.   {
  6.   /* USER CODE BEGIN TIM1_MspPostInit 0 */

  7.   /* USER CODE END TIM1_MspPostInit 0 */

  8.     __HAL_RCC_GPIOA_CLK_ENABLE();
  9.     /**TIM1 GPIO Configuration   
  10.     PA9     ------> TIM1_CH2
  11.     */
  12.     GPIO_InitStruct.Pin = GPIO_PIN_9;                        //使用9号引脚
  13.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;                //配置为复用推免输出模式
  14.     GPIO_InitStruct.Pull = GPIO_NOPULL;                        //没有上下拉
  15.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;        //高速输出
  16.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM1;        //复用为定时器1的通道2
  17.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  18.   /* USER CODE BEGIN TIM1_MspPostInit 1 */

  19.   /* USER CODE END TIM1_MspPostInit 1 */
  20.   }

  21. }
复制代码

至此,关于STM32F0系列的GPIO的配置以学习记录完成,如有不对的地方,希望各位看官指出,谢谢大家!




收藏 评论0 发布时间:2021-11-21 22:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版