STM32F1外部中断实例

发布者:chwwdch最新更新时间:2022-05-24 来源: eefocus关键字:STM32F1  外部中断  时钟 手机看文章 扫描二维码
随时随地手机看文章

使用外部中断的基本步骤如下:

1. 设置好相应的时钟;

2. 设置相应的中断;

3. IO口初始化;

4. 把相应的IO口设置为中断线路(要在设置外部中断之前)并初始化;

5. 在选择的中断通道的响应函数中中断函数。


1、开启时钟


void RCC_Config(void)

{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE)|

RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

}


设置相应的时钟所需要的RCC函数在stm32f10x_rcc.c中,所以要在工程中添加此文件。


2、设置相应中断


void NVIC_Config()

{

    /*设置相应中断的优先级*/

    NVIC_InitTypeDefNVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 


    /*EXTI2*//*配置NVIC_InitTypeDef结构体参数*/

    NVIC_InitStructure.NVIC_IRQChannel= EXTI2_IRQn;     

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0; 

    NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0;        

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                   

    NVIC_Init(&NVIC_InitStructure);


    /*EXTI3*/

    NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;                 

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 1;                    

    NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;  

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                                   

    NVIC_Init(&NVIC_InitStructure);


    /*EXTI5*/

    NVIC_InitStructure.NVIC_IRQChannel= EXTI9_5_IRQN;  

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 2;    

    NVIC_InitStructure.NVIC_IRQChannelSubPriority= 2;      

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;      

    NVIC_Init(&NVIC_InitStructure);                                      


}


3、IO口初始化


void GPIO_Config(void)

{

    GPIO_InitTypeDef   GPIO_InitStructure;


    /*PE2--OUT_PP*/

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;                                             

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;                  

    GPIO_Init(GPIOE,&GPIO_InitStructure);

    GPIO_ResetBits(GPIOE,GPIO_Pin_2);                              


    /*PC2.PE3.PE5--IN_FLOATING*/

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5; 

    GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IN_FLOATING; 

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;          

    GPIO_Init(GPIOC,&GPIO_InitStructure);                                 


    /*PD3.PD6--OUT_PP*/  

    GPIO_InitStructure.GPIO_Pin= GPIO_Pin_3 |GPIO_Pin_6;                  

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;                  

    GPIO_Init(GPIOD,&GPIO_InitStructure);


    /*PB5--OUT_PP*/

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;                                         

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;          

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;                  

    GPIO_Init(GPIOB,&GPIO_InitStructure);        

}


4、 把相应的IO口设置为中断线路


void EXTI_cfg()

{

    EXTI_InitType   DefEXTI_InitStructure;


    /*清空中断标志*/   

    EXTI_ClearITPendingBit(EXTI_Line2);

    EXTI_ClearITPendingBit(EXTI_Line3);

    EXTI_ClearITPendingBit(EXTI_Line5);


    /*设置中断线*/    

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);


    EXTI_InitStructure.EXTI_Line= EXTI_Line2 | EXTI_Line3 | EXTI_Line5; 

    EXTI_InitStructure.EXTI_Mode= EXTI_Mode_Interrupt;    

    EXTI_InitStructure.EXTI_Trigger= EXTI_Trigger_Rising_Falling;   

    EXTI_InitStructure.EXTI_LineCmd=ENABLE;         

    EXTI_Init(&EXTI_InitStructure);                                      

}


5、中断服务程序


voidEXTI2_IRQHandler(void)

{

    GPIO_SetBits(GPIOD,GPIO_Pin_6);//点亮LED灯

    EXTI_ClearITPendingBit(EXTI_Line2); //清空中断标志位

}


voidEXTI3_IRQHandler(void)

{

    GPIO_SetBits(GPIOD,GPIO_Pin_3);

    EXTI_ClearITPendingBit(EXTI_Line3);

}


voidEXTI9_5_IRQHandler(void)

{

    GPIO_SetBits(GPIOB,GPIO_Pin_5);

    EXTI_ClearITPendingBit(EXTI_Line5);

}


中断服务程序要写在stm32f10x_it.c中。

这部分内容为对上一篇的补充。

关键字:STM32F1  外部中断  时钟 引用地址:STM32F1外部中断实例

上一篇:stm32 SysTick定时器常见问题和实现延时
下一篇:用STM32实现:摄像头扫到二维码后提取二维码中的信息分别放到数组中

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

s3c2440的系统时钟
下面内容是《ARM处理器裸机开发实战—机制而非策略》里的,以s3c2440开发板为例 系统时钟是整个电路的心脏。 总体来说,与s3c2440处理器有关的时钟主要有4种:Fin、FCLK、HCLK和PCLK。 Fin: 外部输入的晶振频率 FCLK: 主要用于CPU核 HCLK: 主要用在与AHB总线互连的设备上(存储器控制器、lcd控制器、dma) PCLK: 主要用在与APB总线互连的低速设备上(uart adc 定时器) S3c2440系统时钟概述 S3c2440处理器的系统时钟分为两部分,外部有时钟输入引脚,内部有2个锁相环将外部输入时钟倍频到处理器工作所需要的时钟。锁相环相当于一个时钟变换电
[单片机]
s3c2440的系统<font color='red'>时钟</font>
STM32 外部中断简介
STM32 IO 口中断的一些基础概念。STM32 的每个 IO 都可以作为外部中断的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB 唤醒事件。 在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的: void GPIO_EXTILineConfig(uint8_t
[单片机]
C51联盟 —— 外部中断+定时器中断
/*****************************************************/ void Int0Init(); //开启外部中断INTR0 void Timer1Init(); //定时器中断 5毫秒@12.000MHz /*****************************************************/ void main() { SEG = 0; Int0Init(); Timer1Init(); while(1); } /*****************************************************/ void FlowLED
[单片机]
STM32的复用功能——时钟输出(MCO)
TM32的PA.8引脚具有复用功能——时钟输出(MCO), 该功能能将STM32内部的时钟通过PA.8输出. 操作流程: 1)、设置PA.8为复用Push-Pull模式。 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); 2)、选择输出时钟源。 时钟的选择由时钟配置寄存器(R
[单片机]
LPC2103学习之外部中断
LPC2103有三个外部中断源。分别是外部中断0(EINT0),外部中断1(EINT1),外部中断2(EINT2)。另外LPC2103的10个捕获输入也可以作为外部中断输入,跟外部中断不同之处就是不能将掉电模式下的CPU唤醒。 下面的图展示了LPC2103的外部中断系统的结构,看到这个结构,对寄存器的操作一下也明白了不少。 下面是4个跟外部中断有关的寄存器 下面是寄存器的具体介绍,首先是外部中断标志寄存器EXINT。 其中需要我们注意的是相应中断使标志位置1时,我们需要向相应寄存器位写1以清除标志位。而且在电平触发方式下,只有引脚处于无效状态时才又可能将标志位清除。比如设置的为高电平触发,则直到相应引脚变为低电
[单片机]
LPC2103学习之<font color='red'>外部中断</font>
Exynos4412的外部中断是如何安排的?
平台 Linux4.9 tiny4412 概述 结合tiny4412开发板分析一下Exynos4412的外部中断是如何组织的。 在Exynos4412的用户手册第9章Interrupt Controller列出了支持的外部中断: 第1列是按Shared Peripheral Interrupt 排序的 第2列是按Software Generated Interrupt + Peripheral Interrupt(PPI+SPI)排序的, 目前GIC提供了16个SGI中断和16个PPI中断 从上面可以看到,硬件上提供了32个外部中断,但是我们在第6章的GPIO Control一节说: 图2 上面说,有172个外
[单片机]
Exynos4412的<font color='red'>外部中断</font>是如何安排的?
GNU ARM汇编--(六)s3c2440的时钟控制
前面几篇利用GNU ARM汇编控制LED以及ARM的中断处理的设计,对ARM汇编以及体系结构有了一定的认识.后面的汇编学习会结合具体的芯片进行,一个为了更灵活熟练的使用汇编,二也是为了通过学习一款具体芯片来提炼出一些有价值的经验.此次选择的芯片是三星的s3c2440,arm920t的核,整个板子是TQ2440的板子,这个板子放了两年多了,零散的玩过一些,但是为了建立更有体系的知识结构,还是值得把它玩过个遍.可能这个芯片很过时了,应该很多人在玩6410,在工作中接触的也是arm11Cortex-A9或者ppc,但是很多东西并不会过时的.虽然工作中接触的东西比较新,但是作为做应用的公司,很多底层的东西IC设计厂商都帮你做好了,你
[单片机]
GNU ARM汇编--(六)s3c2440的<font color='red'>时钟</font>控制
关于STM8S单片机低功耗应用中时钟源切换时的注意点
简介:一般正常运行时,我们使用的时HSE(外部高速时钟源),当准备进入低功耗时,我们会切换到内部高速时钟HSI(一般需要分频以降低功耗),关闭HSE(若不关闭就不会出现下面的问题,即不用看本文了)。当从低功耗退出,进入正常运行时,会切换HSE。 这时由于之前关闭了HSE,再次打开HSE时会需要一段时间才会ready,然后再由HSI切换到HSE。 //该函数可实现切换时钟源功能。HSE与HSI互切。 void Switch_SysClock(CLK_Source_TypeDef CLK_NewClock) { switch(CLK_NewClock) { case CLK_SOURCE_HSE: //启用
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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