打印
[STM32F4]

关于最新库1.3(HAL)中,中断优先级分组设置的问题

[复制链接]
10049|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
colin2135|  楼主 | 2014-8-9 12:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用以前库的时候,每写一个关于中为优先级的程序就必须包含两个函数:
void NVIC_PriorityGroupConfig();
void NVIC+init();

但是现在的话,在官方例程上的设置是如下:
  /* Set Interrupt Group Priority */
  HAL_NVIC_SetPriority(DMA_STREAM_IRQ, 0, 0);

void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
{
  uint32_t prioritygroup = 0x00;
  
  /* Check the parameters */
  assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
  
  prioritygroup = NVIC_GetPriorityGrouping();
  
  NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
}

而分组 :prioritygroup = NVIC_GetPriorityGrouping();

中断优先级分组跑到里面来了。

请问是不是不需要再人工进行分组了,对于这块非常不理解。请大神指导
沙发
STARM| | 2014-8-9 16:58 | 只看该作者
先用这个 NVIC_PriorityGroupConfig() 然后 NVIC_GetPriorityGrouping() 获取组配置

如果不NVIC_PriorityGroupConfig() 就是用上电默认分组吧

使用特权

评论回复
板凳
朝阳之光| | 2014-8-10 08:28 | 只看该作者
每次都更新库,刚熟悉一个又更新了,嗨

使用特权

评论回复
地板
foxglove| | 2015-2-11 14:11 | 只看该作者
悉一个又更新

使用特权

评论回复
5
LSA9281| | 2020-7-30 22:28 | 只看该作者
本帖最后由 LSA9281 于 2020-7-30 23:08 编辑

HAL_NVIC_SetPriority(USART1_IRQn,3,3);
转到------>

void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
{
  uint32_t prioritygroup;
  /* Check the parameters */
  assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
  prioritygroup = NVIC_GetPriorityGrouping();
  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)))
         );
}
NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)函数解释如下
/**
  \brief   Encode Priority
  \details Encodes the priority for an interrupt with the given priority group,
           preemptive priority value, and subpriority value.
           In case of a conflict between priority grouping and available
           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
  \param [in]     PriorityGroup  Used priority group.
  \param [in]   PreemptPriority  Preemptive priority value (starting from 0).
  \param [in]       SubPriority  Subpriority value (starting from 0).
  \return                        Encoded priority. Value can be used in the function \ref NVIC_SetPriority().
*/
翻译为
brief编码优先级              
\details用给定的优先级组对中断的优先级进行编码,              
抢占优先级值和子优先级值。            
如果优先级分组与可用            
优先级位(优先级位)冲突(
conflict) ,设置可能的最小优先级组。
   \param[in]PriorityGroup已使用优先级组。
  \param[in]PreemptPriority抢占优先级值(从0开始)。         
  \param[in]次优先级次优先级值(从0开始)。        
\返回编码优先级。值可在函数\ref NVIC_SetPriority()中使用。
     */
总结:先 prioritygroup = NVIC_GetPriorityGrouping();读取一个优先级分组,但如果后来发现优先级分组与可用            
优先级位(优先级位)冲突,设置可能的最小优先级组。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

144

主题

533

帖子

8

粉丝