stm32最多支持多少个外部中断,求助STM32有16个外部中断事件线但是为什么中断向量表中只有5
来源:整理 编辑:亚灵电子网 2023-01-04 10:22:15
1,求助STM32有16个外部中断事件线但是为什么中断向量表中只有5
你看库函数哦!那里面除了你说的还有 EXTI15_10_IRQn,EXTI9_5_IRQn,5到9线是一个中断入口,10到15线有事一个中断入口[em:9:][em:9:][em:9:] 求解 !!!!仔细钻研钻研技术手册 应该是有解决方法的 楼主 顶一个它的中断配置是PA0、PB0、PC0......连到EXTI0,PA1、PB1等连到EXTI1,以此类推。同一时刻EXTx只能响应同一组内一个IO口的事件 可以分时复用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
2,STM32 最多能有几个中断嵌套我看有人说32有人说64我觉得分成组四4
16层中断嵌套,注意是层,如果来了17个不同的中断,必然有两个中断的优先级是相同的。你的理解是对的,4位只能配置16层。但要注意的是,Cortex-m3的内核提供的中断优先级分组为8组,即最大支持128层嵌套,只是每个厂商生产芯片时没利用那么多罢了。STM32就只用了5组即16层。

3,stm32 中断设置
NVIC_PriorityGroupConfig(NVIC_ProiorityGroup_1);//把应用程序中断复位控制寄存器的10-8位设位1,表示1位抢断优先级,3位表示子优先级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;此处只能为0或1,因为1位来表示NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;此处可以是0-7,因为是3位表示把TIM_IRQChanne的抢断优先级设为0,子优先级设为2,数字越小优先级越高,抢断优先级可以打断其他的中断,而子优先级不能arm cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与其相关的中断控制和中断优先级控制寄存器(nvic、systick等)也都属于cortex_m3内核的部分。stm32采用了cortex_m3内核,所以这部分仍旧保留使用,但stm32并没有使用cortex_m3内核全部的东西(如内存保护单元mpu等),因此它的nvic是cortex_m3内核的nvic的子集。stm32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位)。
4,stm32可以接多少个外设
一般stm32的数字io口是兼容5v的所以最大可以接5v器件。外设指的是单片机外部的外围功能模块,比如键盘控制芯片,液晶,A/D转换芯片,等等。外设可通过单片机的I/O,SPI,I2C等总线控制。常见stm32外设:基本IO、定时器TIM、串口USART、ADC模数转换、DAC数模转换、SPI串行通信、EXIT外部中断、BKP备份数据、RTC闹钟SysTIck系统滴答、WDG看门狗(独立+窗口)、DMA传输数据、片内FLASH编程、FSMC读写外部SRAM、外部NorFlash操作等。在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列。新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。
5,如何区分触发STM32 外部中断的GPIO引脚
ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组第0组:所有4bit用于指定响应优先级;第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级;第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级;第3组:最高3位用于指定抢占式优先级,后面1位用于指定响应优先级;第4组:所有4位用于指定抢占式优先级。比如,来自pa0的外部中断,可以通过库函数(exti_getitstatus(exti_line0)!=reset);判断外部中断来源是不是来源于端口0(至于是pa0还是pb0可通过查询中断来源进行判断,但不建议这么用,所以设置外部中断的端口建议不要重复,比如使用了pa0,就不要使用pb0之类的)另外要注意:端口0-4有自己独立的外部中断函数入口,5-9和10-15两组分别共用两个外部中断函数入口
6,STM32 EXTI多少个分别接到什么中断源GPIO的EXTI有多少个
; External Interrupts DCD WWDG_IRQHandler ; Window Watchdog DCD PVD_IRQHandler ; PVD through EXTI Line detect DCD TAMPER_IRQHandler ; Tamper DCD RTC_IRQHandler ; RTC DCD FLASH_IRQHandler ; Flash DCD RCC_IRQHandler ; RCC 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 DMA1_Channel1_IRQHandler ; DMA1 Channel 1 DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 DCD ADC1_2_IRQHandler ; ADC1 & ADC2 DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0 DCD CAN1_RX1_IRQHandler ; CAN1 RX1 DCD CAN1_SCE_IRQHandler ; CAN1 SCE DCD EXTI9_5_IRQHandler ; EXTI Line 9..5 DCD TIM1_BRK_IRQHandler ; TIM1 Break DCD TIM1_UP_IRQHandler ; TIM1 Update DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare DCD TIM2_IRQHandler ; TIM2 DCD TIM3_IRQHandler ; TIM3 DCD TIM4_IRQHandler ; TIM4 DCD I2C1_EV_IRQHandler ; I2C1 Event DCD I2C1_ER_IRQHandler ; I2C1 Error DCD I2C2_EV_IRQHandler ; I2C2 Event DCD I2C2_ER_IRQHandler ; I2C2 Error DCD SPI1_IRQHandler ; SPI1 DCD SPI2_IRQHandler ; SPI2 DCD USART1_IRQHandler ; USART1 DCD USART2_IRQHandler ; USART2 DCD USART3_IRQHandler ; USART3 DCD EXTI15_10_IRQHandler ; EXTI Line 15..10 DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend DCD TIM8_BRK_IRQHandler ; TIM8 Break DCD TIM8_UP_IRQHandler ; TIM8 Update DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare DCD ADC3_IRQHandler ; ADC3 DCD FSMC_IRQHandler ; FSMC DCD SDIO_IRQHandler ; SDIO DCD TIM5_IRQHandler ; TIM5 DCD SPI3_IRQHandler ; SPI3 DCD UART4_IRQHandler ; UART4 DCD UART5_IRQHandler ; UART5 DCD TIM6_IRQHandler ; TIM6 DCD TIM7_IRQHandler ; TIM7 DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5STM32启动文件中的内容,自己看下,外部中断一目了然
7,stm32 外部中断疑问
1、回答第一个问题:确实,不管抢占优先级与响应优先级怎么分配,只能分出16个不同的等级,但并不是代表只能写16个中断(事实上能写出16个中断必定是一个非常大的工程了),写程序时你会发现,在其他设置一切正常的情况下,不给响应中断配置中断优先级时也会运行正常,其实,这个时候,你所设置的中断处于默认设置(关于默认设置值与你所选择的中断分级组有关系),这个时候你所设置的中断的优先级配置就都一样了,那么当它们发生时“碰撞”时会怎么样呢,此时就根据时间先后顺序来判断了,也就是说先发生的中断事件优先级高,后发生的中断必须在先发生的中断服务处理完毕后才能进入终端服务处理,总之,当两个中断的优先级配置完全一样的时候,这时的优先级就与中断发生的先后顺序有关,因而你“那只能写16个中断吗”的答案时No,很多时候,不太需要可以配置中断优先级,因为大多数时候它们的发生时间不会有冲突,当然,当程序非常大且复杂的时候,这个问题就得好好研究了;个人经验,在使用定时器这一块儿,这个中断优先级配置的问题要好好斟酌一下,顺便插一句,stm32的定时器实在太强大了~~2、回答第二个问题,答案当然是“不可以”,很确定的告诉你“不可以”,这样设置共用是没有问题的,但没法判断,也没必要进行判断,因为它们对应的都是一个中断服务程序块儿,是多对一的关系,好比楼梯道的电灯,按楼道下的开关和楼道上的开关都会触发电灯事件,这个共用的目的是扩大中断源,但中断服务函数没有改变,若能够判断的话,那么就是多个触发源对应多个中断服务程序了,这样就脱离了本意,其实提问者可以自己自问一下”为什么要这样设置,若是我也会这样设置吗“~~3、回答第三个问题,第三个问题的意思不太明白,是这样的问题吗?”若我希望在一个中断A处理中断服务的时候,中断B也发生了(主要是运行中断A服务程序时触发了中断B),中断B的服务函数能够即刻运行吗?“若提问者的本意也是这样~~这个问题涉及到刚才所说的中断优先级了,当且中断B的优先级比中断A高时,中断B的服务函数才会运行,否则,就只能等到中断A的服务函数处理完毕后才能运行中断B的服务程序了~~或者提问者的问题是这样的:还是以第二个问题为参照:”对于EXTI0,设置了PA0、PB0、PC0...共用,PA0触发了中断然后进入了EXTI0中断服务程序处理,这个时候PB0也触发了EXTI0,这时会发生些什么“,若是这样,首先得表明这样的问题在实践中我没有遇到过,但我想是这样的:等到PA0触发的中断服务程序处理完毕,然后接着处理PB0触发的中断程序(当然,处理程序是一样的),这样的事情发生的概率比较低,除非是刻意安排的4、啰嗦几句,看得出来,关于stm32,提问者看资料看得很仔细也很用心,但实践做得不是很多,此处建议,首先不要将相关资料当成课本去学,在你心中,应该纯属参考资料,刚开始时,遇到一些疑惑可以记录下来,然后跳过去(否则很纠结),当你积累了一些开发或说实践经验的时候回过头来看这些问题,就好理解多了~~~刚才也回答了一个问题“stm32学习是用库函数好还是直接对寄存器进行操作好”,作为初学者,我建议第一种,第一种开发相对比较慢,但更能增强对寄存器的了解,毕竟对了解寄存器是学习stm32的关键,过了一段时间之后,再去接触库函数开发模式,会觉得效率高多了,但库函数的实质还是操作寄存器~对它们都比较了解后,就觉得这不再是一个问题了,很多时候,这两种开发模式混合使用,前提是你对寄存器必须要相当的了解,然后调用一个库函数时心中就已经知道这个库函数的背后对那些寄存器进行了操作~ 呵呵,这是我第一次在百度问答回答问题,以前自己一直是信息的索取者,很少成为信息的传播者,今天,开始做出改变,希望多多支持~问题1,exti0~exti15每个对应于一组(pa,pb,pc,pd..)1,在用外部中断的时候如用exti4(外部中断4)需要配置pa4还是pb4...这几组io口的第四个管脚作为输入,只能选择一个。问题2,void exti_configuration(void) 中断初始化函数 exti_inittypedef exti_initstructure; 定义exti_initstructure为中断配置的结构体,然后对结构体内容进行配置之后初始化外部中断。问题3,你要用什么加什么外设,外设的函数库都是以头文件的格式加入(.h)文件,编译的时候编译器搜索加入的头文件包含的内容,有就编译没有用到的不编译进去,你说的情况之后再加入主函数里面多余的子函数才报错。有问题可以补充。不是sdk吧 应该是mdk
8,stm32中断编程要求2个中断2个优先级2个初始化函数
同学,你的问题需要根据实际的情况来定比如我们使用外部中断,下面我就结合自己的学习讲讲使用外部中断的一般步骤:1、初始化对应的GPIO口。假如我们使用的是GPIOB。(1)首先定义初始化用到的结构体名称。GPIO_InitTypeDef GPIO_InitStructure;说明一下:GPIO_InitTypeDef 是stm32给我们定义好的结构,里面有相应的成员变量,我们只需要定义结构体的名称即GPIO_InitStructure,然后配置它的成员。(2)开启GPIOB的时钟。开启时钟用到系统为我们提供好的函数RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);说明:因为我们要复用GPIO口,所以也要开启GPIO口的复用功能时钟RCC_APB2Periph_AFIO;(3)配置结构GPIO_InitStructure。GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选用管脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_IPU;//设置输出模式,改模式是将stm32管脚内部拉高保证处于高电平,并且做输入管脚使用。(4)这一步设置输入速度的我们可以不要,当GPIO口做输入时,不需要对速度进行配置GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;(5)GPIO_Init(GPIOB, &GPIO_InitStructure);//调用初始化函数,将配置应用到GPIOB口中。2、连接GPIO到EXTIGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//将GPIOB0口连接到EXTI0,可能有些同学就不明白了,为什么是EXTI0,这里简单的说明一下GPIO口如果连接的是0管脚,则对应EXTI0,如果是1管脚则对应EXTI1。3、配置外部中断的触发方式EXTI_InitTypeDef EXTI_InitStructure; 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);4、设置中断优先级寄存器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//这里我们选择分组2,也就是说给抢占优先级分配两位,给响应优先级分两位5、配置中断控制寄存器(NVIC)(1)NVIC_InitTypeDef NVIC_InitStructure;//这一步是给我们的结构体命名,下面是对结构进行配置(2)NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//选择中断类型也就选择外部中断0,这些语句其实stm32都给我们,中断名称在IRQn_Type结构体中为我们定义好了,我们只需要选择一个我们要用的中断就好了,stm32f10xx.h中我们可以找到它。(3)NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;//设置抢占优先级。(4)NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01;//设置响应优先级。(5)NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//设置开启中断。可以理解为开启总中断。(6)NVIC_Init(&NVIC_InitStructure);//调用出事换函数,初始化这个中断。6、最都不要忘记在stm32f10x_it.c中编写中断服务程序。不要忘记,清除中断标志位。void PPP_IRQHandler(void)我们在这个函数中写中断程序,PPP意思就是设备。不过同学们要记住我们不能直接就在里面写我们要将PPP写该成我们的中断口,void EXTI0_IRQHandler(void) 这样才可以,课能同学又要问了怎样确定这个名称呢。答案是我们要在stm32的启动文件startup_stm32f1xx.s这个汇编文件中找,就可以找到每个中断所对应的名称了。慢慢学 其实没有我们想象的那么难这个在中断配置函数里有,建议楼主查看相关例程。。。两个中断及优先级就是中断配置的时候配置好就行了,至于初始化函数自己写就是,估计是每个中断一个初始化函数。。。希望对你有用stm32 目前支持的中断共为 84 个(16 个内核+68个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。
文章TAG:
stm32最多支持多少个外部中断