本篇博文最后修改时间:2016年12月29日,00:56。
一、简介
本文介绍如何使用STM32的NVIC。
二、实验平台
库版本:STM32F10x_StdPeriph_Lib_V3.5.0
编译软件:MDK4.53
硬件平台:STM32开发板(主芯片stm32f103c8t6)
仿真器:JLINK
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
1、NVIC是什么?
答:NVIC(Nested Vectored Interrupt Controller )是嵌套向量中断控制器。
在STM32中NVIC被用于中断优先级的控制。
2、NVIC是如何管理中断优先级的?
NVIC的中断优先级分为抢占优先级(优先等级高)和响应优先级(优先等级低)。
寄存器有4个bit用于抢占优先级和响应优先级,而具体两种优先级占用的bit数,由下面的5个分组决定:
比如第2组,一共有2bit用于抢占优先级、2bit用于响应优先级。
则抢占优先级能取的数值为00、01、10、11,也就是0、1、2、3这四个数字;响应优先级能取的数值为00、01、10、11,也就是0、1、2、3这四个数字。则一共有16个优先级顺序组合方式。
如:
①串口1(抢占优先级为1、响应优先级为2)比串口2(抢占优先级为1、响应优先级为3)的中断优先级高。
②串口1(抢占优先级为0、响应优先级为2)比串口2(抢占优先级为1、响应优先级为2)的中断优先级高。
五、实验步骤
1、编写并添加NVIC驱动
1)编写驱动GUA_NVIC.c(存放在“……\HARDWARE”)
//******************************************************************************
//name: GUA_NVIC.c
//introduce: NVIC驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
#include "GUA_NVIC.h"
#include "stm32f10x.h"
/*********************内部函数声明************************/
static void GUA_NVIC_Config(GUA_U32 nGUA_NVIC_Group, GUA_U8 nGUA_NVIC_Channel, GUA_U8 nGUA_NVIC_PreemptionPriority,
GUA_U8 nGUA_NVIC_SubPriority, FunctionalState GUA_NewState);
//******************************************************************************
//name: GUA_NVIC_Config
//introduce: 中断优先级配置
//parameter: NVIC_Group:组别
// NVIC_Channel:中断通道
// NVIC_PreemptionPriority:占先式优先级设置
// NVIC_SubPriority:副优先级设置
// NewState:使能位
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
static void GUA_NVIC_Config(GUA_U32 nGUA_NVIC_Group, GUA_U8 nGUA_NVIC_Channel, GUA_U8 nGUA_NVIC_PreemptionPriority,
GUA_U8 nGUA_NVIC_SubPriority, FunctionalState GUA_NewState)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(nGUA_NVIC_Group); //组别
NVIC_InitStructure.NVIC_IRQChannel = nGUA_NVIC_Channel; //中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = nGUA_NVIC_PreemptionPriority; //占先式优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = nGUA_NVIC_SubPriority; //副优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd = GUA_NewState; //中断使能
NVIC_Init(&NVIC_InitStructure); //按指定参数初始化中断
}
//******************************************************************************
//name: GUA_NVIC_Init
//introduce: 中断优先级初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
void GUA_NVIC_Init(void)
{
//串口中断
GUA_NVIC_Config(NVIC_PriorityGroup_2, USART2_IRQn, 0, 1, ENABLE);
//限位开关UP键
GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI1_IRQn, 1, 0, ENABLE);
//限位开关DOWN键
GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI4_IRQn, 1, 1, ENABLE);
//红外接收
GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI3_IRQn, 2, 2, ENABLE);
//红外2接收
GUA_NVIC_Config(NVIC_PriorityGroup_2, EXTI15_10_IRQn, 3, 2, ENABLE);
//定时器2
GUA_NVIC_Config(NVIC_PriorityGroup_2, TIM2_IRQn, 2, 0, ENABLE);
}
提供了两个注释例子,使用了分组2的中断优先级配置,可自行参考写入所需初始化的NVIC配置中断。
2)编写驱动头文件GUA_NVIC.h(存放在“……\HARDWARE”)
//******************************************************************************
//name: GUA_NVIC.h
//introduce: NVIC驱动的头文件
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.29
//******************************************************************************
#ifndef _GUA_NVIC_H_
#define _GUA_NVIC_H_
/*********************宏定义************************/
#ifndef GUA_U8
typedef unsigned char GUA_U8;
#endif
#ifndef GUA_8
typedef signed char GUA_8;
#endif
#ifndef GUA_U16
typedef unsigned short GUA_U16;
#endif
#ifndef GUA_16
typedef signed short GUA_16;
#endif
#ifndef GUA_U32
typedef unsigned long GUA_U32;
#endif
#ifndef GUA_32
typedef signed long GUA_32;
#endif
#ifndef GUA_U64
typedef unsigned long long GUA_U64;
#endif
#ifndef GUA_64
typedef signed long long GUA_64;
#endif
/*********************外部函数************************/
extern void GUA_NVIC_Init(void);
#endif
3) 工程中添加GUA_NVIC.c
4)在MDK设置中添加NVIC驱动源文件路径
2、添加库的NVIC驱动
1)添加库的NVIC驱动文件
2)添加库的NVIC驱动头文件(stm32f10x_conf.h 中)
#include "misc.h"
3、在应用层中调用NVIC
1)添加驱动头文件(main.c中)
#include "GUA_NVIC.h"
2)添加驱动初始化代码(main.c的main函数中)
//中断优先级配置
GUA_NVIC_Init();