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

本文共 4553 字,大约阅读时间需要 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 GPIOBstatic 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_0void 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 GPIOAstatic 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_13void 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配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NI笔试——大数加法
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>
    No fallbackFactory instance of type class com.ruoyi---SpringCloud Alibaba_若依微服务框架改造---工作笔记005
    查看>>
    No module named cv2
    查看>>
    No module named tensorboard.main在安装tensorboardX的时候遇到的问题
    查看>>
    No qualifying bean of type XXX found for dependency XXX.
    查看>>
    No resource identifier found for attribute 'srcCompat' in package的解决办法
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>