STM/LDM是批量传输数据的指令,这里要说明的是[15:0]Register list代表了16个寄存器,传输数据的时候R15始终是最后传输的,按照从R0到R15的顺序,R15始终在高地址。
递增传输倒好理解,关键是递减传输,2440的datasheet令我费解,看看datasheet里的一张图
假设Rn = R0, R0 = 0x1000,STMDB R0!, { R1, R5, R7 }这样一条指令,先存储R1,执行之后R0的值是多少?图上并没有标注,并不能按照R0 -= 4, [R0] = R1, R0 -= 4, [R0] = R4, R0 -= 4, [R0] = R7这种方式来理解,如果按照R7,R5,R1的顺序来存储就好理解了,但datasheet上这样说:
The registers are transferred in the order lowest to highest, so R15 (if in the list) will always be transferred last.
这句话让我头大,反正坚持一个原则,让R0-R15从低地址到高地址排,不把这条指令分解就OK了。
另外要说的就是满栈和空栈,满栈就是说SP的位置始终指向栈顶,而空栈是说SP的位置始终指向栈中一个空的位置,其实满栈递增/递减跟++i/--i是一个意思,而空栈递增/递减跟i++/i--是一个意思。
关键字:ARM中 STM
引用地址:
ARM中的STM/LDM指令
推荐阅读最新更新时间:2024-11-18 10:58
激光测距VL53LX1 配合STM32F103T8U6测试成功
#include vl53l1x.h #include common.h #include usart.h VL53L1_Dev_t VL53L1_dev ; //device param, include I2C //VL53L1_DeviceInfo_t VL53L1_dev_info ;//device ID version info uint8_t Ajusted ={0,0};//adjusted sign, 0-not, 1-had uint16_t Distance = 0;//保存测距数据 VL53L1_RangingMeasurementData_t VL53L1_data ;//ranging resu
[单片机]
使用LLVM-embedded-toolchain-for-Arm-17.0.1开发STM32
LLVM-embedded-toolchain-for-Arm 是一个 ARM 公司开源的适用于 32 位ARM芯片的工具链,支持多种ARM指令集架构,包括最新的 CM85 内核。由于是基于 LLVM 和 picolibc构建出的工具链,因此在代码体积和执行效率上都很有竞争力,甚至可以和商用闭源的工具链进行 PK。 支持的架构 Armv6-M Armv7-M Armv7E-M Armv8-M Mainline Armv8.1-M Mainline Armv4T (experimental) Armv5TE (experimental) Armv6 (experimental, using the Armv5TE library v
[单片机]
使用STLINK下载程序到STM8S103问题汇总
最近的项目用到win10+stlink v2(淘宝买的山寨)+stm8s103F3遇到了许多问题,下面是我的问题汇总。 一、win10无法安装stlink的驱动(错误代码52) 显示的问题就数字签名的问题。更新安装驱动提示:windows确定安装的驱动程序是最新的。 后来在与非网看到一篇帖子,直接关闭签名,然后就直接安装成功。 左下角--设置--更新与安全--恢复--高级启动-立即重启 等待提示--疑难解答--高级选项--启动设置--右下角的重启 等待提示--F7禁用驱动程序强制签名 等待开机接可以直接用了。 附上原文链接:http://bbs.mydigit.cn/read.php?tid=204
[单片机]
STM32波特率设置
USART1的波特率公式:Baud_Rate = Fck/(16*USARTDIV) USARTDIV = Fck/(16*Baud_Rate) 然后按下述方法计算,例如总线时钟频率为72MHz,配置波特率为9600过程如下: 求得:USARTDIV = 468.75, 因为STM32的波特比率寄存器USART_BRR分为整数部分和小数部分,所以分开计算。 则有,小数部分:DIV_Fraction = 16*0.75 =12 注:这里是将10进制小数转换成16进制的小数所以乘以16** 最接近的整数是:12 = 0x0C 整数部分DIV_Mantissa = 取整 (468.75) = 468= 0x1D4 于
[单片机]
判断STM32 GPIO输入口的输入状态
以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE- IDR& GPIO_IDR_IDR2) { 函数体; } 当PE2端口为高电平时,if条件为真;当PE2口为低电平时,if条件为假; ② 判断单个端口是否为低电平: if((~GPIOE- IDR)& GPIO_IDR_IDR2) { 函数体; } 分析:首先通过 &GPIO_IDR_IDR屏蔽掉PE2之外的其他PE口。当PE2为高电平时,GPIO-〉IDR的bit2为‘1’,取反后为‘0’,因此条件为假;当PE2为低电平时,GPIO-〉IDR的bit2为‘0’,取反后为‘1’,因此条件为真;通过此方法可以同时判断PE2或PE4(甚至更多PE口)是
[单片机]
STM32的GPIO输入输出的几种模式的总结
最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD 下拉输入 (4)GPIO_Mode_IPU 上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD 复用开漏输出 (8)GPIO_Mode_AF_PP 复用推挽输出 对于刚入门的新手,我想这几个概念是必须得搞清楚的,平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但一直未曾对这些做过归纳。因此,在这里做一个总结:
[单片机]
STM32的复用功能——时钟输出(MCO)
TM32的PA.8引脚具有复用功能——时钟输出(MCO), 该功能能将STM32内部的时钟通过PA.8输出. 操作流程: 1)、设置PA.8为复用Push-Pull模式。 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); 2)、选择输出时钟源。 时钟的选择由时钟配置寄存器(R
[单片机]
基于STM32F100VBT6的32位MCU开发板设计方案
STM32F100VBT6采用ARM Cortex-M3 32位RISC内核,工作频率24MHz,集成了高速嵌入式存储器(闪存高达128kB、SRAM高达8kB)以及各种增强外设和连接到两条APB总线的I/O。所有器件提供两个I2C、两个SPI、一个HDMI CEC和多达3个USART标致通信接口以及一个12位ADC、两个12位DAC和六个通用16位定时器和PWM定时器。主要用在控制和用户接口、医疗设备、PC和游戏机外设、GPS平台、工业应用、PLC、逆变器、打印机、视频通信和HVAC等。 图1 STM32F100xx系列方框图 STM32F100xx简介 低/中密度、基于ARM的高级32位MCU,带有16
[单片机]