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函数,获取中断请求激活状态。

相关推荐
幼儿园蛋小黑16 小时前
ARM 时钟与定时器详解:从原理到实践
arm
XiHongShi201616 小时前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
幼儿园蛋小黄17 小时前
从定时器到时钟:ARM 嵌入式学习总结
arm
优信电子18 小时前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
深圳老胡18 小时前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk55519 小时前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
祖力551 天前
ARM时钟
嵌入式硬件·arm·时钟·imx6ull
koi77u1 天前
嵌入式学习——ARM(3)
arm
Brilliantwxx1 天前
【STM32】 SPI Flash 驱动开发实战:阻塞模式驱动 W25Q64(含工程代码)
开发语言·stm32·单片机·嵌入式硬件
学linux的QQ蛋1 天前
i.MX6ULL GIC 中断整体知识点总结和ARM时钟重点总结
arm·时钟·中断