博客
关于我
STM32CubeMX学习笔记(2)——GPIO接口使用
阅读量:321 次
发布时间:2019-03-03

本文共 4643 字,大约阅读时间需要 15 分钟。

STM32CubeMX.GPIO配置指南

一、新建工程

  • 打开 STM32CubeMX 软件,点击“新建工程”。

  • 选择 MCU 和封装。

  • 配置时钟:

    • RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator。
    • 选择 Clock Configuration,配置系统时钟 SYSCLK 为 72MHz。
    • 修改 HCLK 的值为 72,输入回车,软件会自动修改所有配置。
  • 配置调试模式:

    • SYS 设置,选择 Debug 为 Serial Wire。
    • 确保调试器连接正确,以免第一次烧录后续无法识别调试器。
  • 二、GPIO输出配置

    2.1 参数配置

    • 在 System Core 中选择 GPIO 设置。
    • 在右边图中找到 LED 灯对应引脚,选择 GPIO_Output。
    • 在 GPIO output level 中选择 Low 输出低电平点亮,可以添加自定义标签。

    2.2 生成代码

    • 输入项目名和项目路径。
    • 选择应用的 IDE 开发环境 MDK-ARM V5。
    • 勾选:初始化代码生成在对应的外设文件(如 GPIO 初始化代码生成在 gpio.c 中)。
    • 点击 GENERATE CODE 生成代码。

    2.3 HAL库与标准库代码比较

    • STM32CubeMX 使用 HAL 库生成的代码:

      #define LED_G_Pin GPIO_PIN_0
      #define LED_G_GPIO_Port GPIOB
      #define LED_B_Pin GPIO_PIN_1
      #define LED_B_GPIO_Port GPIOB
      static void MX_GPIO_Init(void){
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      __HAL_RCC_GPIOB_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin, GPIO_PIN_SET);
      GPIO_InitStruct.Pin = LED_G_Pin|LED_B_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
      HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin, GPIO_PIN_SET);
      }
    • 使用 STM32 标准库的代码:

      #define LED1_GPIO_PORT     GPIOA
      #define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
      #define LED1_GPIO_PIN GPIO_Pin_8
      #define LED2_GPIO_PORT GPIOB
      #define LED2_GPIO_PIN GPIO_Pin_0
      void LED_GPIO_Config(void){
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK, ENABLE);
      GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
      GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
      GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;
      GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
      GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
      GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
      }
    • 代码对应关系:

      __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
      → RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK, ENABLE);
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
      → GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
      HAL_GPIO_WritePin(GPIOB, LED_G_Pin|LED_B_Pin, GPIO_PIN_SET);
      → GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);

    2.4 使用例子

    int main(void){
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    while(1){
    GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
    HAL_Delay(1000);
    GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
    }
    }

    三、GPIO输入配置

    3.1 参数配置

    • 在 System Core 中选择 GPIO 设置。
    • 在右边图中找到按键对应引脚,选择 GPIO_Input。
    • 设置按键引脚为浮空输入。

    3.2 生成代码

    • 输入项目名和项目路径。
    • 选择应用的 IDE 开发环境 MDK-ARM V5。
    • 点击 GENERATE CODE 生成代码。

    3.3 HAL库与标准库代码比较

    • STM32CubeMX 使用 HAL 库生成的代码:

      #define KEY2_Pin GPIO_PIN_13
      #define KEY2_GPIO_Port GPIOC
      #define KEY1_Pin GPIO_PIN_0
      #define KEY1_GPIO_Port GPIOA
      static void MX_GPIO_Init(void){
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      GPIO_InitStruct.Pin = KEY2_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(KEY2_GPIO_Port, &GPIO_InitStruct);
      GPIO_InitStruct.Pin = KEY1_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
      }
    • 使用 STM32 标准库的代码:

      #define KEY1_GPIO_CLK     RCC_APB2Periph_GPIOA
      #define KEY1_GPIO_PORT GPIOA
      #define KEY1_GPIO_PIN GPIO_Pin_0
      #define KEY2_GPIO_CLK RCC_APB2Periph_GPIOC
      #define KEY2_GPIO_PORT GPIOC
      #define KEY2_GPIO_PIN GPIO_Pin_13
      void Key_GPIO_Config(void){
      GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK, ENABLE);
      GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
      GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
      GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
      GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
      }
    • 代码对应关系:

      __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();
      → RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK, ENABLE);
      HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
      → GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
      HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
      → GPIO_ReadInputDataBit(KEY1_GPIO_PORT, KEY1_GPIO_PIN);

    3.4 使用例子

    int main(void){
    uint8_t status = 0;
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    while(1){
    status = HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin);
    HAL_Delay(1000);
    }
    }

    四、注意事项

    • 用户代码要加在 USER CODE BEGIN NUSER CODE END N 之间,否则下次使用 STM32CubeMX 重新生成代码后,会被删除。

    转载地址:http://whbq.baihongyu.com/

    你可能感兴趣的文章
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    nginx 常用配置记录
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx添加模块与https支持
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>
    Nginx的使用总结(一)
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>