STM32入门学习之EXTI外部中断(STM32F030F4P6基于CooCox IDE)

发布者:huanli最新更新时间:2021-10-21 来源: eefocus关键字:STM32  EXTI  外部中断  CooCox  IDE 手机看文章 扫描二维码
随时随地手机看文章

下面的代码,是把PA0当做一个按键口,芯片内部上拉,按键闭合时,IO口被拉低,触发中断。


#include "stm32_lib/inc/stm32f0xx_rcc.h"

#include "stm32_lib/inc/stm32f0xx_exti.h"

#include "stm32_lib/inc/stm32f0xx_gpio.h"

#include "stm32_lib/inc/stm32f0xx_syscfg.h"

#include "stm32_lib/inc/stm32f0xx_misc.h"

 

int main(void)

{

//时钟使能

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

 

//外部按键GPIO初始华,PA0

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN;

GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

 

//将EXTI0指向PA0

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);

//EXTI0中断线配置

EXTI_InitTypeDef EXTI_InitStructure;

EXTI_InitStructure.EXTI_Line=EXTI_Line0;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

 

//EXTI0中断向量配置

NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel=EXTI0_1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPriority=0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

 

while(1){

 

}

}

 

void EXTI0_1_IRQHandler(void){

if(EXTI_GetITStatus(EXTI_Line0)!=RESET)

{

//中断处理

}

//退出中断时注意清除标志位

EXTI_ClearFlag(EXTI_Line0);

}


先补充概念1,同GPIO、USART、NVIC等一样,我们再使用EXTI是首先要定义一个EXTI_InitTypeDef

我们可通过EXTI的头文件查看,库是怎么定义EXTI_InitTypeDef


typedef struct

{

  uint32_t EXTI_Line; //线               

  EXTIMode_TypeDef EXTI_Mode;        //模式

  EXTITrigger_TypeDef EXTI_Trigger; //触发类型

  FunctionalState EXTI_LineCmd;      //使能

}EXTI_InitTypeDef;


关于EXTI_Line,继续看头文件

#define EXTI_Line0       ((uint32_t)0x00000001)  /*!< External interrupt line 0  */

#define EXTI_Line1       ((uint32_t)0x00000002)  /*!< External interrupt line 1  */

#define EXTI_Line2       ((uint32_t)0x00000004)  /*!< External interrupt line 2  */

#define EXTI_Line3       ((uint32_t)0x00000008)  /*!< External interrupt line 3  */

#define EXTI_Line4       ((uint32_t)0x00000010)  /*!< External interrupt line 4  */

#define EXTI_Line5       ((uint32_t)0x00000020)  /*!< External interrupt line 5  */

#define EXTI_Line6       ((uint32_t)0x00000040)  /*!< External interrupt line 6  */

#define EXTI_Line7       ((uint32_t)0x00000080)  /*!< External interrupt line 7  */

#define EXTI_Line8       ((uint32_t)0x00000100)  /*!< External interrupt line 8  */

#define EXTI_Line9       ((uint32_t)0x00000200)  /*!< External interrupt line 9  */

#define EXTI_Line10      ((uint32_t)0x00000400)  /*!< External interrupt line 10 */

#define EXTI_Line11      ((uint32_t)0x00000800)  /*!< External interrupt line 11 */

#define EXTI_Line12      ((uint32_t)0x00001000)  /*!< External interrupt line 12 */

#define EXTI_Line13      ((uint32_t)0x00002000)  /*!< External interrupt line 13 */

#define EXTI_Line14      ((uint32_t)0x00004000)  /*!< External interrupt line 14 */

#define EXTI_Line15      ((uint32_t)0x00008000)  /*!< External interrupt line 15 */

#define EXTI_Line16      ((uint32_t)0x00010000)  /*!< External interrupt line 16 

                                                      Connected to the PVD Output */

#define EXTI_Line17      ((uint32_t)0x00020000)  /*!< Internal interrupt line 17 

                                                      Connected to the RTC Alarm 

                                                      event */

#define EXTI_Line19      ((uint32_t)0x00080000)  /*!< Internal interrupt line 19

                                                      Connected to the RTC Tamper

                                                      and Time Stamp events */

#define EXTI_Line21      ((uint32_t)0x00200000)  /*!< Internal interrupt line 21

                                                      Connected to the Comparator 1

                                                      event */

#define EXTI_Line22      ((uint32_t)0x00400000)  /*!< Internal interrupt line 22

                                                      Connected to the Comparator 2

                                                      event */

#define EXTI_Line23      ((uint32_t)0x00800000)  /*!< Internal interrupt line 23

                                                      Connected to the I2C1 wakeup

                                                      event */

#define EXTI_Line25      ((uint32_t)0x02000000)  /*!< Internal interrupt line 25

                                                      Connected to the USART1 wakeup

                                                      event */

#define EXTI_Line27      ((uint32_t)0x08000000)  /*!< Internal interrupt line 27

                                                      Connected to the CEC wakeup

                                                      event */


这里定义了N多EXTI_Line,其中Line0-Line15表示GPIOX_Pin_N的中断。如何区分GPIOX呢?这也就是概念2要补充的了。这里通过SYSCFG_EXTILineConfig函数来配置。

//将EXTI0指向PA0

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);


继续看头文件,了解EXTI的MODE


typedef enum

{

  EXTI_Mode_Interrupt = 0x00,

  EXTI_Mode_Event = 0x04

}EXTIMode_TypeDef;


一个是Interrupt中断,一个是Event事件。

中断,系统最多只能给其配置个中断向量入口,然后执行相应的软件程序。


而事件,系统中存在硬件电路,可配置其连接至需要触发硬件电路中,如触发AD转换,或者引起DMA操作等。

关于EXTITrigger_TypeDef,经常使用示波器的朋友们想必已经很清楚了,上升沿触发、下降沿触发、上升下降兼触发。



typedef enum

{

  EXTI_Trigger_Rising = 0x08,

  EXTI_Trigger_Falling = 0x0C,

  EXTI_Trigger_Rising_Falling = 0x10

}EXTITrigger_TypeDef;



NVIC中的IRQChannel为什么是EXTI0_1_IRQN呢?


这个可以再stm32f0xx.h头文件找到

EXTI0_1_IRQn对应线0和1的中断


EXTI2_3_IRQn对应线2和3的中断


EXTI4_15_IRQn对应线4-15的中断



#if defined (STM32F0XX_MD) || defined (STM32F030X8)

/******  STM32F0XX_MD and STM32F030X8 specific Interrupt Numbers *************************************/

  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                               */

  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detect Interrupt                  */

  RTC_IRQn                    = 2,      /*!< RTC through EXTI Line Interrupt                         */

  FLASH_IRQn                  = 3,      /*!< FLASH Interrupt                                         */

  RCC_IRQn                    = 4,      /*!< RCC Interrupt                                           */

[1] [2]
关键字:STM32  EXTI  外部中断  CooCox  IDE 引用地址:STM32入门学习之EXTI外部中断(STM32F030F4P6基于CooCox IDE)

上一篇:STM32入门学习之GPIO(STM32F030F4P6基于CooCox IDE)(一)
下一篇:STM32入门学习之SysTick系统定时器(STM32F030F4P6基于CooCox IDE)

推荐阅读最新更新时间:2024-11-10 11:30

stm32 直接读写寄存器代码风格总结
简单的总结了一下stm32 寄存器读写代码风格,以备后用: 根据memory mapping 直接写寄存器代码风格: #define GPIOA_BASE1 (uint32_t)0x40010800 #define GPIOA_CRH ((uint32_t*)(GPIOA_BASE1+0x04)) 转换为指针之后,直接读写: *GPIOA_CRH=0x000004B0; //A端口 //复用推挽输出 结构体指针解决连续多个寄存器读写设置: #define Usart1_BASE 0x40013800 typedef struct { __IO uint32_t SR; __IO
[单片机]
<font color='red'>stm32</font> 直接读写寄存器代码风格总结
STM32初学笔记5之ADC(下)
在上一篇文章中,笔者已经实现了通过ADC1的一个通道采样外部电压数据,本文主要是通过ADC1的通道16来采样芯片内部温度的变化。注意:这里说的变化,而不是绝对温度,因为STM32内部的温度传感器的准确度并不高,需要人为调整。 本文是在上一篇ADC采样外部电压的基础上进行修改的,还请参照上一篇文章。 =========================================================== ADC_Config.C =========================================================== /** ** 文件名
[单片机]
<font color='red'>STM32</font>初学笔记5之ADC(下)
Keil STM32 C++混合编程要点
1. 文件名必须是.CPP和.h 2. .h文件中要增加如下代码: #ifndef __LEDTASK_H #define __LEDTASK_H #ifdef __cplusplus extern C { #endif #include stm32_led.h void led1_task (void *pdata); #ifdef __cplusplus } #endif #endif 3. 调用.cpp文件中资源时(如类,函数等),那个文件也必须是.cpp文件。即.cpp文件里才能调用C++语法的程序 4. –C99要去掉 其实到最后,我是放弃了这种C++混合编程的,一开始非常想这样
[单片机]
Keil <font color='red'>STM32</font> C++混合编程要点
STM32入门学习之USART(STM32F030F4P6基于CooCox IDE
#include stm32f0xx.h #include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_gpio.h #include stm32_lib/inc/stm32f0xx_usart.h int main(void) { //1、使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //特别注意:因为串口有使用GPIO,所以对应GPIO的时钟也要使能 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENA
[单片机]
<font color='red'>STM32</font>入门学习之USART(STM32F030F4P6基于<font color='red'>CooCox</font> <font color='red'>IDE</font>)
stm32使用SDIO方式+FATFS读写内存卡
针对stm32f103zet 单片机完成对内存卡的读写操作,可以查看内存卡目录,写入文件,删除文件,更改文件,清空文件内容等,使得stm32f103zet单片机能有一个较大的外部存储空间,可跑文件系统。 内存卡分为有普通卡和高速卡SDHC卡之分 普通内存卡一般大小在2g以下 SD高速卡一般在8g~16g STM32F103ZE-EK开发板原理图 :https://pan.baidu.com/s/1smpn8VN 普通内存卡老式内存卡程序 稳定版本程序代码 :https://pan.baidu.com/s/1mjO9CDU 高速内存卡HCsdcard程序 某些程序待完善程序代码 :https://pan.baidu.co
[单片机]
基于STM32和MPU-6050的两轮自平衡小车系统设计与实现
引言 两轮自平衡小车系统类似于倒立摆系统,具有多变量、非线性、强耦合等特点,是研究各种控制方法的理想平台。两轮自平衡小车系统的控制过程是微控制器对姿态检测传感器和编码器等采集的数据进行分析处理,计算出使系统恢复平衡的实时控制量,从而驱动电机实现系统的动态平衡。 针对小车系统的复杂性,本文提出了将卡尔曼滤波算法和双闭环PID控制算法相结合的方法,既利用卡尔曼滤波算法对MPU-6050传感器采集的倾斜角度和角速度数据进行融合,得到小车平衡姿态的最优估计值,又利用以姿态信息、速度为反馈控制量构成双闭环PID控制算法,再结合采用高性能STM32F103C8T6作为主控制器,从而提高两轮小车系统稳定性和抗干扰能力。 1、系统的硬件设
[单片机]
基于<font color='red'>STM32</font>和MPU-6050的两轮自平衡小车系统设计与实现
STM32学习笔记之内存结构
本文以STM32F103ZE为原型,来剖析其内存结构,从而了解其内存物理地址,分配结构以扩展应用。 STM32F103ZE这款芯片内置了32KB的SRAM,512KB的Flash,其映射地址如下图所示,该图来源于其数据手册 。其中Flash的起始地址为0x0800 0000,SRAM的起始地址为0x2000 0000,外设的起始地址为0x4000 0000,地址为0x4002 2000是控制Flash的寄存器地址。 参考链接: 【1】 每个程序员都应该了解的内存知识 【2】 STM32片上Flash内存映射、页面大小、突破口映射
[单片机]
<font color='red'>STM32</font>学习笔记之内存结构
编译STM32错误之一:Error: L6218E: Undefined symbol TIM_Cmd
注意要包含头文件:#include stm32f10x_tim.h 还有要把stm32f10x_tim.c加进工程。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved