【STM32】HAL库 STM32CubeMX教程三

前言

上一节我们讲解了STM32CubeMX的基本使用和工程的配置,那么这一节我们正式来学习CubeMX配置STM32的各个外设功能了

今天我们会详细的带你学习STM32CubeMX配置外部中断,并且讲解HAL库的GPIO的各种函数,带你学习不一样的STM32

那么话不多说,我们开始正式的讲解吧!

准备工作:

1、STM32开发板(我的是STM32F407ZE和STM32F103RC)

2、STM32CubeMx软件、 IDE: Keil软件

3、STM32F1xx/STM32F4xxHAL库

4、按键管脚  PA11  PB4

5   LED管脚 PC4 PC5 PB0 PB1

1新建工程

1.1New Project

  • 1 搜索芯片型号

  • 2选择芯片

  • 3创建工程

1.2设置RCC

  • 1 点击RCC

  • 2高速时钟(HSE)选择外部晶振

  • 3 软件自动配置管脚

1.3GPIO初始化

LED:4个GPIO_OUTPUT (输出模式)

按键:2个GPIO_EXITx(外部中断模式)

  • 1 点击对应管脚

  • 2 设置对应模式

GPIO的各种模式设置

  • GPIO output level   引脚电平设置   高/低

  • GPIO mode   GPIO模式     推挽输出/开漏输出

  • GPIO Pull-up/Pull-dowm   上拉下拉电阻      上拉电阻/下拉电阻/无上拉或下拉

  • Maxinum output speed   引脚速度设置   低速/中速/高速

  • User Label    用户标签   给引脚设置名称  如LED0

这里可以看出看和我们使用库函数的时候配置是一样的,但我们只需要动几下鼠标便可以完成操作,这正是STM32CubeMX的强大之处

GPIO_EXIT的6种模式

我们的按键选择下降沿触发

1.4设置NVIC(嵌套向量中断控制器)

  • 1点击NVIC2 勾选EXIT Line

  • 2 interrupt 和 EXIT Line[15:12] interrupt 使能中断

1.5时钟源设置

  • 1选择外部时钟HSE 8MHz

  • 2PLL锁相环倍频9倍

  • 3系统时钟来源选择为PLL

  • 4设置APB1分频器为 /2

  • 1 设置项目名称

  • 2 设置存储路径

  • 3 选择所用IDE

1.7创建工程文件

然后点击GENERATE CODE  创建工程

随后我们可以在stm32f1xx_it.c中看到我们所配置的中断服务函数  并且可以看到gpio的初始化分到了gpio.c里面

我们看到他有一个HAL_GPIO_EXTI_IRQHandler();函数

Go To Definition 查看一下函数代码

和我们库函数配置差不多,就是清除中断标志位,之后进入中断回调函数中

在HAL库中,中断运行结束后不会立刻退出,而是会先进入相对应的中断回调函数,处理该函数中的代码之后,才会退出中断,所以在HAL库中我们一般将中断需要处理代码放在中断回调函数中,

配置下载工具

新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行

所有自己编写的代码请放在/* USER CODE BEGIN XXX */   /* USER CODE END XXX */之间

这样我们修改工程的时候你自己写的代码就不会被删除

HAL库 GPIO函数库讲解

在正常使用中,除了STM32CubeMX配置之外,我们有时候还需要自己配置一些东西,学习并理解HAL库,也是我们必须要学习的一个地方

首先打开stm32f4xx_hal_gpio.h  发现一共定义有8个函数

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

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

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

功能: GPIO初始化

实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin);

功能:在函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值

实例:HAL_GPIO_Init(GPIOC, GPIO_PIN_4);

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:读取引脚的电平状态、函数返回值为0或1

实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);

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

功能:引脚写0或1

实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

翻转引脚的电平状态

实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);    常用在LED上

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

功能:锁住引脚电平,比如说一个管脚的当前状态是1,当这个管脚电平变化时保持锁定时的值。

实例:HAL_GPIO_LockPin(GPIOC, GPIO_PIN_4);

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin);

功能:  外部中断服务函数,清除中断标志位

实例:HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);

功能:  中断回调函数,可以理解为中断函数具体要响应的动作。

实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);

GPIO_InitTypeDef结构体定义

typedef struct

{

uint32_t Pin;       /*!<   选择引脚

*/

uint32_t Mode;      /*!< 设置引脚模式

*/

uint32_t Pull;      /*!< 引脚是否上拉或下拉

*/

uint32_t Speed;     /*!< 设置引脚速度

*/

} GPIO_InitTypeDef;

同时,不管是标准库还是HAL库,都是基于寄存器开发的,寄存器编程在哪个库都是适用的

GPIO的相关配置寄存器

STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这7个寄存器分别为:

GPIOx_CRL:端口配置低寄存器(32位)

GPIOx_CRH:端口配置高寄存器(32位)

GPIOx_IDR:端口输入寄存器(32位)

GPIOx_ODR:端口输出寄存器(32位)

GPIOx_BSRR:端口位设置/清除寄存器(32位)

GPIOx_BRR:端口位清除寄存器(16位)

GPIOx_LCKR:端口配置锁存寄存器(32位)

具体我们这里就不讲了,篇幅有限,可以到《STM32中文参考手册》中查看

关于GPIO的八种模式请参看 《STM32 GPIO八种模式及工作原理详解》

按键消抖:

/**

* 函数功能: 按键外部中断回调函数

* 输入参数: GPIO_Pin:中断引脚

* 返 回 值: 无

* 说    明: 无

*/

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin==KEY1_GPIO_PIN)

{

HAL_Delay(20);/* 延时一小段时间,消除抖动 */

if(HAL_GPIO_ReadPin(KEY1_GPIO,KEY1_GPIO_PIN)==KEY1_DOWN_LEVEL)

{

BEEP_TOGGLE;

LED1_ON;

LED2_ON;

LED3_ON;

}

__HAL_GPIO_EXTI_CLEAR_IT(KEY1_GPIO_PIN);

}

else if(GPIO_Pin==KEY2_GPIO_PIN)

{

HAL_Delay(20);/* 延时一小段时间,消除抖动 */

if(HAL_GPIO_ReadPin(KEY2_GPIO,KEY2_GPIO_PIN)==KEY2_DOWN_LEVEL)

{

BEEP_TOGGLE;

LED1_OFF;

LED2_OFF;

LED3_OFF;

}

__HAL_GPIO_EXTI_CLEAR_IT(KEY2_GPIO_PIN);

}

}

关键字:STM32  HAL库  STM32CubeMX  外部中断  GPIO编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic506636.html本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32CubeMX教程二--基本使用(新建工程点亮LED灯)
下一篇:【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解

  • 关注eeworld公众号
    快捷获取更多信息

  • 关注eeworld服务号
    享受更多官方福利

0

推荐阅读

使用变参函数实现STM32串口的简易printf功能

第一,去掉了原来使用的goto语句,因为C语言中除了错误处理之外,不建议使用goto语句;第二,fmt和pnt的含义更加明确,它们始终指向下一个需要处理的字符和变参;第三,整理了程序结构,使它更加清晰。void uart_printf(USART_TypeDef *USARTx, char *fmt, ...){char *pnt = (char *)&fmt + sizeof(fmt);int len;while (*fmt != '') {if (*fmt == '%') {if (*(fmt + 1) == 'c') {uart_send_byte(USARTx, *(
发表于 2021-05-17
STM32之TIM3_PWM程序

简介:STM32之TIM3_PWM程序详解:调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,亮度的变化就不明显了,所以CCR2_VAL最大设定到17000。原理图:程序分析:int main(void){unsigned char a=0;TIM_OCInitTypeDef TIM3_OCInitStructure;RCC_Configuration();time_ini();SysTick_Config(72000); //配置SYSTICK时钟节拍为1ms一次while(1){Delay(1);//延时1msTIM3_OCInitStructure.TIM_OCMode = TIM
发表于 2021-05-17

STM32输入捕获简介

简介: 输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等.例如:我们用到TIM5_CH1来捕获高电平脉宽,也就是要先设置输入捕获为上升沿检测,记录发生上升沿的时候TIM5_CNT的值。然后配置捕获信号为下降沿捕获,当下降沿到来时,发生捕获,并记录此时的TIM5_CNT值。这样,前后两次TIM5
发表于 2021-05-17
将STM32的标准库编译成lib使用

以前一直使用STM32的标准库,需要一步步地将代码加进去,将编译选项设置好,然后再编译整个工程。这个编译过程是一个相当慢的过程!完全编译大约需要一支烟的时间。每次建立工程都这么编译,是一个相当浪费时间和香烟的过程。于是,我有了将库编译成lib文件的想法。本文就是我将STM32F4的标准库编译成lib文件并在工程中使用的过程。适用对象:1. 熟悉库,不想再看库里边代码2. 有稳定的库,库文件更新不频繁3. 库文件多,每次编译时间长下面是我将STM32F4的标准库编译成lib并在工程中使用的过程:1、建立创建lib的工程2、将库文件拷贝到工程目录:将库里边目录STM32F4xx_StdPeriph_lib v1.0.2STM32
发表于 2021-05-17

STM32 l053r8 的低功耗模式

1.1 STM32 的低功耗模式STM32 降低功耗的方法除了可以通过降低系统时钟和关闭 APB 和 AHB 总线上未被使用的外设时钟以外,最好的方式就是让 STM32 进入低功耗模式了。 STM32 的低功耗模式一共有三种模式:1、睡眠模式。Cortex-M3 内核停止,所有外设包括 Cortex-M3 核心的外设,如:NVIC、系统时钟(SysTick)等仍在运行。2、停止模式。所有时钟都已停止。3、待机模式。1.8V 电源关闭。 三种模式详细如下:在这三种模式中,最低功耗的是待机模式,在待机模式下,最低只需要 2uA左右的电流。停机模式是次低功耗模式,典型电流的消耗在 20uA 左右。最后就是睡眠模式了。1.2 低功耗的操作
发表于 2021-05-17
STM32移植UCGUI实现GPS

在MDK环境下,终于将3.90版本的UCGUI移植到STM32下了,在网上看到的都是例程代码,很少看到有关于在STM32下移植UCGUI的教程方法,为了方便大家,特写此移植方法,大家可以借鉴(有错误之处,望大家指点出来共同讨论!)移植步骤:第一步:首先,得把你的TFT底层驱动写好,既在裸机下,可以正常显示。第二步:加入UCGUI程序包。第三步:配置LCDConf.h GUIConf.h GUITouchConf.h(由于我的液晶不带触摸功能,此配置在此不讲。)配置LCDConf.h文件如下:#ifndef LCDCONF_H#define LCDCONF_H#define LCD_XSIZE (160) //配置TFT的水平
发表于 2021-05-17
(0)

相关推荐