Cortex-M3/M4内核NVIC及HAL库函数详解(3):HAL库中断应用层函数实现

0 工具准备

Keil uVision5

Cortex M3权威指南(中文)

Cortex M3与M4权威指南

stm32f407的HAL库工程

STM32F4xx中文参考手册

1 HAL库中断应用层函数实现

在完成了HAL库中断底层函数后,应用层的封装可以做得千变万化。打开Librarier->STM32F4xx_HAL_Driver->Inc->stm32f4xx_hal_cortex.h,可以看到有关中断的应用层函数:

c 复制代码
void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
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);
void HAL_NVIC_SystemReset(void);
uint32_t HAL_NVIC_GetPriorityGrouping(void);
void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority);
uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn);
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn);
void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn);
uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn);

1.1 HAL_NVIC_SetPriorityGrouping设置中断优先级分组函数

c 复制代码
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);
}

这个函数实际上就是调用NVIC_SetPriorityGrouping这个函数,设置SCB->AIRCR中的bit10-8(优先级分组),可设置的值如下:

c 复制代码
#define NVIC_PRIORITYGROUP_0         0x00000007U /*!< 0 bits for pre-emption priority
                                                      4 bits for subpriority */
#define NVIC_PRIORITYGROUP_1         0x00000006U /*!< 1 bits for pre-emption priority
                                                      3 bits for subpriority */
#define NVIC_PRIORITYGROUP_2         0x00000005U /*!< 2 bits for pre-emption priority
                                                      2 bits for subpriority */
#define NVIC_PRIORITYGROUP_3         0x00000004U /*!< 3 bits for pre-emption priority
                                                      1 bits for subpriority */
#define NVIC_PRIORITYGROUP_4         0x00000003U /*!< 4 bits for pre-emption priority
                                                      0 bits for subpriority */

1.2 HAL_NVIC_SetPriority设置中断请求优先级函数

c 复制代码
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
{ 
  uint32_t prioritygroup = 0x00U;
  
  /* 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));
}

这个函数实际上就是调用NVIC_SetPriority函数,根据传入的中断编号分别设置外部中断或系统异常优先级寄存器。

1.3 HAL_NVIC_EnableIRQ使能中断请求函数

c 复制代码
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
{
  /* Check the parameters */
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  
  /* Enable interrupt */
  NVIC_EnableIRQ(IRQn);
}

这个函数实际上就是调用NVIC_EnableIRQ函数,使能对应的中断。

1.4 HAL_NVIC_DisableIRQ使能中断请求函数

c 复制代码
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
{
  /* Check the parameters */
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  
  /* Disable interrupt */
  NVIC_DisableIRQ(IRQn);
}

这个函数实际上就是调用NVIC_DisableIRQ函数,失能对应的中断。

1.5 HAL_NVIC_SystemReset系统复位函数

c 复制代码
void HAL_NVIC_SystemReset(void)
{
  /* System Reset */
  NVIC_SystemReset();
}

这个函数实际上就是调用NVIC_SystemReset函数,让MCU复位。

1.6 HAL_NVIC_GetPriorityGrouping获取中断优先级分组函数

c 复制代码
uint32_t HAL_NVIC_GetPriorityGrouping(void)
{
  /* Get the PRIGROUP[10:8] field value */
  return NVIC_GetPriorityGrouping();
}

这个函数实际上就是调用NVIC_GetPriorityGrouping函数,获取中断优先级分组设置值。

1.7 HAL_NVIC_GetPriority获取中断优先级函数

c 复制代码
void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
 /* Get priority for Cortex-M system or device specific interrupts */
  NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority);
}

这个函数就是根据传入的中断请求编号、中断优先级分组、主优先级返回地址、子优先级返回地址获取中断请求的主、子优先级。

1.8 HAL_NVIC_GetPendingIRQ获取中断请求挂起状态

c 复制代码
uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn)
{
  /* Check the parameters */
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  
  /* Return 1 if pending else 0 */
  return NVIC_GetPendingIRQ(IRQn);
}

这个函数实际上就是调用NVIC_GetPendingIRQ函数,获取中断请求的挂起状态。

1.9 HAL_NVIC_SetPendingIRQ设置中断请求挂起函数

c 复制代码
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn)
{
  /* Check the parameters */
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  
  /* Set interrupt pending */
  NVIC_SetPendingIRQ(IRQn);
}

这个函数实际上就是调用NVIC_SetPendingIRQ函数,设置中断请求挂起。

1.10 HAL_NVIC_ClearPendingIRQ中断请求解挂函数

c 复制代码
void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{
  /* Check the parameters */
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  
  /* Clear pending interrupt */
  NVIC_ClearPendingIRQ(IRQn);
}

这个函数实际上就是调用NVIC_ClearPendingIRQ函数,将中断请求解挂。

1.11 HAL_NVIC_GetActiveIRQ获取中断请求激活状态

c 复制代码
uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn)
{
  /* Check the parameters */
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
  
  /* Return 1 if active else 0 */
  return NVIC_GetActive(IRQn);
}

这个函数实际上就是调用NVIC_GetActive函数,获取中断请求激活状态。

相关推荐
DLGXY3 小时前
STM32——旋转编码器计次(七)
stm32·单片机·嵌入式硬件
暮云星影6 小时前
四、linux系统 应用开发:UI开发环境配置概述 (三)
linux·ui·arm
独处东汉8 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
風清掦8 小时前
【江科大STM32学习笔记-04】0.96寸OLED显示屏
笔记·stm32·学习
想放学的刺客12 小时前
单片机嵌入式试题(第25)嵌入式系统可靠性设计与外设驱动异常处理
stm32·单片机·嵌入式硬件·mcu·物联网
wotaifuzao12 小时前
STM32+FreeRTOS 长期可维护架构设计(事件驱动篇)-- 告别“屎山”代码
c语言·stm32·嵌入式硬件·freertos·状态机·事件驱动·嵌入式架构
一路往蓝-Anbo13 小时前
第 1 篇:对象池模式 (Object Pool) —— 裸机下的动态内存革命
jvm·数据库·stm32·单片机·嵌入式硬件·网络协议·tcp/ip
大神与小汪14 小时前
STM32WB55蓝牙广播数据
stm32·单片机·嵌入式硬件
芯思路15 小时前
STM32开发学习笔记之七【LCD显示图片】
笔记·stm32·学习
【赫兹威客】浩哥16 小时前
【赫兹威客】Arduino安装教程
stm32·单片机·嵌入式硬件