当前位置: 首页 > news >正文

STM32 中断优先级管理(二)

NVIC中断管理相关函数主要在HAL库关键文件stm32f1xx_hal_cortex.c中定义。

中断优先级分组函数

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

这个函数的作用是对中断的优先级进行分组,这个函数在系统中只需要被调用一次。

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{/* Check the parameters */assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));/* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */NVIC_SetPriorityGrouping(PriorityGroup);
}__STATIC_INLINE void NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{uint32_t reg_value;uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); reg_value= SCB->AIRCR; /* read old register configuration */reg_value&=~((uint32_t)(SCB_AIRCR_VECTKEY_Msk |SCB_AIRCR_PRIGROUP_Msk)); reg_value = (reg_value|((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
(PriorityGroupTmp<< SCB_AIRCR_PRIGROUP_Pos) ); SCB->AIRCR = reg_value;
}

主要通过SCB->AIRCR寄存器的值来设置中断优先级分组。

assert_param(IS_NVIC_PRIORITY_GROUP(PrioorityGroup));
断言函数,对入口参数的有效性进行判断。

#define IS_NVIC_PRIORITY_GROUP(GROUP)
(((GROUP) == NVIC_PriorityGroup_0) ||\
((GROUP) == NVIC_PriorityGroup_1) || \
((GROUP) == NVIC_PriorityGroup_2) || \
((GROUP) == NVIC_PriorityGroup_3) || \
((GROUP) == NVIC_PriorityGroup_4))
HAL_StatusTypeDef HAL_Init(void)
{/* Configure Flash prefetch */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \defined(STM32F102x6) || defined(STM32F102xB) || \defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \defined(STM32F105xC) || defined(STM32F107xC)/* Prefetch buffer is not available on value line devices */__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE *//* Set Interrupt Group Priority */HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2); //设置优先级分组2/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */HAL_InitTick(TICK_INT_PRIORITY);/* Init the low level hardware */HAL_MspInit();/* Return function status */return HAL_OK;
}

HAL_Init,这个函数非常重要,主要是对中断优先级分组,FLASH以及硬件层进行初始化。

void HAL_NVIC_SetPriority(IRQn_Type IRQn, 
uint32_t PreemptPriority, uint32_t SubPriority);
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);

第一个函数 HAL_NVIC_SetPriority 是用来设置单个优先级的抢占优先级和响应优先级的值。
第二个函数 HAL_NVIC_EnableIRQ 是用来使能某个中断通道。
第三个函数 HAL_NVIC_DisableIRQ 是用来清除某个中断使能的,也就是中断失能。

http://www.lryc.cn/news/102977.html

相关文章:

  • 17-汽水瓶
  • Mindar.JS——实现AR图像追踪插入图片或视频
  • JVM源码剖析之JIT工作流程
  • 【投资笔记】(23/7/31)下半年消费复苏的机会来了?
  • MySQL二进制日志(binlog)配置、二进制日志binlog查看、mysqlbinlog查看二进制日志、二进制日志binlog清理等详解
  • Python内存管理解析:高效利用资源的关键
  • 解决Debian10乱码以及远程连接ssh的问题
  • C# 泛型(Generic)
  • Golang之路---02 基础语法——流程控制(if-else , switch-case , for-range , defer)
  • HTTP——HTTP报文内的HTTP信息
  • RocketMQ工作原理
  • Jenkins+Docker+Docker-Compose自动部署,SpringCloud架构公共包一个任务配置
  • spring boot 2 配置上传文件大小限制
  • Jmeter —— 录制脚本
  • 从零开始学Docker(一):Docker的安装部署
  • 【ROS 02】ROS通信机制
  • uniapp 选择城市定位 根据城市首字母分类排序
  • flex盒子 center排布,有滚动条时,拖动滚动条无法完整显示内容
  • Workbox使用分享
  • 秋招算法备战第32天 | 122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II
  • Python状态模式介绍、使用
  • Github-Copilot初体验-Pycharm插件的安装与测试
  • Spring AOP API详解
  • 分治法 Divide and Conquer
  • super(Module_ModuleList, self).__init__()的作用是什么?
  • 【并发专题】操作系统模型及三级缓存架构
  • java基础复习(第二日)
  • Ansible自动化运维工具
  • LeetCode-116-填充每个节点的下一个右侧节点指针
  • 前端面试的性能优化部分(3)每篇10题