【STM32】STM32之NVIC

本篇博文最后修改时间: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

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、 基础知识

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(); 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜甜的大香瓜

谢谢你的支持^_^

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值