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

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>
分享到:
评论

相关推荐

    STM32中断寄存器配置说明

    STM32中断寄存器配置的知识点可以围绕以下几个方面展开: 1. STM32中断基础:STM32微控制器基于ARM Cortex-M3内核,该内核支持总共256个中断源,分为内核中断和外部中断。STM32实现了这些中断源中的76个,包含16个...

    STM32H7的标准寄存器版本

    7. **安全特性**:STM32H7系列支持多种安全特性,如TrustZone和加密硬件,相关的寄存器用于设置安全区域和保护机制。 这个压缩包中的“标准例程-寄存器版本”很可能是针对STM32H743的一组示例代码,展示了如何直接...

    STM32的EXTI外部中断(直接操作寄存器)

    这篇教程将深入探讨STM32的EXTI外部中断机制,并通过直接操作寄存器的方式进行设置。 EXTI模块提供了多达16个独立的中断线,对应于STM32的GPIO端口中的某些引脚。这些中断线可以被配置为上升沿触发、下降沿触发或两...

    stm32l152re串口寄存器版本

    本文将深入探讨STM32L152RE的串口工作原理,并通过寄存器层面的编程来阐述如何配置和使用串口功能。 首先,STM32L152RE中的串口主要涉及以下寄存器: 1. **USART_CR1**:控制寄存器1,用于设置串口的基本参数,如...

    STM32标准例程基于寄存器!

    在STM32微控制器中,所有的功能如GPIO控制、定时器配置、中断设置等都是通过访问特定的内存地址,即寄存器来完成的。例如,要控制一个GPIO口,我们需要操作GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR等寄存器,分别...

    STM32H743-寄存器版本标准例程

    实验32 红外遥控器实验 实验33 DS18B20数字温度传感器实验 实验34 DHT11数字温湿度传感器实验 实验35 MPU9250九轴传感器实验 实验36 无线通信实验 实验37 FLASH模拟EEPROM实验 实验38 摄像头实验 实验39 内存管理...

    stm32 中断解析

    "stm32 中断解析" stm32 中断解析是指对 STM32 微控制器的中断机制进行解析和...stm32 中断解析是指对 STM32 微控制器的中断机制进行解析和设置,包括 NVIC 的管理和配置、外部中断寄存器的设置和中断优先级的设置。

    串口空闲中断 STM32F407 寄存器操作

    总的来说,STM32F407的串口空闲中断是通过精心配置相关寄存器来实现的。理解这些寄存器的功能及其位字段的含义,对于高效地利用串口空闲中断功能至关重要。通过熟练掌握这些操作,开发者可以在串行通信中实现更智能...

    基于STM32备份寄存器BKP实验

    5. 测试验证:在程序中设置一个断点,然后模拟电源中断,重新上电后检查备份寄存器中的数据是否仍然存在。如果数据未丢失,说明备份寄存器功能正常工作。 四、注意事项 - 在写入或读取备份寄存器之前,确保已经正确...

    STM32示例程序 寄存器版本

    本压缩包提供的"STM32示例程序 寄存器版本"旨在帮助开发者理解和掌握STM32芯片的使用,特别是通过寄存器直接操作的方式,这对于深入理解MCU工作原理至关重要。 1. **STM32寄存器操作**:STM32的每个功能模块都有...

    STM32C8T6使用寄存器控制GPIO点灯代码(个人学习记录)

    STM32C8T6拥有多个GPIO端口,如Port A、Port B等,每个端口包含多个引脚,这些引脚可以配置为输入或输出,并通过设置寄存器实现各种功能。 首先,我们需要了解GPIO的基本结构。每个GPIO端口有四个主要寄存器:MODER...

    正点原子 stm32f103 寄存器版本示例程序

    "正点原子 STM32F103 寄存器版本示例程序"是一个针对初学者或进阶开发者的学习资料,旨在通过实例讲解如何直接操作STM32F103的硬件寄存器,实现对芯片功能的控制。 寄存器是微控制器与外部世界交互的核心部分,它们...

    STM32L4x1寄存器手册+STM32L471xx数据手册.rar

    STM32L4x1系列是意法...总的来说,STM32L4x1寄存器手册和STM32L471xx数据手册是开发者理解和应用STM32L471微控制器的必备参考资料。通过深入学习这两份文档,可以充分利用芯片的性能,实现高效且低功耗的应用设计。

    STM32F4开发指南寄存器和库函数

    三、STM32F4时钟树分析 STM32F4的时钟系统复杂而灵活,它由多个振荡器、PLL(锁相环)、倍频器和分频器组成。理解时钟树对于优化系统性能至关重要。主时钟(SYSCLK)可以源自HSE(高速外部晶振)、HSI(高速内部振荡...

    STM32H750开发指南-寄存器版本_V1.01.pdf

    在《STM32H750开发指南-寄存器版本_V1.01.pdf》中,作者或团队——正点原子,为开发者提供了一个详尽的学习路径,帮助他们掌握STM32H750的各种功能。该指南分为三个主要部分: 1. **硬件篇**:这部分主要介绍用于...

    STM32H743实现UART串口通信【支持STM32H7系列单片机_寄存器库驱动】.zip

    STM32H743的UART模块包含多个寄存器,用于配置波特率、数据格式、中断等参数,并控制收发过程。 1. **配置时钟**:在使用UART前,需要开启相关时钟。STM32H743的时钟系统复杂,涉及RCC(复用功能时钟控制器),通过...

    1,STM32F1标准例程-寄存器版本.zip

    STM32F1的中断系统也是重要的部分,通过配置NVIC(Nested Vectored Interrupt Controller)寄存器可以管理中断优先级和向量。例如,可以设置中断使能,通过NVIC-ISERx寄存器激活中断源,通过NVIC-IPRx寄存器设置中断...

    STM32用寄存器配置片内资源实例。

    在STM32的编程中,有两种主要的方法来控制和配置芯片内部资源:使用HAL(Hardware Abstraction Layer,硬件抽象层)库和直接操作寄存器。标题和描述中提到的是使用寄存器配置,这是一种更为底层且灵活的方法,但同时...

    stm32 RTC配置,各种寄存器

    在STM32的RTC配置中,了解和掌握相关寄存器的设置至关重要,这将直接影响RTC的性能和准确性。下面将详细介绍STM32 RTC配置涉及的主要知识点。 首先,RTC的配置始于初始化,这通常在系统启动或复位后进行。在固件库...

Global site tag (gtag.js) - Google Analytics