STM32 在RVMDK下简单延时计算

发布者:dfdiqc最新更新时间:2018-07-20 来源: eefocus关键字:STM32  RVMDK  延时计算 手机看文章 扫描二维码
随时随地手机看文章

为了改写ARF2496K无线2.4G驱动,需要移植到STM32主控上来,所以就想先简单的控制 I/O 时序,去完成这个实验。

第一步先完成寄存器的读写,第二步便完成正常收发,而且暂时不用考虑移植到UCOSII。

查看了ARF2496K datasheet后发现需要进行延时25us  125ms,之前的配套驱动是使用STM8为主控的,16M晶振。 我自己的开发板是神舟IV,高速外部晶振为25MHz,想着简单解决的办事原则,没有采用STM32的库进行编程,而且计时也使用的最简单的51方式,使用循环。 调试时发现了一个问题,while和for 循环的效率差别很大。便记录下来供以后参考。


RVMDK版本为 RVMDK 4.12 

芯片采用STMF103VB  (暂时不知什么原因,STMF107VCT6无法进行纯软件仿真 simulator,提示 load ...axf access violation 0x0000000C,no 'read' permission,据说是不支持),反正不影响延时代码的效果,所以也就无所谓了。

晶振使用 25MHz(默认是8MHz)     如下图:


以下代码纯为测试使用:


void delay(__IO uint32_t n)

{

while(n--);

}

 

void delay_u()

{

__IO u8 n = 25;

for (;n > 0;n--)

;

}

 

void delay_20us()

{

__IO u8 n = 25; //n = 25时,定时为20.125us; n = 26时,定时为20.625us

while(n--);

}

初始执行到main主函数,耗费的时间为74.62500us,也就是执行STM32F10X.s中的代码时间。为了区别while和for的效率,分别使用两个不同的函数进行封装。


一、调用delay_20us()函数,内部是使用while循环,经过调试发现在n = 25时,比较接近20us。

执行前如下图: 

  

执行后: 时间值为94.75000us ,总共耗费时间为94.75000 - 74.62500 = 20.125 (us)。



二、 对于delay_u()函数,内部是使用for循环。

执行前 如下图:


执行完成后,时间为90.87500 us,中间共耗时16.25us,平均执行时间为: 0.8125us (812.5ns)


为了查看区别,看了看MDK相应的汇编代码,如下:

for 语句代码为10个字节,而while生成的代码将近14个字节,由此可见在MDK中, while 效率明显低于 for语句。至于优化后的效果暂时没有测试。


总结:

STM32系列的ARM芯片,可能真正应用上的时候,因为其芯片的速度很快,而且频率可调,像C51之类的简单延时方法将不再好用,取而代之的是使用SysTick,可以从STM32库中找到对应的封装函数。

MDK 的simulator功能非常强大,能够模拟很多中外设,如GPIO、串口等,具体支持的类型因主控而定。 这里对于时间值的测量是最简单的。

MDK 中的不同循环方式对代码效率会产生比较大的影响。

因MDK的BUG问题,可以使用变通的方式搞定,就像STM32F107VC不同simulator一样,如果只是调试简单的I/O口,延时之类的可以使用其他型号的ARM主控芯片(内核必须一致)。

另外MDK 4.22a 使用旧版的注册机仍然能够破解,已经使用上了,感觉很HIGH! 


关键字:STM32  RVMDK  延时计算 引用地址:STM32 在RVMDK下简单延时计算

上一篇:STM32中,systick具体延时时间计算
下一篇:STM32延时函数的三种方法

推荐阅读最新更新时间:2024-03-16 16:09

STM32之ADC库函数的介绍
ADC的基本概念希望各位网友查阅相应的手册,上面对ADC有比较详尽的介绍,包括误差的分析和消除。这里主要介绍ADC的基本库函数的定义和使用。 1.ADC_DeInit函数的功能是将外设ADCx的全部寄存器重设为默认值。 ADC_DeInit(ADC2); 2.ADC_Init函数的功能是根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器。其中ADC_InitTypeDef定义在stm32f10x_adc.h中。其结构体如下所示: typedef struct { u32 ADC_Mode;//可以设置ADC_Mode FunctionalState ADC_ScanConvMode;//规定了模数转换工作在扫描
[单片机]
STM32_USB_CDC学习笔记
USB虚拟串口的接收方式: USB 虚拟串口的接收采用中断方式,芯片在接收到数据后回触发中断调用CDC_Receive_FS()函数来处理接收到的数据. USB虚拟串口一次最多接收64个字节的数据,如果收到的数据大于64个字节则会连续多次调用CDC_Receive_FS()函数来处理接收到的数据. 问题: 每次下载完成程序后,必须重新插拔USB线,PC才能识别到串口设备? 解决方法:在每次USB初始化之前,配置USB的两个引脚拉低几个ms,即可让PC重新枚举该USB设备. 函数功能 USB发送 USBD_CDC_SetTxBuffer()和USBD_CDC_TransmitPacket()函数是启动数据发送过程的一
[单片机]
stm32的编码器模式
选择编码器接口模式的方法是:如果计数器只在TI2的边沿计数,则置TIMx_SMCR寄存器中的 SMS=001;如果只在TI1边沿计数,则置SMS=010;如果计数器同时在TI1和TI2边沿计数,则 置SMS=011 TI1FP1和TI2FP2 是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1=TI1, TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号 的跳变顺序,计数器向上或向下计数,同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。 不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数,在任一输入端(TI1或者 TI
[单片机]
STM32-自学笔记(18.独立看门狗,使用到的库函数)
1.IWDG_SetPrescaler 函数原型:void IWDG_SetPrescaler(u8 IWDG_Prescaler) 功能:设置IWDG预分频值 参数:IWDG_Prescaler:IWDG预分频值 参数描述:IWDG_Prescaler IWDG_Prescaler参数 描述 IWDG_Prescaler参数 描述 IWDG_Prescaler_4 设置IWDG预分频值为4 IWDG_Prescaler_64 设置IWDG预分频值为64 IWDG_Prescaler_8 设置IWDG预分频值为8 IWDG_Prescaler_128 设置IWDG预分频值为128 IWDG_Prescaler_16 设置
[单片机]
STM32的四种输出模式
1、普通推挽输出(GPIO_Mode_Out_PP): 使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。 使用方法:直接使用 输出电平:推挽输出的低电平是0V,高电平是3.3V。 2、普通开漏输出(GPIO_Mode_Out_OD): 使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。 使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。 输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则
[单片机]
使用STM32定时器进行输入脉冲的计数
STM32的定时器具有计数功能,在实际应用中可以用来对引脚上的输入信号进行统计。其输入信号作为计数时钟,输入引脚为ETR引脚。 本例程使用Timer 2,其ETR输入引脚为PA1,初始化是设置该引脚工作模式为输入模式,Timer2的工作模式为从模式。 为了方便测试,另外使用PC6模式输出一个时钟信号。测试时将PC6与PA1短接。(用户也可另外连接一个时钟信号到PA1引脚上。) 代码如下: int main(void) { unsigned char i_Loop; unsigned char n_Counter; #3366ff #ifdef DEBUG debug(); #3366ff #endif RC
[单片机]
STM32高级开发(18)-使用VS Code搭建STM32开发环境
以前在伴随着开发平台的转换中,我尝试过各种各样的开发环境,而在最近一段时间的开发中我使用了Visual Studio Code来作为代码编辑器,其优异的工程管理,超快的启动速度,各种各样功能强大的插件,使我立刻爱上了这个文本编辑器。但是在开发中来来回回在编辑器和Keil等IDE之间来回切换对我造成了不少不方便,另外由于希望能够在windows下使用gcc工具链开发,所以我尝试使用插件来完整的在vscode上搭建了一个开发环境。可以说这是我在windows平台下尝试过的最好用的一种搭配,下面我就来详细讲述一下这个环境的搭建和基本使用方式。 ps:启动真心快,在win下优化程度堪比记事本. 安装软件 下载安装 Visual S
[单片机]
<font color='red'>STM32</font>高级开发(18)-使用VS Code搭建<font color='red'>STM32</font>开发环境
STM32-ucosii中的串口中断
C/OS中,中断服务子程序要用汇编语言来写。然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。 再看《M3权威指南》2.11.2节与9.11节中讲到Cortex-M3在进入异常时自动压栈。。。。返回时自动出栈,再也不需要汇编语言编写了。也就是说我们可以使用C语言来编写中断服务程序。并且省去了上面程序清单的(1)(5)(6). 其实ucos中的终端和裸奔的中断写法基本一致,只是加了几条语句,如下为串口中断的写法: void USART1_IRQHandler(void) { uint8_t RxData; OS_CPU_SR cpu_sr;
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved