STM32如何关所有中断????

jhhh999   2008-8-14 22:38 楼主
                                 STM32如何关所有中断????

回复评论 (8)

关所有中断

在ARM的一篇手册里有下面一段话是关于PRIMASK寄存器的,在ST提供的文件CortexM3_Macro.s文件中有对这个寄存器操作的宏定义。
点赞  2008-8-15 11:08

STM32没有关闭所有中断的概念,但~~~~~~~

                                 STM32没有关闭所有中断的概念,但可以通过提高CPU响应中断的优先级别达到相同的目的。因为STM32(Cortex-M3)中具有中断嵌套优先级的概念,所以不建议通过变更CPU响应中断的优先级而屏蔽关闭所有中断,用户应该通过安排相应的中断优先级来达到屏蔽部分中断的目的。
点赞  2008-8-15 11:20

使用汇编如下

CPU_IntDis
        CPSID   I
        BX      LR
点赞  2008-8-15 11:44

RE

其实,为了快速地开关中断,CM3 还专门设置了一条CPS 指令,有4 种用法
CPSID I ;PRIMASK=1, ;关中断
CPSIE I ;PRIMASK=0, ;开中断
CPSID F ;FAULTMASK=1, ;关异常
CPSIE F ;FAULTMASK=0 ;开异常


要访问PRIMASK, FAULTMASK 以及BASEPRI,同样要使用MRS/MSR 指令,如:
MRS R0, BASEPRI ;读取BASEPRI 到R0 中
MRS R0, FAULTMASK ;似上
MRS R0, PRIMASK ;似上
MSR BASEPRI, R0 ;写入R0 到BASEPRI 中
MSR FAULTMASK, R0 ;似上
MSR PRIMASK, R0 ;似上
只有在特权级下,才允许访问这3 个寄存器。


Cortex‐M3 的CONTROL 寄存器
位 功能
CONTROL[1] 堆栈指针选择
0=选择主堆栈指针MSP(复位后缺省值)
1=选择进程堆栈指针PSP
在线程或基础级(没有在响应异常——译注),可以使用PSP。在handler 模式下,
只允许使用MSP,所以此时不得往该位写1。
CONTROL[0] 0=特权级的线程模式
1=用户级的线程模式
Handler 模式永远都是特权级的。

CONTROL[0]
仅当在特权级下操作时才允许写该位。一旦进入了用户级,唯一返回特权级的途径,就
是触发一个(软)中断,再由服务例程改写该位。
CONTROL 寄存器也是通过MRS 和MSR 指令来操作的:
MRS R0, CONTROL
MSR CONTROL, R0
点赞  2008-8-15 12:11

再次强调,不建议使用这种关断所有中断的管理方式

                                 这是沿用了8051的概念,在STM32的环境中这是一种很不好的管理方式。
点赞  2008-8-15 12:14

re

to 香水城:
    我现在是要在用户程序模式下关断中断,不是在中断处理程序中,使用中断优先级的方式能实现吗?
    使用另外几个朋友的那种方式在stm32环境中是否会导致什么问题发生?
点赞  2008-8-15 12:55

5楼提供的方法就是通过提高CPU的中断响应优先级实现的关断

这几个操作是把CPU的中断响应优先级提高到-1和-2,因为没有任何中断的优先级高于0,所以这几个操作可以关断所有中断: 

CPSID I ;PRIMASK=1, ;关中断
CPSIE I ;PRIMASK=0, ;开中断
CPSID F ;FAULTMASK=1, ;关异常
CPSIE F ;FAULTMASK=0 ;开异常
点赞  2008-8-15 14:07

回复 6楼 kjjkioi 的帖子

不同意您的观点,
在多线程中有个概念,叫做关键代码段,如果不能快速的开关全局中断,请问你打算怎样实现它?
点赞  2012-8-7 02:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复