ST意法半导体
直播中

甘满盛

8年用户 1360经验值
擅长:386660
私信 关注
[问答]

关于STM32H725 NVIC优先级和次优先级问题求解

你好!
我尝试将 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中的优先级和子优先级做一些补充说明。








回帖(1)

高彬

2022-12-12 11:46:37
首先,真正需要次优先级的情况在现实世界中非常罕见。
实现的优先级位总数为 4。通常使用 4 个主优先级位,没有子优先级。如果您将 3 位用于主要优先级(“分组”),则将保留一位用于次优先级。
通常:避免区分优先级和使用子优先级,除非你确定你需要它。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分