STM32中斷設定相關暫存器的分析

2021-09-02 09:59:14 字數 3015 閱讀 2832

位址

名稱描述

0xe000 e100

setena

設定使能中斷0到31,寫1將位置1,寫0無作用

0xe000 e180

clrena

寫1將位置0,禁能中斷,寫0無作用

__asm void set_clear_irq(void)

初始狀態是這樣的`

這裡第乙個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);

當乙個終端發生了,卻又無法立即處理(比如處理器正在處理更高優先順序的中斷),這個中斷請求就會被掛起。掛起狀態儲存在乙個暫存器中。如果中斷變為當前優先順序最高的中斷,中斷得到處理,那麼硬體就會清除中斷請求,也可以手動清除。
位址

名稱描述

0xe000e200

setpend

設定中斷0到31的掛起狀態,寫1將置1,寫0無作用

0xe000e280

clrpend

清除中斷0到31的掛起狀態,寫1置位,寫0無作用

cmsis提供了以下函式來訪問中斷掛起狀態暫存器:

void nvic_setpendingirq(irqn_type_irqn);//設定乙個中斷的掛起狀態

void nvic_clearpendingirq(irqn_type_irqn);//清除

void nvic_getpendingirq(irqn_type_irqn);//返回true表示中斷掛起狀態為1

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);//返回中斷或異常的優先順序

在對時間敏感的應用,需要在一段較短的時間內禁止所有中斷。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。

STM32中斷設定相關暫存器的分析

位址 名稱描述 0xe000 e100 setena 設定使能中斷0到31,寫1將位置1,寫0無作用 0xe000 e180 clrena 寫1將位置0,禁能中斷,寫0無作用 asm void set clear irq void 初始狀態是這樣的 這裡第乙個str r1,r0 是設定使能外部中斷2...

STM32中斷相關

一般io口的初始化過程 下面以初始化e埠的0 1 2 3引腳為例。void mx gpio init void 在core cm4.h中定義nvic結構體 typedef struct nvic type 在配置中斷時,最常用的就是iser icer和ip這三個暫存器。iser用來使能中斷,icer...

STM32 中斷相關

stm32 為了適應不同的優先順序組合,設定了 group 的概念,組是乙個大的框架,在組下分別分配了佔先優先順序與副優先順序。每乙個中斷都有乙個專門的暫存器 interrupt priority registers 來描述該中斷的佔先式優先順序及副優先順序。在這個暫存器中stm32 使用4個二進位...