打印
[其他ST产品]

ARM Cortex-M4微处理器

[复制链接]
257|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
写在前面
本系列学习主要参照了王宜怀老师主编,清华大学出版社出版的《嵌入式技术基础与实践(第六版)》一书,有兴趣的可以自行购买,正版书籍附赠开发版供实验所需

ARM Cortex-M4微处理器简介
ARM Cortex-M4微处理器内部结构概要
具体介绍请参考书籍

位数
Cortex-M4系列处理器为32位处理器,内部存储器,数据总线均为32位,采用Thumb-2技术,同时支持16位与32位指令

总线结构
采用哈佛架构(感兴趣可以自行查阅),统一的存储空间编址,32位寻址,最多支持4GB的存储空间;三级流水线设计;片上接口基于AMBA架构

中断控制
采用了集成嵌套向量中断控制器(NVIC),支持8~256个中断优先级,最多240个中断请求

存储器保护
可选的MPU

低功耗
多种低功耗特性和休眠模式

内部寄存器
M4微处理器的寄存器包含用于数据处理与控制的寄存器、特殊功能寄存器与浮点寄存器。特殊功能寄存器有预定义的功能,必须通过专用指令来访问。



寻址方式与机器码获取方法

CPU可以执行特定功能的操作命令被称为指令
CPU所能执行的各种指令的集合,成为该CPU的指令系统

指令保留字简表与寻址方式

————————————————
版权声明:本文为CSDN博主「HaoYuanSama」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43908626/article/details/121128477

使用特权

评论回复
沙发
是你的乱码|  楼主 | 2023-7-30 16:26 | 只看该作者
指令保留字简表
其他指令请查阅《ARM v7-M 参考手册》

使用特权

评论回复
板凳
是你的乱码|  楼主 | 2023-7-30 16:26 | 只看该作者
寻址方式
立即数寻址
操作数直接通过指令给出。用“#”作为立即数的前导标识符。M4微处理器的立即数范围是0x00~-0xFF。例如:

        MOV         R0, # 0xFF                 //立即数0xFF装入R0寄存器
        SUB                R1, R0, # 1                //R1←R0 - 1

使用特权

评论回复
地板
是你的乱码|  楼主 | 2023-7-30 16:27 | 只看该作者
寄存器寻址
操作数来自寄存器。例如:

        MOV         R0, R1                                //将R1寄存器内容装入R0寄存器

使用特权

评论回复
5
是你的乱码|  楼主 | 2023-7-30 16:27 | 只看该作者
直接寻址
操作数来自存储单元,指令中直接给出存储单元地址。指令码中显示给出数据的位数,如:字、半字、单字节。例如:

        LDR         Rt, label                                //从标号label处连续读取4字节到寄存器中
        LDRH         Rt, label                                //从地址label处读取半字到Rt中
        LDRB         Rt, label                                //从地址label处读取字节到Rt中

使用特权

评论回复
6
是你的乱码|  楼主 | 2023-7-30 16:27 | 只看该作者
偏移寻址及寄存器间接寻址
偏移寻址的操作数来自存储单元,指令中通过寄存器及偏移量给出存储单元的地址。偏移量不超过4KB。偏移量为0的偏移寻址也成为寄存器间接寻址。例如:

        LDR         R3, [PC, # 100]                        //从地址(PC+100)处读取4字节到R3中
        LDR         R3, [R4]                                //以R4中内容为地址,读取4字节到R3中

使用特权

评论回复
7
是你的乱码|  楼主 | 2023-7-30 16:27 | 只看该作者
机器的指令码
运行源文件
利用开发环境打开工程…\CH02-1。测试代码如下:

Label:
        MOV        R0, # 0xDE
        LDR                R0, = data_format1
        LDR                R1, = Label
        LDR         R2, [R1]
        BL                printf

使用特权

评论回复
8
是你的乱码|  楼主 | 2023-7-30 16:27 | 只看该作者
执行结果如下图:

使用特权

评论回复
9
是你的乱码|  楼主 | 2023-7-30 16:28 | 只看该作者
执行程序所获得的信息
从上图现实的内容可以看出,标号代表的地址为0900D87E,这就是指令MOV R0,# 0xDE机器码要存放的开放地址,各地址存储内容如下表:



STM32数据存储采用的是小段模式,即将2个字节以上的一个数据的低字节放在存储器低地址单元,高字节放在高地址单元。

使用特权

评论回复
10
是你的乱码|  楼主 | 2023-7-30 16:28 | 只看该作者
基本指令分类解析
数据传送类指令
有两种情况:一是取存储器地址空间中的数传送到寄存器中,二是将寄存器中的数传送到另一寄存器或存储器地址空间中

取数指令

使用特权

评论回复
11
是你的乱码|  楼主 | 2023-7-30 16:28 | 只看该作者
存数指令
Rt,Rn,Rm必须为R0~R7中的一个

使用特权

评论回复
12
是你的乱码|  楼主 | 2023-7-30 16:29 | 只看该作者
寄存器间数据传送指令



其他指令请参考书籍,在此不再罗列

使用特权

评论回复
13
是你的乱码|  楼主 | 2023-7-30 16:29 | 只看该作者
汇编语言的基本语法
汇编语言源程序以行为单位进行设计,每行最多可以包含一下4部分

使用特权

评论回复
14
是你的乱码|  楼主 | 2023-7-30 16:29 | 只看该作者
汇编语言的格式
标号
如果一个语句有标号,则标号必须书写在汇编语句的开头部分
可以组成标号的字符有字母A ~ Z、 a ~ z、数字0 ~ 9、下划线(_),美元符号($),但开头的第一个符号不能为数字和 $
编译器对标号中字母的大小写敏感,但指令不区分大小
标号长度基本不受限制,但实际使用时通常不超过20个字符。
标号后必须带冒号(:)
一个标号在一个文件(程序)中只能被定义一次,否则出现重复定义,不能通过编译
一行语句只能有一个标号,编译器将把当前程序计数器的值赋给该标号

使用特权

评论回复
15
是你的乱码|  楼主 | 2023-7-30 16:29 | 只看该作者
操作码
操作码包括指令码和伪指令。
对于有标号的行,必须至少用一个空格或制表符将标号与操作码隔开;对于没有标号的行,不能从第一列开始写指令码,应以空格或制表符开头。

使用特权

评论回复
16
是你的乱码|  楼主 | 2023-7-30 16:29 | 只看该作者
操作数
操作数可以使地址,标号或指令码定义的常数,也可以是有伪运算符构成的表达式。
如果一条指令或伪指令有操作数,则操作数与操作码之间必须用空格隔开书写。操作数多于一个的,操作数之间用逗号分隔。操作数也可以是M4内部寄存器,或者另一条指令的特定参数。
操作数一般都有一个存放结果的寄存器,这个寄存器在操作数的最前面

使用特权

评论回复
17
是你的乱码|  楼主 | 2023-7-30 16:30 | 只看该作者
1、常数标识
编译器识别的常数有十进制、十六进制(0x)、二进制(0b)

使用特权

评论回复
18
是你的乱码|  楼主 | 2023-7-30 16:30 | 只看该作者
2、“#”表示立即数
一个常数前添加“#”表示一个立即数;不加“#”时,表示一个地址。

使用特权

评论回复
19
是你的乱码|  楼主 | 2023-7-30 16:30 | 只看该作者
3、圆点
如果圆点(.)单独出现在语句操作码之后的操作数位置上,则代表当前程序计数器的值被放置在圆点的位置。

使用特权

评论回复
20
是你的乱码|  楼主 | 2023-7-30 16:30 | 只看该作者
4、伪运算符
略。详情请查阅资料

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

263

帖子

1

粉丝