STM32 关于外部中断线、中断源和中断服务函数的问题

发布者:幸福如愿最新更新时间:2018-12-03 来源: eefocus关键字:STM32  外部中断线  中断源  中断服务函数 手机看文章 扫描二维码
随时随地手机看文章

中断线问题:



上图可以看出,PA0、PB0...PG0共用的EXTI0中断线,PA1、PB2...PG1共用的EXTI1中断线,也就是 编程里面的(如下图库文件),对应16个中断线,后面三个是专用的中断线,不做讨论。


 

有人要问,假设:我设置的引脚是PB9和PE9都开启外部中断怎么办?小编告诉你,这还真办不了,我实测过。配置函数的时候后覆盖之前的函数的(如下图所示)



如果这样配置的话,会出现出货光电1的初始化覆盖掉编码盘的初始化,说白了就是编码盘的设置被覆盖掉了,结果是外部中断  出货光电1管脚会触发而编码盘就不起作用了,这也是STM32其中一个问题所在吧! 反过来,结果是外部中断  编码盘 管脚会触发 而 出货光电1管脚就不起作用了!


中断源问题:


  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); //设置GPIOX中断源以及哪个中断脚

  EXTI_InitStructure.EXTI_Line = EXTI_Line0;//中断线

  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置为外部中断模式

  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发

  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能

  EXTI_Init(&EXTI_InitStructure);//配置使能

中断服务函数:


 简单的配置:


void EXTI15_10_IRQHandler(void)//中断服务函数,如果中断线是10-15。

{

if(EXTI_GetITStatus(EXTI_Line10) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line10);     

}  


if(EXTI_GetITStatus(EXTI_Line11) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line11);     

}  


if(EXTI_GetITStatus(EXTI_Line12) != RESET) 

{

Beep_ON;SOFT_DELAY;Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line12);     

}  

 

void EXTI9_5_IRQHandler(void)//中断服务函数,如果中断线是5-9。

{

if(EXTI_GetITStatus(EXTI_Line5) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line5);     

}  


if(EXTI_GetITStatus(EXTI_Line8) != RESET) 

{

Beep_ON;SOFT_DELAY; Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line8);     

}  


if(EXTI_GetITStatus(EXTI_Line9) != RESET) 

{

Beep_ON;SOFT_DELAY;Beep_OFF;

EXTI_ClearITPendingBit(EXTI_Line9);     

}  


每个中断服务函数代表一个或者一类,上面的代码说明:只要是中断线在EXTI_Line   10-15 的,中断服务函数就只有一个,但是由于中断线只有唯一性,可以在中断服务函数里面判断到底是哪个中断线触发,这也保证不会误触发或者是占线的一系列的问题。


如上图,外部中断分为几类:如下:


  DCD     EXTI0_IRQHandler           ; EXTI Line 0//只是管脚的中断服务函数,还有串口等等中断服务函数

  DCD     EXTI1_IRQHandler           ; EXTI Line 1             

  DCD     EXTI2_IRQHandler           ; EXTI Line 2

  DCD     EXTI3_IRQHandler           ; EXTI Line 3

  DCD     EXTI4_IRQHandler           ; EXTI Line 4

  DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5

  DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10


所以在配置外部中断服务函数或者其他中断服务函数的问题时,参照:库启动件 startup_stm32f10x_hd.


关键字:STM32  外部中断线  中断源  中断服务函数 引用地址:STM32 关于外部中断线、中断源和中断服务函数的问题

上一篇:STM32 中断优先级(Cortex-M3)
下一篇:STM32F429之中断服务函数名

推荐阅读最新更新时间:2024-03-16 16:19

STM32菜鸟成长记录---系统滴答定时器(systick)应用
1.systick介绍 Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。只要不把它在S
[单片机]
<font color='red'>STM32</font>菜鸟成长记录---系统滴答定时器(systick)应用
stm32 重定义printf导致无法跳到main函数问题
使用了printf之类的库函数,需要编写_sys_exit()之类底层函数。_sys_xxx之类的的只要写个空函数就行了。 因printf()之类的函数,使用了半主机模式。使用微库的话,不会使用半主机模式,所以就没有问题。 添加下面代码,就可以使用标准库了: #pragma import(__use_no_semihosting) _sys_exit(int x) { x = x; } struct __FILE { int handle; /* Whatever you require here. If the only file you are using is */ /* standard output
[单片机]
stm32独立看门狗时间设置
//prer:分频数:0~7(只有低 3 位有效!) rlr:自动重装载值,0~0XFFF. //分频因子=4*2^prer.但最大值只能是 256! //rlr:重装载寄存器值:低 11 位有效 //时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms). void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //取消寄存器写保护 IWDG_SetPrescaler(prer); //设置 IWDG 分频系数 IWDG_SetReload(rlr); //设置 IWDG 装载值 IWDG_Reload
[单片机]
整理STM32GPIO输出速率问题
GPIO 引脚输出速度有:GPIO_Speed_2MHz (10MHz, 50MHz) 官方一点的解释: GPIO口的驱动电路响应速度,不是输出信号的速度。输出信号的速度与程序有关,通过选择速度来选择不同的驱动电路,降低功耗控制噪声。 又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。) 可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。 (如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。失真因素?) 如果
[单片机]
STM32 学习笔记——GPIO口控制
在配置STM32外设的时候,任何都要先使能该外设的时钟!PB2ENR 是 APB2总线上的外设时钟使能寄存器 我们要使能的PORTA和PORTD的时钟使能位,分别在的时钟使能位,分别在bit2和bit5,只要将这两位置1就可以使能PORTA和PORTD了 STM32的每个IO端口都有7个寄存器来控制。 他们分别是:配置模式的2个32位的端口配置寄存器 CRL 和 CRH;2个32位的数据寄存器IDR 和 ODR ;1个32位的置 复位寄存器 BSRR ;一个 16 位的复寄存器 位的复寄存器 BRR ;1个 32 位的 锁存 寄存器 LCKR ; 这里我们仅介绍常用 的 几个寄存器,我们常用的 IO 端口寄存器只有 4
[单片机]
STM32基于固件库学习笔记(5)电源管理之低功耗模式
低功耗模式 功耗的高低,决定了系统工作的时间,在需要长久间隔时间检测数据,又不可能人实时去操作的项目,最先考虑的就是功耗问题了, 功耗越低产品使用时间就更久。也就是说当CPU不需继续运行时,就可以利用多种低功耗模式来节省功耗,例如等待某个外部事件时。 用户需要根据最低电源消耗、最快速启动时间和可用的唤醒源等条件,选定一个最佳的低功耗模式。 STM32F10xx有三种低功耗模式: 1. 睡眠模式:(Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行) 2. 停止模式: 所有的时钟都停止。 3. 待机模式: 1.8V电源关闭,是最低功耗模式   当处于运行模
[单片机]
<font color='red'>STM32</font>基于固件库学习笔记(5)电源管理之低功耗模式
基于stm32的FIR滤波
这两天有个地方用到了距离传感器,选用的传感器是夏普的近红外距离传感器。后来调试的时候发现传感器出来的信号除了有个随着距离规律变化的直流信号以外还有一个周期为1ms的尖峰脉冲信号形状如下图示 这样的波形会影响采集数据的结果,硬件上已经固定了,所以就选择从软件方面来寻找解决方案。 之前涉及的软件滤波无非就是采用求平均值的方法或者用排序的方法取中间值。但是发现这种传统的方法都不能解决问题,无奈之下只好请出FIR了。在网上找到一段关于FIR滤波器的C代码, const double Gains = { 0.0009479362407674,0.0009929350550642, 0.003930214337694,0.000
[单片机]
基于<font color='red'>stm32</font>的FIR滤波
STM32学习之时钟
STM32学习----时钟 收藏 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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