用STM32F407的hal库使用外部中断按键控制变量数字增加
时间: 2023-06-15 18:05:33 浏览: 117
STM32F407实现外部中断【支持STM32F40X系列单片机】
好的,下面是使用STM32F407的HAL库来实现外部中断按键控制变量数字增加的代码示例:
```c
#include "main.h"
// 定义变量和按键引脚
uint32_t count = 0;
uint16_t button_pin = GPIO_PIN_0;
GPIO_TypeDef* button_port = GPIOA;
// 函数声明
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_NVIC_Init(void);
int main(void)
{
// 初始化HAL库
HAL_Init();
// 配置系统时钟
SystemClock_Config();
// 初始化GPIO
MX_GPIO_Init();
// 初始化中断控制器
MX_NVIC_Init();
// 无限循环
while (1)
{
// 延迟一段时间
HAL_Delay(100);
}
}
// 中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// 如果是按钮引脚触发中断
if (GPIO_Pin == button_pin)
{
// 变量加1
count++;
}
}
// GPIO初始化函数
static void MX_GPIO_Init(void)
{
// 定义GPIO初始化结构体
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置按钮引脚为输入模式,上拉
GPIO_InitStruct.Pin = button_pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(button_port, &GPIO_InitStruct);
}
// NVIC初始化函数
static void MX_NVIC_Init(void)
{
// 定义NVIC初始化结构体
NVIC_InitTypeDef NVIC_InitStruct = {0};
// 配置中断优先级
NVIC_InitStruct.Priority = 0;
NVIC_InitStruct.SubPriority = 0;
// 配置中断源
NVIC_InitStruct.Mode = NVIC_MODE_IRQ;
NVIC_InitStruct.Enable = ENABLE;
NVIC_InitStruct.Init.NVIC_IRQChannel = EXTI0_IRQn;
HAL_NVIC_Init(&NVIC_InitStruct);
// 使能中断
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
// 系统时钟配置函数
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 25;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
}
```
这段代码中,我们定义了一个变量 `count`,用来记录数字增加的次数。同时,我们定义了一个按键引脚 `button_pin` 和一个按键端口 `button_port`,用来控制数字增加。在 `main` 函数中,我们初始化了HAL库、系统时钟、GPIO和中断控制器,并进入一个无限循环中。在中断回调函数 `HAL_GPIO_EXTI_Callback` 中,我们检测到了按键引脚触发了中断,并对变量 `count` 进行了加1操作。在GPIO初始化函数 `MX_GPIO_Init` 中,我们将按键引脚配置为输入模式,并开启上拉电阻。在NVIC初始化函数 `MX_NVIC_Init` 中,我们配置了中断优先级和中断源,并开启了中断。
需要注意的是,这段代码只是提供了一个基本的框架,如果你想要实现更多的功能,比如按键消抖、数码管显示等,还需要根据自己的需求进行进一步的编写。
阅读全文