找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1262|回复: 9
打印 上一主题 下一主题
收起左侧

请问stm32中断入口地址如何定义,汇编

[复制链接]
跳转到指定楼层
楼主
进入中断led灯关闭,中断返回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;下降沿触发寄存器
AFIO_EXTICR1        EQU        0X40010008;外部中断引脚选择寄存器
**************************

        AREA        ICODE,CODE
               
                                                       
        B        __main                ;跳转到主程序

        B        LED_OFF                ;跳转到中断服务程序
       
       
                               
                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位中断为下降沿触发
        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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-5-11 13:06 | 只看该作者
图中你选定的那个s文件就是中断入口。早就跟你说过了,汇编完全不通用,你要忘掉以前学过的其他平台全部汇编知识,重新学一门新的汇编才可以。你还是用51汇编那一套写出不堪入目完全不能用的代码。
回复

使用道具 举报

板凳
ID:123289 发表于 2023-5-11 14:34 | 只看该作者
读STM32的手册,手册上有。
从地址0起,每四个字节中的数据,构成一个32位的地址,这个地址就是中断向量,即这个中断被响应后,要去运行的地方。
回复

使用道具 举报

地板
ID:73992 发表于 2023-5-11 20:33 | 只看该作者
yzwzfyz 发表于 2023-5-11 14:34
读STM32的手册,手册上有。
从地址0起,每四个字节中的数据,构成一个32位的地址,这个地址就是中断向量, ...

请问,EXTI0 中断地址是0x00000058 , 中断地址当中放一条跳转指令。在程序中用什么语句 或者方法才能做到 。
回复

使用道具 举报

5#
ID:883242 发表于 2023-5-11 21:19 | 只看该作者
那个s文件里面有了完整的中断处理程序,你不去看,反而像个没头苍蝇一样四处碰壁有意思吗?照着startup_stm32f10x_md.s里面的中断处理程序写你自己的中断处理程序,然后去掉weak属性即可。那个weak属性是在连接obj文件的时候,遇到同名的两个模块,直接去掉有weak属性的那个,使用没有weak属性的,连warning都不会有。
回复

使用道具 举报

6#
ID:123289 发表于 2023-5-12 10:31 | 只看该作者
不是放跳转指令!而是放目标地址。
由于你是用【标号】来表址的,所以在地址位置上,写入【标号】即可,剩下的事让编译器替你做。
有些头文件中,已经将中断向量的【标号】定义好了。如果你INCLUDE了这个头文件,那么直接引用它定义的【标号】也可以。

STM32执行中断的过程序:
1、保护现场(与你无关)。
2、从中断源地址中取出4个字节组成一个32的地址(这个地址由你事先放置),放入PC指针中,即执行了跳转(至中断响应地址)!如果你的CPU地址不足32位,则高位自动丢弃。
3、执行PC指向的中断服务程序……
4、遇到RETI时,恢复现场(与你无关),并从现场中取出中断前的地址,送入PC,即中断返回。


回复

使用道具 举报

7#
ID:123289 发表于 2023-5-12 10:57 | 只看该作者
51:是到指定的地方去运行:
32:是到指定的地方取地址,再到这个地址处运行。这个指定的地方叫中断向量。
单片机复位也有多种形式:
51:是0000H处执行。
32:是到00000004H处取4个字节作为地址,再到这个地址处运行。
6502:是到FFFEH处取2个字节作为地址,再到这个地址处运行。MSP430普通运行也如此。
MSP430:有两个起动地址源,从哪个源起动运行,由RESET和TEST引脚上的信号决定。
这些都需要你读CPU的手册,CPU手册读多了,读通了,你也就趋于高手了。

记住:多读芯片手册。
回复

使用道具 举报

8#
ID:883242 发表于 2023-5-13 02:13 | 只看该作者
yzwzfyz 发表于 2023-5-12 10:57
51:是到指定的地方去运行:
32:是到指定的地方取地址,再到这个地址处运行。这个指定的地方叫中断向量。 ...

STM32有“手册”,但是全英文的,很难翻译,能看懂原文不需要翻译,对于看不懂的人来说,就算是最好的翻译,翻译过来也看不懂。现在只有《cortex-m*权威指南》一本科普读物介绍STM32汇编,请问你看的是什么“手册”?
回复

使用道具 举报

9#
ID:73992 发表于 2023-5-13 23:12 | 只看该作者
yzwzfyz 发表于 2023-5-12 10:57
51:是到指定的地方去运行:
32:是到指定的地方取地址,再到这个地址处运行。这个指定的地方叫中断向量。 ...

这个图片是一个视频教程的画面。他是keil4mdk,外接的arm连接器。不是keil连接器。而且视频是针对arm核心。不是针对stm32.他的中断向量表是这么做的。上面led灯程序用到了启动文件,我在程序中添加了一个中断子程序,不知是否正确。led灯中断寄存器现在没有配置完整所以试不出来。或许不调用启动文件的情况下,按视频上的方法值的试一下
;led中断服务程序
        AREA        JCODE,CODE
               
EXTI0_IRQHandler        PROC
                        EXPORT        EXTI0_IRQHandler
                               
        STMFD        SP!,{R0,R1,LR}
        BL        LED_OFF
        LDMFD        SP!,{R0,R1,PC}
        ENDP


回复

使用道具 举报

10#
ID:883242 发表于 2023-5-14 00:24 | 只看该作者
lyonkon 发表于 2023-5-13 23:12
这个图片是一个视频教程的画面。他是keil4mdk,外接的arm连接器。不是keil连接器。而且视频是针对arm核心 ...

你看的视频教程讲的是ARMv3~v5体系结构,中断向量表跟51类似,要放跳转指令。而STM32是v6(Cortex-M0)或v7(Cortex-M3以及更以后的产品)体系,中断向量表里面只有地址没有指令。

你要么不看书,不看例程,现在稍微进步了,开始看视频学了,又找到了错误的视频,你到底是怎么做到无论怎么做都是错的呢???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表