51单片机和32单片机的比较分析

简介:
单片机io口控制速度是指,在程序中对单片机的某个io口操作,io口需要多少时间才能真正的执行,这个数值很重要,因为在某些场合,比如刷屏,如果io口速度够高,就能提高屏幕的刷新速度。有些场合,比如stc89c52单片机能不能驱动ws2812,这个也是要看ws2812的io口操作速度的。下图为被测双方的合影留念。两个pcb,一个是2022年10月的作品,一个是2020年4月的作品。
1,测试对象
本文使用51单片机和32单片机进行比较。
51单片机选择stc8h8k64u-lqfp48,使用内部irc时钟,主频设定为45mhz。
32单片机选择stm32f103vet6-lqfp100,使用外部8mhz时钟,内部倍频后主频为72mhz。
2,测试方法
使用keil编写代码,程序主循环while(1)内,写io=1,io=0;的翻转程序,连续写多个,降低while(1)执行对程序的干扰。使用示波器测量io口的波形,测得结果后分析代码的汇编部分,,和测得结果对比分析,得出结论。
3,51单片机测试
使用stc8h8k64u单片机,单片机初始化阶段设置io口为准双向,进行一些必要的初始化后,单片机一直执行while1的内容,代码如下。
测试引脚为p07引脚,代码中连续写了多个io口翻转赋值指令。大概20条指令,能让io口翻转20次,周期计数为10。因为主循环是一直执行的,所以一秒内可以执行很多次。
使用stc-isp软件,设定本次下载需要修改硬件选项,调整irc频率,手动输入数字45即可,将代码下载进单片机。
代码下载进单片机后,使用示波器连接单片机p07口,读取示波器的数据。测试结果如下图,频率22.5mhz(频率一直变化,选取最大值),我们看到此时的波形,不是方波,也不是正弦,接近正弦,此时应该是频率太高导致的。不过信号频率还是达到了主频,也就是45m的一半。因为频率计算,是高电平加低电平一起的倒数,所以就是主频的一半了。
当前测试说明stc8h单片机的io口操作速度是主频。
4,51单片机测试分析
上述测试说明stc8单片机操作io口的指令为但时钟周期操作,这个也是可以通过keil调试验证的,keil设置debug使用simulator,然后进入debug模式,就能看到汇编代码了。
因为单片机实际执行的内容就是机器语言,基本等于汇编,我们通过观察汇编,就能知道单片机执行了多少条指令,这个观察c语言是看不出来的。
上图截取的就是主循环的c代码和汇编的混合显示,c语言为我们实际编辑界面的内容,汇编代码则是编译器将c语言编译生成的。
while1的下面是没有汇编代码的,while1对应的代码是在最后一行,sjmp c:165b,这个汇编代码就是让cpu跳转到0x165b的地址执行程序,也就是循环的开始位置。
然后我们看到p07=0;p07=1;的c语言代码,对应的汇编代码则是clr p07,setb,p07,这两条执行,都是单时钟周期的指令。所以stc8h单片机io口的操作速度和实际最高输出速度可以达到主频的速度。
5,32单片机测试
使用stm32f103vet6单片机进行测试,因为32单片机我使用的不多,所以测试起来比51单片机内容多不少,如果下文内容有误,感谢指出。
32单片机有库函数,寄存器开发,我选的一个寄存器开发的闪烁led程序进行测试。首先就是io口的初始化,我这里使用的pa0口进行测试,设置pa0口推挽输出,同时为高电平
然后是主函数部分,主循环部分,我测试了3种不同的赋值方式,
第一种是paout(0)=0;paout(0)=1;示波器测得频率为6m,那说明32单片机使用此种方式操作io口的速度是12m,也就是6个时钟周期(72m/12m)
然后我又使用了初始化那里的赋值操作,gpioa->odr=1;gpioa->odr=0;这里应该是对整个p口赋值,这个具体我没有研究过,反正是pa0口肯定实现了0,1变换。此时示波器测得频率18mhz,此时的波形和方波比较,失真了不少,快变成正弦波了。那么操作io口的速度则是36mhz,也就是2个时钟周期
第三种操作方法:gpioa->bsrr=1;gpioa->brr=1;这个操作方法我不熟悉,示波器测试了一下速度,12m,那么操作io口的速度是24m,也就是3个时钟周期。
6,32单片机测试分析
32单片机比51单片机复杂不少,操作方式也很多,上边测试,使用了3种代码,速度都不一样,那这里只分析速度最快的那个,也就是2个时钟就能操作io口的代码。
首先看一下while1,这个while1有两个,一个是c语言代码中的位置,有两条指令。
一个是b 0x080005a0,这个地址是循环结束位置的地址,
另一个是b 0x08000526,这个地址是循环开始的地址,这两个应该是成对出现的。
我们看一下io口赋值部分,前6次赋值,对应的是13条汇编指令,后边的6次赋值,都是12条指令,多了一个ldr r1,[pc,#120];@0x080005a4,这条指令应该是定位pa口的,之后对pa口操作,不需要再定位。这条指令执行需要多少时钟周期暂不清楚
每次io口赋值,通用的两个指令是
0x0800059c 2000movs r0,#0x00
0x0800059e 6008str r0,[r1,#0x00]
第一个指令是给寄存器r0赋值,第二个指令应该是把r0寄存器的内容传给r1对应的位置,去实现io口操作。这里暂时就这么理解了,暂时不想去研究stm32的内容。
这两个指令,应该都是单时钟周期指令(由实验结果得出)。
所以stm32单片机操作的io口速度能达到主频速度的一半,但是又达不到,因为每次给io口写数据,还需要先定位到io口,(这个我不清楚是否可以直接操作io口,像51单片机那样)这个定位,也是需要时间的,一把情况下,我们可能会来回操作几个io口,不知道编译器能否在操作其他io口是,还保留r1,申请新的寄存器。因为不少程序,比如模拟spi,是需要操作好几个io口的,时钟引脚和数据引脚使用和切换的很频繁。
目前暂定stm32单片机操作io口速度最高为2个时钟周期。
7,测试总结
stc8h8k64u单片机,45m主频,io口翻转速度可达22.5mhz,单片机操作io口速度为45mhz。
stm32f103vet6单片机,72m主频,io口翻转速度可达18mhz,单片机操作io口速度为36mhz。
这个频率已经很高了,目前输出的波形已经失真了。所以得出的结论是51操作io口速度是和stm32相当的(在本测试条件的情况下)
本测试条件是指:stc8h8k单片机45m频率(基本是最高频率),stm32f103,72m频率,这个应该是常用的频率。
stc的51单片机呢,除了古老的stc89/stc90系列,基本都是单时钟周期操作。(stc32g也是单时钟周期)
stc89/90系列,在使用12m外置晶振的情况下,下载的时候设置双倍速,操作io口的速度为2m,使用更高频率的外置晶振可以达到更高的io口操作速度。
当然了,51单片机也有主频上百m的(某些厂家的某些型号),32单片机主频上百m的更多。当单片机主频足够高的时候,他们往往是为了提高运算速度,而非io口的操作速度。当然io口的操作速度也会提升。
8,结语
本文好像写了什么,又好像啥也没写,操作io口最为一个基础的指令,难道不就是一个时钟就能完成吗?我也是这么觉得的。但是实际测试结果,51单片机可以,32单片机不行。但是32单片机运行的频率够高,所以最终的速度相当。
那么就有下一个问题了,既然速度相当,为啥不少人觉得51单片机太菜呢,这里的太菜应该是指stc89c52,我也觉得他很菜,所以我也很少去用。现在的51基本都可以单时钟周期了,不少指令的执行速度大大提升,性能比古老的51提高很多了。这也就是不少人还能接受和使用51单片机的一个原因。
那既然51单片机速度可以这么快了,那为啥还比不上32单片机呢?
51单片机的速度提升呢,他是在8位数据的范围内,但实际情况,我们要操作16位数据,32位数据,去运算,这一点51单片机是不能直接运算的,是通过将这些运算转换为8位的运算去计算的,这样一个计算,就需要好多条指令才能完成。
如果你需要大量的计算,建议选位数多的32位单片机。
如果你就是操作io口完成一些内容,不需要大量的计算,51单片机可以完成。当然了,基于惯性原因,使用32单片机的可能还是选择32单片机(选择一些低价,高性价比的)

什么是IIoT?带你了解工业物联网的一切
半导体材料在元素周期表中的位置
同心前行 共筑华章 | 您有一份总裁新春寄语待接收
用一套非接触式激光测距系统来精准监测运输车的位置
十年程序员的告诫:对重写代码说不
51单片机和32单片机的比较分析
胜宏科技新专利为企业新增销售额2.1亿元
屏下指纹触控技术目前还存在着太多的问题
快手音乐人计划:音乐人可以靠作品赚到真金白银
pcba生产工艺流程图_pcba加工工艺流程
贝医生便携式冲牙器YF3:可拆卸便于清洗,三种模式护牙
AMD收购赛灵思 半导体行业新三巨头
PLC编程入门基础技术知识(plc原理和指令集及编程规则)
案例探讨正电压浪涌的对策和其效果
安全挑战继续成为物联网的头条新闻
用更多选择回应积极的反馈
搭载紫光展锐5G芯,中兴小鲜50重磅上市
基于WinCE的嵌入式图像采集系统设计
改善您的模数转换器系统电源抑制状况的四种方法
如何使用Arduino构建基于指纹的生物识别投票机