首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

如何设置STM32内核异常优先级

如何设置STM32内核异常优先级

  • /**
  • * @brief  Set the priority for an interrupt
  • *
  • * @param  IRQn      The number of the interrupt for set priority
  • * @param  priority  The priority to set
  • *
  • * Set the priority for the specified interrupt. The interrupt  
  • * number can be positive to specify an external (device specific)  
  • * interrupt, or negative to specify an internal (core) interrupt.
  • *
  • * Note: The priority cannot be set for every core interrupt.
  • */
  • static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)  
  • {  
  •   if(IRQn < 0) {  
  •     SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
  •   else {  
  •     NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff);} /* set Priority for device specific Interrupts  */
  • }  
对于使用cm3内核的stm32来说,中断既包括内核异常也包括外设中断。以上代码用来设置中断优先级,代码来自3.5外设库中的core_cm3.h文件。可以对内核中断进行配置,也可以对外设进行中断优先级配置。对内和和外设中断优先级设置的寄存器不同,内核对应的是SHPRx寄存器组,而外设对应的是NVIC_IPRx寄存器组。

SYSTICK使用core_cm3.h文件进行配置时,默认的优先级配置为15,最低优先级。
[cpp] view plaincopy

  • NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //NVIC_PRIO_BITS为常数4 (1<<4-1 = 15)优先级最低。

[cpp] view plaincopy

  • /**
  • * @brief  Initialize and start the SysTick counter and its interrupt.
  • *
  • * @param   ticks   number of ticks between two interrupts
  • * @return  1 = failed, 0 = successful
  • *
  • * Initialise the system tick timer and its interrupt and start the
  • * system tick timer / counter in free running mode to generate  
  • * periodical interrupts.
  • */
  • static __INLINE uint32_t SysTick_Config(uint32_t ticks)  
  • {   
  •   if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

  •   SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  •   NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  •   SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  •   SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |   
  •                    SysTick_CTRL_TICKINT_Msk   |   
  •                    SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  •   return (0);                                                  /* Function successful */
  • }  




继承事业,薪火相传
返回列表