標題: 請問stm32中斷入口地址如何定義,匯編 [打印本頁]

作者: lyonkon    時間: 2023-5-11 12:38
標題: 請問stm32中斷入口地址如何定義,匯編
進入中斷l(xiāng)ed燈關閉,中斷返回led燈。中斷入口地址不知道怎么寫。
以下是程序
RCCAPB2_ENR        EQU        0X40021018
GPIOC_CRH        EQU        0X40011004
GPIOC_ODR        EQU        0X4001100C
GPIOC_13        EQU        0X422201B4
**************************       
GPIOB_CRL        EQU        0X40010C00
GPIOB_00        EQU        0X42218000
**************************
EXTI_IMR        EQU        0X40010400;中斷屏蔽寄存器,
EXTI_FTSR        EQU        0X4001040C;下降沿觸發(fā)寄存器
AFIO_EXTICR1        EQU        0X40010008;外部中斷引腳選擇寄存器
**************************

        AREA        ICODE,CODE
               
                                                       
        B        __main                ;跳轉(zhuǎn)到主程序

        B        LED_OFF                ;跳轉(zhuǎn)到中斷服務程序
       
       
                               
                ENTRY
                EXPORT        __main
__main
       
        BL        SYSTEM_BIOS
ST
       
        BL        LED_ON
        B        ST
       
       
SYSTEM_BIOS
        LDR        R0,=EXTI_IMR        ;解除0位中斷屏蔽
        MOV        R1,#0X01
        STR        R1,[R0]
       
        LDR        R0,=EXTI_FTSR        ;設置0位中斷為下降沿觸發(fā)
        MOV        R1,#0X01
        STR        R1,[R0]

        LDR        R0,=AFIO_EXTICR1;選擇pb0位為中斷輸入引腳
        MOV        R1,#0X01
        STR        R1,[R0]
       
        LDR        R0,=GPIOB_CRL        ;設置pb0位為輸入
        MOV        R1,#0X08
        STR        R1,[R0]

        LDR        R0,=RCCAPB2_ENR        ;打開gpioc時鐘gpiob
        LDR        R1,=0X18
        STR        R1,[R0]
       
        LDR        R0,=GPIOC_CRH        ;設置c13口為輸出
        LDR        R1,=0X00300000
        STR        R1,[R0]
        BX        LR
LED_ON                                ;打開led
        LDR        R0,=GPIOC_13
        MOV        R1,#1
        STR        R1,[R0]
        BX        LR

LED_OFF                                        ;關閉led
        STMFD        SP!,{R0,R1,LR}
        LDR        R0,=GPIOC_13
        MOV        R1,#0
        STR        R1,[R0]
        LDMFD        SP!,{R0,R1,LR}
       
        END


作者: Hephaestus    時間: 2023-5-11 13:06
圖中你選定的那個s文件就是中斷入口。早就跟你說過了,匯編完全不通用,你要忘掉以前學過的其他平臺全部匯編知識,重新學一門新的匯編才可以。你還是用51匯編那一套寫出不堪入目完全不能用的代碼。
作者: yzwzfyz    時間: 2023-5-11 14:34
讀STM32的手冊,手冊上有。
從地址0起,每四個字節(jié)中的數(shù)據(jù),構(gòu)成一個32位的地址,這個地址就是中斷向量,即這個中斷被響應后,要去運行的地方。

作者: lyonkon    時間: 2023-5-11 20:33
yzwzfyz 發(fā)表于 2023-5-11 14:34
讀STM32的手冊,手冊上有。
從地址0起,每四個字節(jié)中的數(shù)據(jù),構(gòu)成一個32位的地址,這個地址就是中斷向量, ...

請問,EXTI0 中斷地址是0x00000058 , 中斷地址當中放一條跳轉(zhuǎn)指令。在程序中用什么語句 或者方法才能做到 。
作者: Hephaestus    時間: 2023-5-11 21:19
那個s文件里面有了完整的中斷處理程序,你不去看,反而像個沒頭蒼蠅一樣四處碰壁有意思嗎?照著startup_stm32f10x_md.s里面的中斷處理程序?qū)懩阕约旱闹袛嗵幚沓绦,然后去掉weak屬性即可。那個weak屬性是在連接obj文件的時候,遇到同名的兩個模塊,直接去掉有weak屬性的那個,使用沒有weak屬性的,連warning都不會有。
作者: yzwzfyz    時間: 2023-5-12 10:31
不是放跳轉(zhuǎn)指令!而是放目標地址。
由于你是用【標號】來表址的,所以在地址位置上,寫入【標號】即可,剩下的事讓編譯器替你做。
有些頭文件中,已經(jīng)將中斷向量的【標號】定義好了。如果你INCLUDE了這個頭文件,那么直接引用它定義的【標號】也可以。

STM32執(zhí)行中斷的過程序:
1、保護現(xiàn)場(與你無關)。
2、從中斷源地址中取出4個字節(jié)組成一個32的地址(這個地址由你事先放置),放入PC指針中,即執(zhí)行了跳轉(zhuǎn)(至中斷響應地址)!如果你的CPU地址不足32位,則高位自動丟棄。
3、執(zhí)行PC指向的中斷服務程序……
4、遇到RETI時,恢復現(xiàn)場(與你無關),并從現(xiàn)場中取出中斷前的地址,送入PC,即中斷返回。



作者: yzwzfyz    時間: 2023-5-12 10:57
51:是到指定的地方去運行:
32:是到指定的地方取地址,再到這個地址處運行。這個指定的地方叫中斷向量。
單片機復位也有多種形式:
51:是0000H處執(zhí)行。
32:是到00000004H處取4個字節(jié)作為地址,再到這個地址處運行。
6502:是到FFFEH處取2個字節(jié)作為地址,再到這個地址處運行。MSP430普通運行也如此。
MSP430:有兩個起動地址源,從哪個源起動運行,由RESET和TEST引腳上的信號決定。
這些都需要你讀CPU的手冊,CPU手冊讀多了,讀通了,你也就趨于高手了。

記。憾嘧x芯片手冊。
作者: Hephaestus    時間: 2023-5-13 02:13
yzwzfyz 發(fā)表于 2023-5-12 10:57
51:是到指定的地方去運行:
32:是到指定的地方取地址,再到這個地址處運行。這個指定的地方叫中斷向量。 ...

STM32有“手冊”,但是全英文的,很難翻譯,能看懂原文不需要翻譯,對于看不懂的人來說,就算是最好的翻譯,翻譯過來也看不懂,F(xiàn)在只有《cortex-m*權(quán)威指南》一本科普讀物介紹STM32匯編,請問你看的是什么“手冊”?
作者: lyonkon    時間: 2023-5-13 23:12
yzwzfyz 發(fā)表于 2023-5-12 10:57
51:是到指定的地方去運行:
32:是到指定的地方取地址,再到這個地址處運行。這個指定的地方叫中斷向量。 ...

這個圖片是一個視頻教程的畫面。他是keil4mdk,外接的arm連接器。不是keil連接器。而且視頻是針對arm核心。不是針對stm32.他的中斷向量表是這么做的。上面led燈程序用到了啟動文件,我在程序中添加了一個中斷子程序,不知是否正確。led燈中斷寄存器現(xiàn)在沒有配置完整所以試不出來;蛟S不調(diào)用啟動文件的情況下,按視頻上的方法值的試一下
;led中斷服務程序
        AREA        JCODE,CODE
               
EXTI0_IRQHandler        PROC
                        EXPORT        EXTI0_IRQHandler
                               
        STMFD        SP!,{R0,R1,LR}
        BL        LED_OFF
        LDMFD        SP!,{R0,R1,PC}
        ENDP



作者: Hephaestus    時間: 2023-5-14 00:24
lyonkon 發(fā)表于 2023-5-13 23:12
這個圖片是一個視頻教程的畫面。他是keil4mdk,外接的arm連接器。不是keil連接器。而且視頻是針對arm核心 ...

你看的視頻教程講的是ARMv3~v5體系結(jié)構(gòu),中斷向量表跟51類似,要放跳轉(zhuǎn)指令。而STM32是v6(Cortex-M0)或v7(Cortex-M3以及更以后的產(chǎn)品)體系,中斷向量表里面只有地址沒有指令。

你要么不看書,不看例程,現(xiàn)在稍微進步了,開始看視頻學了,又找到了錯誤的視頻,你到底是怎么做到無論怎么做都是錯的呢???




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1