你好!
我尝试将 IRQ 优先级设置为 3,子优先级设置为 2。
- HAL_NVIC_SetPriority(EXti9_5_IRQn, 3, 2);
我想对应的 NVIC IPR [23] 现在是 0x32。但它是 0x30。
我读了 AIRCR PRIGROUP(它是 3)。
- uint32_t PriorityGroup = NVIC_GetPriorityGrouping();
根据 PM0253 如果 PRIGROUP == 3,比
二进制点为bxxxx.yyyy,
组优先级数 = 16,
子优先级数 = 16
此外,我尝试使用不同的输入参数,但从未获得预期的结果。
- PreemptSubPrior = NVIC_EncodePriority(PriorityGroup, PreemptPriority, SubPriority);
普通...
我对 HAL 和 CMSIS 的源代码完全感到困惑......
NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
- __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
- {
- uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */
- uint32_t PreemptPriorityBits;
- uint32_t SubPriorityBits;
- PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);
- SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));
- return (
- ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
- ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
- );
- }
根据此代码,不可能将优先级设置为 3 并将子优先级设置为 2。对于 PriorityGroup = 3,__NVIC_PRIO_BITS = 4。
比“编码”优先级在 SetPriority 函数中左移。所以我得到 0x30 而不是 0x32。
- __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
- {
- if ((int32_t)(IRQn) >= 0)
- {
- NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
- }
- else
- {
- SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);
- }
- }
请对
STM32H725中的优先级和子优先级做一些补充说明。