MCU学习笔记_外部中断/事件控制器

MCU学习笔记

外部中断/事件控制器

1. IO口外部中断原理概述
2. IO口外部中断HAL库配置方法
3. IO口外部中断HAL库配置例子

1. IO口外部中断原理概述

  • STM32控制器支持的外部中断/事件请求
    在这里插入图片描述
  • IO口外部中断
    STM32每个IO口都可以作为外部中断输入
    每个外部中断线可以独立的配置触发方式(上升沿,下降沿,双边沿触发),触发/屏蔽,专用的状态位。
    STM32供IO使用的中断线只有16个,但STM32F系列的IO口多达上百个
  • GPIO和中断线映射的关系
    M3/M7:配置寄存器SYSCFG_EXTIRx
    MS3:配置寄存器AFIO_EXTIRx
    在这里插入图片描述
    注意:
    不是16个中断线,就对应着16个中断函数;IO口中断在中断向量表中只分配了7个中断向量,即只能使用7个中断函数
    在这里插入图片描述
  • 中断函数列表
    EXTI0_IRQHandler
    EXTI1_IRQHandler
    EXTI2_IRQHandler
    EXTI3_IRQHandler
    EXTI4_IRQHandler
    EXTI9_5_IRQHandler
    EXTI15_10_IRQHandler

2. IO口外部中断HAL库配置方法

  • 外部中断的配置步骤

    1. 使能IO口时钟
    2. 初始化IO口,设置触发方式:HAL_GPIO_Init();
    3. 设置中断优先级,并使能中断通道
    4. 编写中断服务函数:
      函数中调用外部中断通用处理函数HAL_GPIO_EXTI0_IRQHandler
    5. 编写外部中断回调函数:HAL_GPIO_EXTI0_Callback
  • 外部中断配置
    外部中断的中断线映射配置和触发方式都是在GPIO初始化函数中完成。

GPIO_InitTypeDef GPIO_Initure;
GPIO_Initure.Pin= GPIO_Pin_0;//PA0
GPIO_Initure.Mode= GPIO_Mode_IT_RISING;//上升沿触发
GPIO_Initure.Pull= GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
  • 外部中断通用处理函数
    在外部中断服务函数中调用HAL_GPIO_EXTI0_IRQHandler函数处理中断;
    HAL_GPIO_EXTI0_IRQHandler函数内部通过判断中断来源引脚,最终调用外部中断回调函数HAL_GPIO_EXTI0_Callback来处理中断;
HAL_GPIO_EXTI0_IRQHandler;//
HAL_GPIO_EXTI0_Callback;//外部中断回调函数

3. IO口外部中断HAL库配置例子

按键控制LED灯显示

#include "exti.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "exti.h"


/*********************************
使能IO口时钟,初始化IO口,设置触发方式
*********************************/
void EXTI_Init(void)
{
	GPIO_InitTypeDef GPIO_Initure;
	
	__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
	__HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOC时钟
	__HAL_RCC_GPIOH_CLK_ENABLE(); //使能GPIOH时钟

	GPIO_Initure.Pin= GPIO_Pin_0;//PA0
	GPIO_Initure.Mode= GPIO_Mode_IT_RISING;//上升沿触发
	GPIO_Initure.Pull= GPIO_PULLDOWN;//下拉
	GPIO_Initure.Speed= GPIO_SPEED_HIGH;//高速
	HAL_GPIO_Init(GPIOA,&GPIO_Initure);

	GPIO_Initure.Pin= GPIO_Pin_3;//PH3
	GPIO_Initure.Mode= GPIO_Mode_IT_FALLING;//下降沿触发
	GPIO_Initure.Pull= GPIO_PULLUP;//上拉
	GPIO_Initure.Speed= GPIO_SPEED_HIGH;//高速
	HAL_GPIO_Init(GPIOA,&GPIO_Initure);

	GPIO_Initure.Pin= GPIO_Pin_2|GPIO_Pin_3;//PH2,3
	HAL_GPIO_Init(GPIOA,&GPIO_Initure);

/*********************************
设置后中断优先级
*********************************/
	HAL_NVIC_EnableIRQ(EXIT0_IRQn); //
	HAL_NVIC_SetPriority(EXIT0_IRQn,2,0);//

	HAL_NVIC_EnableIRQ(EXIT2_IRQn); //
	HAL_NVIC_SetPriority(EXIT2_IRQn,2,1);//

	HAL_NVIC_EnableIRQ(EXIT0_IRQ3); //
	HAL_NVIC_SetPriority(EXIT0_IRQ3,2,2);//

	HAL_NVIC_EnableIRQ(EXIT15_10_IRQn); //
	HAL_NVIC_SetPriority(EXIT15_10_IRQn,2,3);//
}


/*********************************
编写中断服务函数
*********************************/

void EXTI0_IRQHandler()
{
	HAL_GPIO_EXTI0_IRQHandler(GPIO_PIN_0);
}
void EXTI2_IRQHandler()
{
	HAL_GPIO_EXTI0_IRQHandler(GPIO_PIN_2);
}
void EXTI3_IRQHandler(void)
{
	HAL_GPIO_EXTI0_IRQHandler(GPIO_PIN_3);
}
void EXTI5_10_IRQHandler(void)
{
	HAL_GPIO_EXTI0_IRQHandler(GPIO_PIN_13);
}

/*********************************
编写外部中断回调函数
*********************************/
void HAL_GPIO_EXTI0_Callback()
{
	switch(GPIO_Pin)
	{
		case:GPIO_Pin_0:
			if(WK_UP==1)
			{
				LED1=!LED1;//控制逻辑
				LED0=!LED1;
			}
		break;
		case:GPIO_Pin_13:
			if(KEY2==0)
			{
				LED0=!LED0;//控制逻辑
			}
		break;
		case:GPIO_Pin_2:
			if(KEY1==0)
			{
				LED1=!LED1;//控制逻辑
			}
		break;
		case:GPIO_Pin_3:
			if(KEY0==0)
			{
				LED0=!LED0;//控制逻辑
				LED1=!LED1;
			}
		break;
	}
}

/*********************************
主函数
*********************************/

int main(void)
{
	HAL_Int();//初始化HAL库
	Stm32_Clocu_Init(360,25,2,8);//设置时钟
	delay_init(180);//初始化延时
	uart_int(115200);//初始化USART
	LED_Init();//初始化LED
	EXTI_Init();

	while(1)
	{
		printf("OK\r\n");
		delay_ms(1000);
	}
}

参考资料:正点原子视频 Thanks^^

【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) project(mcu_kit VERSION 0.1.0 DESCRIPTION "mcu-kit SDK" LANGUAGES C ) set(PROJECT_BRIEF "vDiscovery") set(CMAKE_C_STANDARD 11) set(CMAKE_C_EXTENSIONS ON) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_compile_options(-Wall) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") include(CMakePrintHelpers) include(ConfigureChecks) if(EXISTS "${PROJECT_SOURCE_DIR}/config.cmake") include(config.cmake) else() message(FATAL_ERROR "Can't find cmake.config file") endif() if(${CMAKE_CROSSCOMPILING}) set(LV_SIMULATOR_ON_PC OFF) else() set(LV_SIMULATOR_ON_PC ON) endif() configure_file( "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h.in" "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h" ) configure_file( "${PROJECT_SOURCE_DIR}/base/base_config.h.in" "${PROJECT_SOURCE_DIR}/base/base_config.h" ) set(CMAKE_INSTALL_BINDIR ${CMAKE_INSTALL_PREFIX}/bin) set(CMAKE_INSTALL_SBINDIR ${CMAKE_INSTALL_PREFIX}/sbin) set(CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) set(CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/include) set(CMAKE_INSTALL_SYSCONFDIR ${CMAKE_INSTALL_PREFIX}/etc) set(CMAKE_INSTALL_SHARESTATEDIR ${CMAKE_INSTALL_PREFIX}/com) set(CMAKE_INSTALL_LOCALSTATEDIR ${CMAKE_INSTALL_PREFIX}/var) set(CMAKE_INSTALL_INFODIR ${CMAKE_INSTALL_PREFIX}/info) set(CMAKE_INSTALL_LOCALEDIR ${CMAKE_INSTALL_PREFIX}/locate) set(CMAKE_INSTALL_MANDIR ${CMAKE_INSTALL_PREFIX}/man) set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_PREFIX}/doc) set(CMAKE_INSTALL_RESDIR ${CMAKE_INSTALL_PREFIX}) include(PrepareInstall) set(KIT_ROOT_DIR ${CMAKE_SOURCE_DIR}) add_subdirectory("base") # add_subdirectory("third-party") add_subdirectory("lib") add_subdirectory("drivers") add_subdirectory("framework") add_subdirectory("sysapp") add_subdirectory("app") include(GeneratePkgConfig) include(Linux-kitInfo)详细注释一下这段代码
05-25
这段代码是一个 CMakeLists.txt 文件,用于构建一个名为 "mcu_kit" 的项目。下面是对每行代码的详细注释: ```cmake cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) ``` 指定最低的 CMake 版本,如果当前版本不符合要求,则提示错误。 ```cmake project(mcu_kit VERSION 0.1.0 DESCRIPTION "mcu-kit SDK" LANGUAGES C) ``` 定义项目名称、版本、描述和使用的编程语言。 ```cmake set(PROJECT_BRIEF "vDiscovery") ``` 设置一个变量,用于描述项目简介。 ```cmake set(CMAKE_C_STANDARD 11) set(CMAKE_C_EXTENSIONS ON) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 11) ``` 指定使用的 C 和 C++ 标准版本。 ```cmake set(CMAKE_POSITION_INDEPENDENT_CODE ON) ``` 启用位置独立代码(PIC)选项。 ```cmake add_compile_options(-Wall) ``` 添加编译选项,这里添加了 -Wall 选项,表示开启所有警告。 ```cmake list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") ``` 将自定义的 CMake 模块路径添加到 CMAKE_MODULE_PATH 变量中。 ```cmake include(CMakePrintHelpers) include(ConfigureChecks) ``` 包含两个自定义的 CMake 模块,用于输出调试信息和配置检查。 ```cmake if(EXISTS "${PROJECT_SOURCE_DIR}/config.cmake") include(config.cmake) else() message(FATAL_ERROR "Can't find cmake.config file") endif() ``` 如果存在 config.cmake 文件,则包含它,否则输出错误信息并停止构建。 ```cmake if(${CMAKE_CROSSCOMPILING}) set(LV_SIMULATOR_ON_PC OFF) else() set(LV_SIMULATOR_ON_PC ON) endif() ``` 根据交叉编译标志设置变量 LV_SIMULATOR_ON_PC。如果正在交叉编译,则设置为 OFF;否则设置为 ON。 ```cmake configure_file( "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h.in" "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h" ) configure_file( "${PROJECT_SOURCE_DIR}/base/base_config.h.in" "${PROJECT_SOURCE_DIR}/base/base_config.h" ) ``` 配置文件模板,用于生成编译时需要的头文件。 ```cmake set(CMAKE_INSTALL_BINDIR ${CMAKE_INSTALL_PREFIX}/bin) set(CMAKE_INSTALL_SBINDIR ${CMAKE_INSTALL_PREFIX}/sbin) set(CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) set(CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/include) set(CMAKE_INSTALL_SYSCONFDIR ${CMAKE_INSTALL_PREFIX}/etc) set(CMAKE_INSTALL_SHARESTATEDIR ${CMAKE_INSTALL_PREFIX}/com) set(CMAKE_INSTALL_LOCALSTATEDIR ${CMAKE_INSTALL_PREFIX}/var) set(CMAKE_INSTALL_INFODIR ${CMAKE_INSTALL_PREFIX}/info) set(CMAKE_INSTALL_LOCALEDIR ${CMAKE_INSTALL_PREFIX}/locate) set(CMAKE_INSTALL_MANDIR ${CMAKE_INSTALL_PREFIX}/man) set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_PREFIX}/doc) set(CMAKE_INSTALL_RESDIR ${CMAKE_INSTALL_PREFIX}) ``` 设置安装目录的各个子目录。 ```cmake include(PrepareInstall) ``` 包含一个自定义的 CMake 模块,用于准备安装目录。 ```cmake set(KIT_ROOT_DIR ${CMAKE_SOURCE_DIR}) ``` 设置变量 KIT_ROOT_DIR 的值为源代码目录。 ```cmake add_subdirectory("base") add_subdirectory("lib") add_subdirectory("drivers") add_subdirectory("framework") add_subdirectory("sysapp") add_subdirectory("app") ``` 添加子目录,用于构建项目的各个模块。每个子目录都包含了相应的 CMakeLists.txt 文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值