STM32中断控制及优先级设置
M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占;bit=0表示非抢占即子优先级;所以共有5中方案分组:
分组 Bit7 Bit6 Bit5 Bit4 说明:
第0组 0 0 0 0
第1组 1 0 0 0
第2组 1 1 0 0 抢占共有2^2=4(0~3);子优先级2^2=4(0~3),共4*4=16级嵌套
第3组 1 1 1 0 抢占共有2^3=4(0~7);子优先级2^1=2(0~1),共8*2=16级嵌套
第4组 1 1 1 1
到底谁优先:数字越小优先级越高,抢占级数字小的可剥夺抢占级数字大的
1抢占相同,子优先级不同:此时没有抢占剥夺,此时按照子优先级顺序排序
2抢占和子优先级都相同但有先后:此时无抢占剥夺,依照FIFO,前一个执行完了才能执行后者;
3抢占和子优先级都相同且同时到达:此时按照中断向量表顺序排先后
开关总中断:
在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h,但在标准库3.5版本中没有改文件,NVIC控制放在了在了mis.c(优先级设置与分组)中和core.cm3.c(总中断的开关控制)) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。
CPSID I ; PRIMASK=1, ;关中断
CPSIE I ; PRIMASK=0, ;开中断
CPSID F ; FAULTMASK=1, ;关异常
CPSIE F ; FAULTMASK=0 ;开异常
PRIMASK(总中断控制位):只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。
FAULTMASK(总异常控制位)::只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。
下面两个函数等效于关闭总中断:
void NVIC_SETPRIMASK(void);
void NVIC_RESETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
void NVIC_RESETFAULTMASK(void);
可以用宏定义开关:
#define EA=1 __set_PRIMASK(1);//__set_FAULTMASK(1)
#define EA=0 __set_PRIMASK(0);//__set_FAULTMASK(0)
***********************************************************************************
/THUMB指令不支持汇编内联
//采用如下方法实现执行汇编指令WFI
//CHECK OK
//091209
__asm void WFI_SET(void)
{
WFI;
}
WFE 休眠并且在发生事件时被唤醒
WFI 休眠并且在发生中断时被唤醒//进入待机模式
//check ok
//091202
void Sys_Standby(void)
{
SCB->SCR|=1<<2;//使能SLEEPDEEP位 (SYS->CTRL)
RCC->APB1ENR|=1<<28; //使能电源时钟
PWR->CSR|=1<<8; //设置WKUP用于唤醒
PWR->CR|=1<<2; //清除Wake-up 标志
PWR->CR|=1<<1; //PDDS置位
WFI_SET(); //执行WFI指令
}
STM32中断控制及优先级设置的更多相关文章
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
- stm32中断 抢占优先级 和 响应优先级 有什么区别
与51不同,stm32的中断分类更灵活.51只是按先后顺序大小排列互相打断. stm32中多了响应优先级这一概念. stm32的中断分为 1.抢占(占先)优先级. 2.响应优先级. 1.抢占优先级.抢 ...
- STM32中断管理函数
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...
- stm32 中断几个库函数实现过程分析
感谢原文作者:鱼竿的传说,这篇文章写得不错,转载自 http://www.cnblogs.com/chineseboy/archive/2013/03/14/2956782.html 前题: 闭门造车 ...
- 重学STM32---(三) 中断分组和优先级
看了大半天,终于把原子哥的例程中的中断分组和优先级看懂了,勉勉强强知道了怎么设置中断分组和优先级,,不容易啊.下面就是我收集的资料及我的理解 分组不是很难,就是有一点知道就就全部明白了: // 设置N ...
- 【转载】stm32中断学习
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加 ...
- STM32串口控制步进电机(原创)
用的42步进电机: 厂家可能不一样,两项四线步进电机,里面有两个线圈.在电机什么电都没有接的情况下,用万用表测量四个管脚:两两短接(或者阻值很小)的为一组,可以分别接A+,a-剩余接B+,B-;顺序可 ...
- 第16章 STM32中断应用概览
第16章 STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...
- 【转】stm32中断嵌套全攻略
断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记.废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包 ...
随机推荐
- IOCP 浅析
http://www.ibm.com/developerworks/cn/java/j-lo-iocp/ https://msdn.microsoft.com/en-us/library/window ...
- php pdo错误:SQLSTATE[HY093]: Invalid parameter number: parameter was not defined
原因:在使用execute()执行时没有传对应prepare()设置的参数
- HTML5 拖放(Drag 和 Drop)
拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. <!DOCTYPE HTML> <html> <hea ...
- Unity3d NGUI的使用(九)(UIScrollView制作滑动列表)
UIScrollView制作滑动列表,可横向,竖直展示一些列表在固定可视范围内 UIScrollVIew只是一个可滑动的UI组件 如果需要制作复杂的可视区域UI需要配合使用UIPanel与UIGrid ...
- InnoDB Plugin文件格式(概述)
本文将介绍InnoDB Plugin数据表格式的基本概念. 1. 配置参数innodb_file_format 这是一个很容易混淆的概念.目前,在InnoDB Plugin(1.0.6)配置文件中in ...
- bash feature
bash调用-启动文件-交互式shell-条件表达式-shell算术-别名-数组-目录栈-提示符控制-受限shell-posix模式 受限shell bash --restricted 它用来建立一个 ...
- FrameBuffer
http://blog.csdn.net/luxiaoxun/article/details/7622988 http://blog.csdn.net/godspirits/article/detai ...
- 从K近邻算法谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...
- Web前端相关
1)emmet2)prettify3)angularjs4)coffeescript5)bower (nodejs)6)requirejs
- windows p12(pfx)个人证书安装过程
证书库个人证书存储区为其中的每个证书维护一个属性CERT_KEY_PROV_INFO_PROP_ID,该属性指定了证书对应的密钥容器的相关信息,包括密钥容器名,CSP名称,CSP类型,密钥用途,以及C ...