历史上的今天
今天是:2024年08月29日(星期四)
2019年08月29日 | STM32F429 >> 7. 中断
2019-08-29 来源:eefocus
本工程板级支持包文件适用于野火stm32f429 开发板。
STM32 的中断主要涉及两个部分,NVIC 和EXTI
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能;外部中断/事件控制器(EXTI)可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
EXTI 可分为两大功能:产生中断 和 产生事件
当其产生中断时,其中断线路将输入信号输入到NVIC,进一步运行中断服务函数,实现功能(其输出最终被映射到NVIC的相应通道。);而当其产生事件时,则是传输一个脉冲信号给其他外设使用

EXTI 是在APB2 总线上的

EXTI0 至 EXTI15 用于 GPIO,通过编程控制可以实现任意一个 GPIO 作为 EXTI的输
入源。
编程要点
配置NVIC
a. 设置优先级组
b. 配置 NVIC_InitStructure
c. 使能 NVIC
配置EXTI
a. 开启 EXTI 时钟
b. 连接 EXTI 到中断源
c. 配置 EXTI 初始化结构体
d. 使能 EXTI
编写EXTI 中断服务函数
bsp_exti.c
NVIC_Init() 函数在misc.c 中
/**
******************************************************************************
* @file bsp_exti.c
* @author Waao
* @version V1.0.0
* @date 21-Dec-2018
* @brief This file contains some board support package's functions for the configuration of the NVIC.
*
******************************************************************************
* @attention
*
* None
*
******************************************************************************
*/
#include #include #include /** * @brief Configure the NVIC * @param None * @retval None */ static void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; //Configure the NVIC to prioritygroup1 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //Configure the preemption priority to 1 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //Configure the subpriority to 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //Enable the interrupt channel NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //Configure the interrupt channel NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = KEY2_INT_EXTI_IRQ; NVIC_Init(&NVIC_InitStructure); } /** * @brief Configure the EXTI * @param None * @retval None */ void EXTI_Key_Config(void) { EXTI_InitTypeDef EXTI_InitStructure; KEY_GPIO_Config(); LED_GPIO_Config(); //Enable the clock of the SYSCFG(must do that when use the GPIO external interrupt) RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); NVIC_Configuration(); //Connect the exti interrupt source to key1 pin SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE); //Choice the exti interrupt source EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE; //Choice the mode EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //Choice the trigger type EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //Enable EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); //Connect the exti interrupt source to key1 pin SYSCFG_EXTILineConfig(KEY2_INT_EXTI_PORTSOURCE, KEY2_INT_EXTI_PINSOURCE); EXTI_InitStructure.EXTI_Line = KEY2_INT_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } bsp_exti.h /** ****************************************************************************** * @file bsp_exti.h * @author Waao * @version V1.0.0 * @date 21-Dec-2018 * @brief This file contains some board support package's definition for the exti. * ****************************************************************************** * @attention * * None * ****************************************************************************** */ #ifndef __EXTI_H_ #define __EXTI_H_ #include /*******************************************************/ #define KEY1_INT_GPIO_PORT GPIOA #define KEY1_INT_GPIO_CLK RCC_AHB1Periph_GPIOA #define KEY1_INT_GPIO_PIN GPIO_Pin_0 #define KEY1_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOA #define KEY1_INT_EXTI_PINSOURCE EXTI_PinSource0 //The EXTI_Line number must be consistent with the GPIO_Pin number #define KEY1_INT_EXTI_LINE EXTI_Line0 #define KEY1_INT_EXTI_IRQ EXTI0_IRQn #define KEY1_IRQHandler EXTI0_IRQHandler #define KEY2_INT_GPIO_PORT GPIOC #define KEY2_INT_GPIO_CLK RCC_AHB1Periph_GPIOC #define KEY2_INT_GPIO_PIN GPIO_Pin_13 #define KEY2_INT_EXTI_PORTSOURCE EXTI_PortSourceGPIOC #define KEY2_INT_EXTI_PINSOURCE EXTI_PinSource13 #define KEY2_INT_EXTI_LINE EXTI_Line13 #define KEY2_INT_EXTI_IRQ EXTI15_10_IRQn #define KEY2_IRQHandler EXTI15_10_IRQHandler /*******************************************************/ static void NVIC_Configuration(void); void EXTI_Key_Config(void); #endif 中断线须与端口号一致 stm32f4xx_it.c 部分代码,其余部分不需修改: /******************************************************************************/ /* STM32F4xx Peripherals Interrupt Handlers */ /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ /* available peripheral interrupt handler's name please refer to the startup */ /* file (startup_stm32f429_439xx.s). */ /******************************************************************************/ /** * @brief Turn the status of the led2 when we trigger the exti0 * @param None * @retval None */ void KEY1_IRQHandler(void) { LED2_TOGGLE; EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE); } /** * @brief Turn the status of the led3 when we trigger the exti13 * @param None * @retval None */ void KEY2_IRQHandler(void) { LED3_TOGGLE; EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE); } 中断服务函数在stm32f4xx_it.c 中进行构建 中断服务函数的名称必须与启动文件当中给出的一致 中断服务函数中任务执行完必须清除中断标志
史海拾趣
|
建议:坛里面组织LM3S8962开发板的朋友,对TI的驱动程序仔细研读 分配有开发板的朋友,每月提交一篇关于LM3S8962的使用心得。其实最好还是,像周立功那样,对所有的驱动程序进行分析验证,最后形成使用习惯,分享给广大学习者。这个任务很重,建议统一论坛组织,是一个长期的工作。这工作做好了,以后利用LM3S系列 ...… 查看全部问答> |
|
背景:随着现在大容量卡的普及,小容量的卡反而比较难找了。在loader菜单下使用SD卡进行系统升级应该算是最快捷方便的了。但当你拿着一张大容量卡,loader却无法识别的时候,就尴尬了。看来卡不一定容量越大越好啊! 问题描述:现在在EBOOT中加入了 ...… 查看全部问答> |
|
电源按键驱动加载失败,KITL监测的打印信息如下: Loaded symbols for \'F:\\WINCE500\\PBWORKSPACES\\NEW2442\\RELDIR\\CABLE2442_ARMV4I_RELEASE\\PWRBTN2440.DLL\' 6721 PID:7f92c1e TID:7fa2c6a PwrButton2440: DLL_PROCESS_ATT ...… 查看全部问答> |
|
渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 渥瑞达“3G移动开发”免费试听课于北京交通大学举行,欢迎大家光临! 详情请参见 www.neworigin.net 同时欢迎大家与我们的609期学员交流!这期学员已与2月11日毕业 ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 13:34 编辑 你好,我自己开发了一块6711的板子,我在用CCS LOAD PROGRAM 时候总是LOAD不进去,错误提示为: “FILE hello.out does not match the target endianness,not loaded.Check build options,or use th ...… 查看全部问答> |




