完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有两个外部中断源进入STM32F105。我想要其中一个(称之为“IRQHigh”)来抢占另一个(“IRQLow”)。目前,如果在IRQLow ISR期间触发IRQHigh,程序流将等待,直到我清除IRQLow ITPending位,然后才分支到IRQHigh ISR。 STM32F105是基于Cortex-M3的微控制器。它支持嵌套中断。我的应用程序是用C语言编写的,使用Eclipse中的GCC(arm-none-eabi-gcc)和STM32F1标准外设库。 我认为我已正确配置优先级但我必须遗漏一些东西。 这是相应的初始化代码。我已经删除了AFB时钟命令,GPIO配置等,因为每个子系统似乎都能正常工作:
IRQ处理程序设置如下:
一些注意事项:
我究竟做错了什么? |
|
相关推荐
11个回答
|
|
我没有看到你所展示的任何错误。什么在CleanUpOverflow(); ......那里有什么可以禁用中断吗?
|
|
|
|
谢谢你 - 我会在办公室时查看。两个ISR处理程序都调用一个函数(ISRHigh()和ISRLow()),每个函数都需要很长时间才能完成。我已经更新了这个问题。
|
|
|
|
是否有任何禁用/启用ISRLow()或CleanUpOverflow()中断的内容可能会延迟执行更高优先级的中断。
|
|
|
|
CC1101_INT_EXTI_LINE与IRQLOW_EXTI_LINE相同吗?
|
|
|
|
优先级未正确初始化。
问题中的代码初始化NVIC,如下所示:
然后,稍后,IRQLow显式启用NVIC_EnableIRQ()。 问题是如果IRQChannelCmd = DISABLE,NVIC_Init()函数(来自SPL)实际上不会初始化任何东西(!)。它只是设置ICER寄存器以禁用该中断。 这对我来说似乎是个错误,但也是如此。现在我需要去检查xxx_Init()SPL中的其他功能,看看是否有其他东西可能会在以后咬我:) 有一些解决方案。我更喜欢的是省去IRQLow初始化序列的所有五行并用它替换它们: NVIC_SetPriority(IRQLOW_EXTI_IRQn, 5); 然后,当它是时候,NVIC_EnableIRQ()可以按预期使用。 请注意,这是有效的,因为NVIC配置了NVIC_PriorityGroup_4(没有子优先级)。不同的PriorityGroup设置也需要您配置子优先级。 |
|
|
|
很好的发现,它在STL32F4的SPL中是相同的(我刚检查了v1.8.0的源代码)。我需要查看一些代码
|
|
|
|
最好避免HAL和SPL。特别是后者。
|
|
|
|
我使用SPL作为STM32Cube的较低级别,较少膨胀的替代品
|
|
|
|
SPL中的“低级别”是什么。这是HAL的旧版本(由STM放弃)。CubeMx只是HAL初始化代码生成器 - 没有别的。你刚刚选择了类似的但是较旧的(和更多的bug)库(你已经从坏到坏)。您在CMSIS中的低级别定义和功能
|
|
|
|
仅供参考:由于您使用的是NVIC_PriororityGroup_4,因此可能没有实际意义,但CMSIS提供了NVIC_EncodePriority(),它接受作为参数:PriorityGroup,PreemptPriority和SubPriority。“返回的优先级值可用于NVIC_SetPriority(...)函数”。(发现于core_cm4.h)
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
657 浏览 0 评论
2334 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2137 浏览 3 评论
4767 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2282 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 10:48 , Processed in 1.169233 second(s), Total 104, Slave 84 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号