• 使用STM32CubeMX实现LED闪烁


    需提前学习:STM32CubeMX新建工程并点亮一个LED

    目录

    打开GPIO相关文件

    我们需要看的部分

    HAL_GPIO_ReadPin()

    HAL_GPIO_WritePin()

    函数声明

    GPIOx 

    GPIO_Pin

    PinState

    HAL_GPIO_TogglePin()

    函数声明

    GPIOx和GPIO_Pin

    HAL_GPIO_LockPin()

    函数声明

    GPIOx和GPIO_Pin

    返回值

    延时函数

    实验

    使用HAL_GPIO_TogglePin()实现闪烁

    使用HAL_GPIO_WritePin()实现闪烁


    首先还是我们点灯的工程文件,本文我主要介绍GPIO相关库函数的使用。

    打开GPIO相关文件

    在Drivers/STM32F1xx_HAL_Driver文件夹下找到stm32f1xx_hal_gpio.c文件,双击即可打开。 

    我们需要看的部分

    这个文件中,我们只需要看How to use this driver部分。这部分介绍了GPIO的HAL库使用。

    一些不重要的部分我就不说了,会讲解的部分在下图标号了。其他部分都不太重要,想了解的可以用翻译软件翻译一下。

    HAL_GPIO_ReadPin()

    这个是引脚为输入才使用的函数,我们点亮LED为输出,所以用不了。就先不介绍了,之后在按键扫描的时候说。

    HAL_GPIO_WritePin()

    函数声明

    void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

    GPIOx 

    这个是设置为哪个端口,现在我们是想让PB5输出,所以应该在函数中传入GPIOB。

    可选参数如下

    1. #define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)
    2. #define GPIOB ((GPIO_TypeDef *)GPIOB_BASE)
    3. #define GPIOC ((GPIO_TypeDef *)GPIOC_BASE)
    4. #define GPIOD ((GPIO_TypeDef *)GPIOD_BASE)
    5. #define GPIOE ((GPIO_TypeDef *)GPIOE_BASE)
    6. #define GPIOF ((GPIO_TypeDef *)GPIOF_BASE)
    7. #define GPIOG ((GPIO_TypeDef *)GPIOG_BASE)

    GPIO_Pin

    这个是设置让哪个引脚输出,现在我们是想让PB5输出,所以应该在函数中传入GPIO_PIN_5。

    可选参数如下。

    注意一下,GPIO_PIN_All就是同时控制PIN0到PIN15共16个引脚。

    1. #define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */
    2. #define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */
    3. #define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */
    4. #define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */
    5. #define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */
    6. #define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */
    7. #define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */
    8. #define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */
    9. #define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */
    10. #define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */
    11. #define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */
    12. #define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */
    13. #define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */
    14. #define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */
    15. #define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */
    16. #define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */
    17. #define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */

    PinState

    这个是设置指定引脚输出高电平还是低电平。

    1. GPIO_PIN_RESET //引脚输出低电平
    2. GPIO_PIN_SET //引脚输出高电平

    HAL_GPIO_TogglePin()

    让指定引脚电平反转,意思就是如果指定的引脚原来是高电平,使用这个函数之后就是低电平。如果原来是高电平,使用这个函数之后就是低电平。

    函数声明

    void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

    GPIOx和GPIO_Pin

    同上

    HAL_GPIO_LockPin()

    这个是用于锁死指定引脚输出的。如果指定引脚为高电平,使用这个函数之后,引脚只能为高电平。就算你之后调用HAL_GPIO_TogglePin()或者HAL_GPIO_WritePin()更改他的输出,也做不到。

    改引脚直至程序复位(按下复位键,或者拔下供电口重新插上),才会解锁。

    函数声明

    HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

    GPIOx和GPIO_Pin

    同上

    返回值

    我们看这个函数的返回值,如果锁死成功返回HAL_OK。锁死失败返回HAL_ERROR 

    1. if ((uint32_t)(GPIOx->LCKR & GPIO_LCKR_LCKK))
    2. {
    3. return HAL_OK;
    4. }
    5. else
    6. {
    7. return HAL_ERROR;
    8. }

    延时函数

    HAL自带延时函数HAL_Delay(x)。单位为ms

    实验

    现在我们知道了这几个函数了。HAL_GPIO_ReadPin()用不了,HAL_GPIO_LockPin()新手不建议使用。我们现在分别使用HAL_GPIO_TogglePin()和HAL_GPIO_WritePin()函数实现。

    注意:这里的LED_R_GPIO_Port是GPIOB,LED_R_Pin是GPIO_PIN_5

    详情请看:STM32CubeMX新建工程并点亮一个LED的 新建工程->User Label部分

    使用HAL_GPIO_TogglePin()实现闪烁

    我只提供while(1)中程序,其他地方不用改动。

    1. while (1)
    2. {
    3. /* USER CODE END WHILE */
    4. HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);
    5. HAL_Delay(1000);
    6. /* USER CODE BEGIN 3 */
    7. }

    使用HAL_GPIO_WritePin()实现闪烁

    1. while (1)
    2. {
    3. /* USER CODE END WHILE */
    4. HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);
    5. HAL_Delay(1000);
    6. HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_RESET);
    7. HAL_Delay(1000);
    8. /* USER CODE BEGIN 3 */
    9. }

  • 相关阅读:
    艾美捷热转移稳定性检测试剂盒解决方案
    Linux内核源码分析 1:Linux内核体系架构和学习路线
    java毕业设计钢材商贸公司网络购销管理系统Mybatis+系统+数据库+调试部署
    taro 支付宝/微信小程序的chooseImage真机和开发工具上的区别
    python requests之charles代理配置
    sass基本使用总结
    软件Bug和缺陷的区别是什么?
    开源WIFI继电器之硬件电路
    【论文阅读】CVPR2021: MP3: A Unified Model to Map, Perceive, Predict and Plan
    成集云 | 多维表自动查询快递100信息 | 解决方案
  • 原文地址:https://blog.csdn.net/qq_63922192/article/details/127912514