当前位置:首页>科技>正文

stm32中断编程要求:2个中断,2个优先级,2个初始化函数 nrf51822的中断优先级是怎么规定的,不同的中断可以设置相同的优先级吗,

2023-05-22 12:05:07 互联网 未知 科技

 stm32中断编程要求:2个中断,2个优先级,2个初始化函数 nrf51822的中断优先级是怎么规定的,不同的中断可以设置相同的优先级吗,

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到EXTI
GPIO_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这个汇编文件中找,就可以找到每个中断所对应的名称了。
慢慢学 其实没有我们想象的那么难

nrf51822的中断优先级是怎么规定的,不同的中断可以设置相同的优先级吗,

MCS-51单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器(IP)中的相应位的状态来规定的。IP的状态由软件设定,某位设定为“1”,则相应的中断源为高优先级中断;某位设定为“0”,则相应的中断源为低优先级中断。同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列从高到低为外部中断0;定时/计数器0;外部中断1;定时/计数器1;串行口。

stm32中断之间会互相影响吗

会的.

一般中断会有优先权之分, 部分较低阶单片机就不会特别设置优先权.
当致能的中断有优先权之差别时, 高优先权中断, 可以插断低优先权中断的执行. 相当於中断程序被再次中断.
对於相同优先权的中断, 或是无优先权的中断, 中断程序不会再被中断, 後发生的中断, 需要等待当前中断程序执行完成, 才能接著被执行. 因此, 在无分优先权的中断时, 中断程序的执行, 是会互相卡住的.

通常而言, 我会建议中断程序越短越好, 这样可以减少中断程序间的互相影响. 最好能将中断内容保存下来, 等回到主回圈程序再进一步处理. 如此各中断即便相互卡到, 也不致於产生较大影响.

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的关键,过了一段时间之后,再去接触库函数开发模式,会觉得效率高多了,但库函数的实质还是操作寄存器~对它们都比较了解后,就觉得这不再是一个问题了,很多时候,这两种开发模式混合使用,前提是你对寄存器必须要相当的了解,然后调用一个库函数时心中就已经知道这个库函数的背后对那些寄存器进行了操作~ 呵呵,这是我第一次在百度问答回答问题,以前自己一直是信息的索取者,很少成为信息的传播者,今天,开始做出改变,希望多多支持~