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

相关推荐
枯无穷肉8 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名6778 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式科普8 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
云山工作室9 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
艺术家天选11 小时前
STM32点亮LED灯
stm32·单片机·嵌入式硬件
向阳逐梦11 小时前
基于STM32F4单片机实现ROS机器人主板
stm32·单片机·机器人
小猪写代码12 小时前
STM32 水质水位检测项目 (调试模块)和(延时模块)
stm32·单片机·嵌入式硬件
御风_2113 小时前
STM32单片机使用CAN协议进行通信
stm32·单片机·嵌入式硬件
逝灮14 小时前
【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块
驱动开发·stm32·单片机·嵌入式硬件·物联网·蓝桥杯·温度传感器
Wallace Zhang15 小时前
STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)
ide·vscode·stm32