`
haoyifen
  • 浏览: 16820 次
文章分类
社区版块
存档分类
最新评论

STM32中断设置相关寄存器的分析

 
阅读更多

1.中断设置使能和清除寄存器器的分析

地址 名称 描述
0xE000 E100 SETENA 设置使能中断0到31,写1将位置1,写0无作用
0xE000 E180 CLRENA 写1将位置0,禁能中断,写0无作用
__ASM void SET_CLEAR_IRQ(void)
            {
                    LDR         R0, =0xE000E100
                    MOVS        R1, #0x4
                    STR         R1, [R0]

                    LDR         R0, =0xE000E180
                    MOVS    R1, #0x4
                    STR         R1, [R0]
        }

初始状态是这样的`
这里写图片描述

这里第一个STR R1,[R0]是设置使能外部中断2的。执行后:
这里写图片描述

第二个STR R1,[R0]是设置除能外部中断2的。执行后:
这里写图片描述

可以看到SETENA,CLRENA寄存器所对应的地址的内容是相同的,都是中断寄存器的内容,表示哪个中断是开启的。
只是写1后有不同的行为,SETENA写1,置位对应的位,CLRENA写1,清除对应的位。

使用两个寄存器,一个用来设置,一个用来清除,这样的操作的优势在于使能或者除能中断只需要一个写操作就可以完成。

如果使用一个简单的读/写寄存器来完成操作,则使能或者除能中断需要读-修改-写的过程。
如果在读写过程中,发生了中断,而中断中改变了该寄存器的值,那么中断返回后,继续写操作,那么ISR对寄存器的修改有可能会被覆盖。

使用C语言:

*((volatile unsigned long *)(0xE000E100))=0x04;//使能中断2
*((volatile unsigned long *)(0xE000E180))=0x04;//除能中断2

CMSIS提供了以下函数来使能或者除能中断:

void NVIC_EnableIRQ(IRQn_Type_IRQn);
void NVIC_DisableIRQ(IRQn_Type_IRQn);

2.中断挂起和清除挂起

当一个终端发生了,却又无法立即处理(比如处理器正在处理更高优先级的中断),这个中断请求就会被挂起。挂起状态保存在一个寄存器中。如果中断变为当前优先级最高的中断,中断得到处理,那么硬件就会清除中断请求,也可以手动清除。
地址 名称 描述
0xE000E200 SETPEND 设置中断0到31的挂起状态,写1将置1,写0无作用
0xE000E280 CLRPEND 清除中断0到31的挂起状态,写1置位,写0无作用

汇编代码和C语言访问参考上面的中断使能,除能,将地址替换一下就行了。

CMSIS提供了以下函数来访问中断挂起状态寄存器:

void NVIC_SetPendingIRQ(IRQn_Type_IRQn);//设置一个中断的挂起状态
void NVIC_ClearPendingIRQ(IRQn_Type_IRQn);//清除
void NVIC_GetPendingIRQ(IRQn_Type_IRQn);//返回true表示中断挂起状态为1

3.中断优先级

Cortex-M0(+)每一个外部中断都是有一个对应的优先级寄存器(设置内部异常优先级的寄存器和这个不同),每个优先级设置占用1个字节,但是只使用最高的2个位。Cortex-M3使用的是1个字节中的高4位,分为两组,响应优先级和子优先级。Cortex-M0(+)是没有子优先级设置的。为什么使用高位做优先级,主要是为了不同处理器间移植,不会导致中断优先级发生顺序的颠倒。
Cortex-M0中的NVIC寄存器只支持字传输,这样每次修改寄存器都会同时涉及4个中断优先级寄存器。
对于CM0,应该避免中断使能之后改变优先级设定。改变的结果在ARMv6-M体系结构上是不可预知的。而CM3支持中断优先级的动态切换,且支持中断优先级设置寄存器的字节或者半字传输。

设置中断#2的优先级为0xC0(采用高2位,优先级为3),使用C语言:
(访问可能会被随时且不被当前程序所知道的改变的内容,需要使用volatile)

unsigned int temp;
temp=*((volatile unsigned int *)(0xE000E400));
temp=temp&(0xFF00FFFF)|(0xC0<<16);
*((volatile unsigned int*)(0xE000E400))=temp;

CMSIS中的设置函数:

void NVIC_SetPriority(IRQn_Type_IRQn,uint32_t priority);//设置中断或异常的优先级
void NVIC_GetPriority(IRQn_Type_IRQn);//返回中断或异常的优先级

4.异常屏蔽寄存器(PRIMASK)

在对时间敏感的应用,需要在一段较短的时间内禁止所有中断。CM0通过一个PRIMASK寄存器来屏蔽除了NMI和硬件错误异常的其他所有中断和系统异常。
PRIMASK只有一位可用。当为1时,禁止中断和异常,为0时使能。
设置方法:

    MOVS  R0 , #1
    MSR     PRIMASK, R0

或者

CPSIE i;//清除PRIMASK
CPSID i;//设置PRIMASK

CMSIS中

void _enable_irq(void);
void _disable_irq(void);

这两个函数会被编译为CPS指令。
注意时间敏感的程序完成后,需要清除PRIMASK。中断返回并不会清除PRIMASK。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    基于matlab平抑风电波动的电-氢混合储能容量优化配置【含Matlab源码 期】.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    dynamic_unet-0.0.2-py3-none-any.whl

    dynamic_unet-0.0.2-py3-none-any.whl

    基于Java语言的动态二维码生成与绘制设计源码

    该项目是一款基于Java语言的动态二维码生成与绘制设计源码,包含126个文件,包括64个JAR包、24个PNG图片、17个GIF动画、10个XML配置、7个Java源文件、2个Markdown文件、1个Idea项目配置文件和1个JPG图片文件。该项目通过图像生成动态二维码,适用于需要动态二维码绘制的场景。

    go1.23.1.linux-amd64.tar.gz

    golang linux amd63 sdk

    JavaScript高分作品《微信小程序-图书馆管理系统》+源代码+文档说明

    <项目介绍> - 微信小程序—图书馆管理系统 - 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------

    Win实现Mac一样的流畅丝滑

    ψx60wyycaqwin25rψ Win实现Mac一样的流畅丝滑

    Java2Top -「Java学习+面试指南+编程资源」

    Java2Top |「Java学习+面试指南+编程资源」一份涵盖 Javacoder 从零基础到进阶大厂的全面学习与面试指南~。

    基于Springboot和Vue的疫情管理系统源码 疫情管理系统代码(程序,中文注释)

    疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统-疫情管理系统 1、资源说明:疫情管理系统源码,本资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 2、适用人群:计算机相关专业(如计算计、信息安全、大数据、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工等学习者,作为参考资料,进行参考学习使用。 3、资源用途:本资源具有较高的学习借鉴价值,可以作为“参考资料”,注意不是“定制需求”,代码只能作为学习参考,不能完全复制照搬。需要有一定的基础,能够看懂代码,能够自行调试代码,能够自行添加功能修改代码。 4. 最新计算机软件毕业设计选题大全(文章底部有博主联系方式): https://blog.csdn.net/2301_79206800/article/details/135931154 技术栈、环境、工具、软件: ① 系统环境:Windows ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDE

    基于matlab粒子群综合能源系统优化【含Matlab源码 期】.zip

    CSDN海神之光上传的全部代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,可私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博主博客文章底部QQ名片; 4.1 CSDN博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    af4fff13f6f2a7594ca86979127f5212.JPG

    af4fff13f6f2a7594ca86979127f5212.JPG

    德国大陆24GHz短距宽角毫米波雷达ARS408,SRR308技术资料含DBC

    德国大陆24GHz短距宽角毫米波雷达ARS408,SRR308技术资料含DBC

    基于Springboot和Vue的大学生一体化服务平台源码 大学生一体化服务平台代码(程序,中文注释)

    大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台-大学生一体化服务平台 1、资源说明:大学生一体化服务平台源码,本资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 2、适用人群:计算机相关专业(如计算计、信息安全、大数据、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工等学习者,作为参考资料,进行参考学习使用。 3、资源用途:本资源具有较高的学习借鉴价值,可以作为“参考资料”,注意不是“定制需求”,代码只能作为学习参考,不能完全复制照搬。需要有一定的基础,能够看懂代码,能够自行调试代码,能够自行添加功能修改代码。 4. 最新计算机软件毕业设计选题大全(文章底部有博主联系方式): https://blog.csdn.net/2301_79206800/article/details/135931154 技术栈、环境、工具、软件: ① 系统环境:Window

    基于asp.net的语言课程网设计与实现.docx

    基于asp.net的语言课程网设计与实现.docx

    基于Java语言的lib-android-PermissionHelper封装Android M运行时权限申请设计源码

    该项目为Java语言编写的Android运行时权限申请封装库,名为lib-android-PermissionHelper,源码包含59个文件,涵盖20个XML配置文件、14个Java源文件、7个PNG资源文件、5个Gradle构建脚本文件、3个Git忽略规则文件以及若干其他辅助文件。此库专注于Android M及以上版本的权限申请流程封装,旨在简化开发者对运行时权限的申请处理。

    基于Vue框架的hao123程序员网址导航设计源码

    该项目是一款基于Vue框架构建的程序员网址导航系统源码,包含136个文件,包括56个PNG图片、49个ICO图标、11个Vue组件文件、5个JavaScript文件以及少量JSON、YAML和其他配置文件。该系统以简洁明了的界面,为程序员提供便捷的网址导航服务。

    基于c语言的力学相关的流体源码.zip

    基于c语言的力学相关的流体源码.zip

    基于c语言的自创军旗游戏源码.zip

    基于c语言的自创军旗游戏源码.zip

    基于 OpenCV 构建的基于边缘的车道线检测器

    该程序对帧率很敏感,因此需要针对不同的视频进行进一步的参数调整。 当前参数针对 CULane 数据集进行了调整,该数据集的帧速率非常低(我猜,它们每秒只挑选一小部分录制的帧以减小数据集的大小)。它在 上运行得相当不错,这是一个 24 FPS 视频,但如果置信度指数的降低率和容忍范围较低,那就更好了。如果您尝试 60 FPS 的视频,除非您知道如何调整参数,否则这种现象会更严重。

    基于Html+JavaScript+Java的相机租赁系统设计源码

    该项目是一款基于Html、JavaScript和Java的相机租赁系统源码,综合运用前端与后端技术,包含265个文件,其中HTML文件31个,JavaScript文件56个,Java文件45个,CSS文件23个,PNG图片53个,以及其他类型的文件如XML、properties等。该系统旨在提供相机租赁管理的便捷解决方案,支持用户交互和数据处理。

    windows qt 实现守护进程 监控 子进程状态 demo

    1、守护进程启动子进程 2、子进程异常退出,守护进程自动重启子进程 3、子进程正常退出,守护进程退出 4、守护进程退出,子进程退出 5、模拟子进程崩溃闪退情况

Global site tag (gtag.js) - Google Analytics