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-12 12:39
STM32单片机实现DMA+ADC+UART功能
突然想测试一下STM32单片机ADC采样速率问题,按照常规方法,可以通过ADC采样,然后将采样值打印出来。但是这种方法在处理和打印数据的时候会占用很多时间,导致处理数据的时间超过了ADC的采样时间。于是想到了ADC采样的数据用DMA功能存储,并通过串口打印。但是串口打印依然要占用单片机时间,那能不能串口数据的输出也采用 DMA功能呢?这样ADC采样的数据通过DMA直接存储,然后串口通过DMA功能直接输出采样到的数据。这样速度程序执行速度不就极大的提升了吗?说干就干,使用STM32F103C8T6单片机,标准库函数,keil5软件,编写一个测试程序。 首先实现ADC采样并通过DMA存储 #ifndef __ADC_H #de
[单片机]
stm32cubemx 多路adc采集
采用的软件是STM32CUBEMX+KEIL5 硬件为stm32F103C8T6 我与原文作者做的区别在于 External Trigger Conversion Edge,我在进行配置的时间没有None选项,我选择的是默认的Regular Conversion launched by software 原文地址: http://www.eemaker.com/stm32cubemxadc.html 实现功能:stm32cubeMX配置ADC多通道采集(非dma和中断方式) Stm32ADC的转换模式还是很灵活,很强大,模式种类很多,那么这也导致很多人使用的时候没细心研究参考手册的情况下容易混淆。不知道该用哪种方式来实
[单片机]
STM32F4xx官方IAP源码
单片机源程序如下: /* Includes ------------------------------------------------------------------*/ #include menu.h #include stm324xg_eval.h /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -----
[单片机]
STM32F10xxx的三种低功耗模式
稍微整理一下开发资料和网络上的低功耗知识。 STM32F10xxx有三种低功耗模式: 1.睡眠模式(M3内核停止,外设仍在运行,功耗最高): void PWR_EnterSleepMode(uint8_t PWR_SLEEPEntry); //睡眠模式 中断和唤醒事件可唤醒(中文参考手册4.3.3)。 2.停止模式(所有时钟停止,功耗较低,约20uA): void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry); //停机模式 /* * PWR_Regulator: specifies the regulat
[单片机]
STM32休眠时关闭看门狗计数的简单解决方案
测试平台 本文采用STM32L476进行测试,休眠模式为STOP,看门狗为独立看门狗IWDG。 其余STM32芯片可参考本贴进行测试。 问题的提出 在此之前对这个问题的解决方法主要有三种: (1)采用调试模式关闭内核的功能来关闭看门狗计数; (2)休眠时采用时钟唤醒来喂狗后继续休眠; (3)用基于系统时钟的窗口看门狗WWDG 第一种方法对STM32L476无效;第二种方案太折腾了,影响RTC使用且费电;第三种方案喂狗间隔太短。 问题的解决 官方数据手册中说明了可以在STOP休眠状态关闭IDWG 因此,只需要修改FLASH_OPTR寄存器的对应位既可以实现休眠免喂狗的功能。 源代码 源代码参考了STM3
[单片机]
STM32芯片时钟配置
对STM32进行软件开发时,最基本的就是对STM32芯片进行时钟和端口配置,然后是对项目所用到的片上资源进行配置并驱动,下面给出时钟和端口配置代码,该代码几乎涵盖了片上所有时钟和端口配置项目,可根据自己需要进行删除不必要的配置项: /******************************************************************************* * Function Name : RCC_Configuration 复位时钟控制配置 * Description : Configures the different system clocks. * Input : None * Outp
[单片机]
国产APM32F103ZET6替换STM32F103ZET6经验分享
随着大变局时代的开启,美国对中国科技的打压,对中国芯片的锁脖,ST芯片价格的一再高涨,直接推动了国产芯片的发展。国内很多厂家也开始推出高性能、低价格的对标ST产品。由于价格问题,我也不得不考虑更换芯片,看了一些测评,有人推荐这一款APM32的单片机,价格比ST同型号的便宜,果断下单,以下是我使用APM32F103ZET6替换STM32F103ZET6的一些分享,参考了网上各路大神的资料后作的总结。 1从手册中分析资源,基础信息一模一样 1.1引脚定义 由下图可以看出相同封装的引脚分布完全一致。 1.2结构框图 (1)都是M3内核,总体与STM32F103ZET6架构一致 外设上做了部分增加,APM32F103相较于S
[单片机]
STM32F103CB控制超声波HCSR04可用程序
注意:定义GPIOB2为超声输出;GPIOB10为输入,定时器用tim2 ///////////////////////////////////////////////////.CPP文件///////////////////////////////////////////////////// #include HCSR04.h #include delay.h #include sys.h int overcount; float length=0; void HCSR04_init() { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_Tim
[单片机]