NVIC
1中断:每一个中断都会对应一个服务程序
2NVIC 他的做用是负责中断优先级管理
3IP bit[7:4]每一个中断都有一个IP寄存器,用于设置中断相关的属性
AIRCR[10:8]只一个AIRCR寄存器负责所有的中断的优先级的分组
4中断分组 1.void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
NVIC_PriorityGroup_0~4
5中断初始化
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
uint8_t NVIC_IRQChannel; 中断号
stm32f4xx.h typedef enum IRQn 中断号的定义
6 抢占优先级 uint8_t NVIC_IRQChannelPreemptionPriority; 0~15
7 响应优先级 NVIC_IRQChannelSubPriority; 0~15
8中断使能开关 FunctionalState NVIC_IRQChannelCmd; ENABLE DISABLE
9 中断响应方式 电平触发
边沿触发
跳变触发 上升沿 下降沿 双边沿
10选择中断线: EXTI 0~15 可选择对应的GPIO端口
void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)
每一个EXTIn 只能是每组GPIO第
每一个EXTIn 只能是每组GPIO第n个端口
EXTI_PortSourceGPIOx EXTI_PortSourceGPIOA~G 选择对应的组
11 配置触发方式
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)
uint32_t EXTI_Line; 外部中断线
EXTI_Line0~22
EXTIMode_TypeDef EXTI_Mode;
EXTI_Mode_Interrupt 中断
EXTI_Mode_Event 事件
EXTITrigger_TypeDef EXTI_Trigger 触发方式
EXTI_Trigger_Rising 上升沿
EXTI_Trigger_Falling 下降沿
EXTI_Trigger_Rising_Falling 双边沿
EXTI_LineCmd 使能开关
ENABLE DISABLE
代码示例:
1 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
2
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
2 看门狗
1打开写保护 void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);
2设置分频系数 void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);
3设置RLR寄存器值 void IWDG_SetReload(uint16_t Reload);
4喂狗 void IWDG_ReloadCounter(void);
5使能看门狗 void IWDG_Enable(void);
6手动喂狗 IWDG_ReloadCounter();
void iwdg_init()
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(IWDG_Prescaler_64);
//64/32000 * 1000
IWDG_SetReload(1000);
IWDG_ReloadCounter(); //
IWDG_Enable();
}
//中断服务程序,名字固定,并且类型void (void)
void EXTI0_IRQHandler(void)
{
//1.判断该中断产生源
delay_ms(10);//消除抖动
if(0 == WK_UP) { //判断中断确实由WK_UP按键产生
//2.中断处理部分
//BEEP = !BEEP;
IWDG_ReloadCounter();
}
//3.清除中断标志
EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI4_IRQHandler(void)
{
delay_ms(10);
if(0 == KEY0) {
//2.中断处理部分
PFout(9) = !PFout(9);
}
//3.清除中断标志
EXTI_ClearITPendingBit(EXTI_Line4);
}
void EXTI3_IRQHandler(void)
{
delay_ms(10);
if(0 == KEY1) {
//2.中断处理部分
PFout(10) = 0;
} else if(1 == KEY1) {
PFout(10) = 1;
}
//3.清除中断标志
EXTI_ClearITPendingBit(EXTI_Line3);
}
void my_exti_init()
{
NVIC_InitTypeDef NVIC_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
key_init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line = EXTI_Line4;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStruct);
EXTI_InitStruct.EXTI_Line = EXTI_Line3;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_Init(&EXTI_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_Init(&NVIC_InitStruct);
}
NVIC的更多相关文章
- STM32 NVIC配置详解
例程: /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ...
- stm32之NVIC
非本人原创,转载自http://blog.csdn.net/denghuanhuandeng/article/details/8350392 STM32的NVIC理解 例程: /* Configur ...
- STM32 之 NVIC(中断向量、优先级) 简述
一.背景 需要使用STM32的CAN进行通信,经过一系列配置后,已可正常收发,还剩下一个CAN通信的错误处理.可错 误中断使能寄存器已经配置使能了,出错后就是无法进入"CAN1_SCE_IR ...
- STM32 NVIC
在stm32中是要配置nvic的.何为nvic,对于我这样的初学者来说,直观感受就是在设置为中断后 还需要配置 中断的优先级nvic就是搞这个的. 那么具体的需要配置些什么那? void NVIC_C ...
- 《Cortex-M0权威指南》之体系结构---嵌套中断控制器(NVIC)
转载请注明来源:cuixiaolei的技术博客 为了管理中断请求的优先级并处理其他异常,Cortex-M0处理器内置了嵌套中断控制器(NVIC).NVIC的一些可编程控制器控制着中断管理功能,这些寄存 ...
- cortex m0 lpc1114的NVIC中断如何使用
LPC1114单片机的NVIC中断函数,有开中断.关中断.设置优先级.挂起等操作函数.这些函数位于core_cm0.h文件里面.比如开中断的函数如下: /** \brief Enable Extern ...
- stm32的NVIC是什么?
NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器. 对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的.8位的话 ...
- 【原创】NVIC中断
(1)NVIC 全称为Next Vector Interrupt Controoler,嵌套中断向量控制器,是ARM Cortex M3的内部设备之一,任何一款基于ARM Cortex M3的 ...
- GPIOLED配置、key、中断NVIC配置
#include "stm32f10x.h" #include "stm32f10x_gpio.h" //内核,(NVIC) #include "mi ...
- NVIC配置中的分组详解
在配置优先级的时候,要注意一个很重要的问题,中断种类的数量. NVIC只可以配置 16 种 中断向量的优先级,也就是说,抢占优先级和响应优先 级的数量由一个 4 位的数字来决定, 把这个 4 位数字的 ...
随机推荐
- VS2012配色方案
VS2012配色方案 这些天由于公司项目比较忙,所以天天盯着电脑8小时,而且我的开发工具VS2012是白色背景的所以每天下班都搞的眼睛巨疼. 今天在网上找到一个很好的配色方案,所以有同样烦恼的童鞋们可 ...
- socket网络编程快速上手(二)——细节问题(2)
2.TCP数据包接收问题 对初学者来说,很多都会认为:客户端与服务器最终的打印数据接收或者发送条数都该是一致的,1000条发送打印,1000条接收打印,长度都为1000.但是,事实上并不是这样,发送打 ...
- 对象池化技术 org.apache.commons.pool
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率.Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现,可以 ...
- C#线程同步(转)
线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不 ...
- mysql 和 mongo db 语法对比
本文描述了MySQL中的常用SQL语句在MongoDB中的写法,如果你长期使用MySQL而对MongoDB跃跃欲试,这篇简单的文章可以帮助你更快的进入角色.查询:MySQL:SELECT * FROM ...
- 微信公众平台自定义菜单创建代码实现—java版
搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知道你们什么感觉. 我知道是post一个带参数的 ...
- 读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF)
读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF) 这次介绍的这个框架只适用于中小项目,并且各个读写数据库结构是一致的情况,还要并且是写入数据库只有1台情况. 我们来看看这个子系 ...
- C++ 容器的综合应用的一个简单实例——文本查询程序
C++ 容器的综合应用的一个简单实例——文本查询程序 [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例.通过实现一个简单的文本查 ...
- Android开发(30)--AutoCompleteTextView和MultiAutoCompleteTextView自动提示输入内容
首先大家都见过类似这种效果, AutoCompleteTextView是实现动态匹配输入的内容 下面就通过一个实例来说明AutoCompleteTextView,同样,AutoCompleteText ...
- 约瑟夫问题的java实现
约瑟夫问题,又称丢手帕问题.试着实现了一下,实现逻辑简单,没有复杂的算法,适合新手参考. //参数step指步进值,步进到几则出列 //参数count指共有几个人 public static int ...