新闻中心

EEPW首页>嵌入式系统>设计应用> STM32学前班教程之一:为什么选择STM32?

STM32学前班教程之一:为什么选择STM32?

作者: 时间:2016-11-27 来源:网络 收藏
为什么是它——我选择STM32的原因。

--------首先声明一下:该教程由思蜕盟论坛原创,本人一是为了自己学习,自我感觉此对stm32入门很有帮助,二是为了给更多的初学者带来方便,所以决定转载。转载中纠正其中的部分错误,尽量加入最新的信息,并增加本人的部分见解和学习的感受,希望对阅读者带来点点阅读价值!真诚欢迎读者提出疑问,而后共同交流,共同进步!

本文引用地址://m.amcfsurvey.com/article/201611/322408.htm

我对未来的规划是以功能性为主的,在功能和面积之间做以平衡是我的首要选择,而把运算放在第二位,这根我的专业有关系。里面的运算其实并不复杂,在入门阶段想尽量减少所接触的东西。

不过说实话,对DSP的外设并和开发环境不满意,这是为什么STM32一出就转向的原因。下面是我自己做过的两块DSP28的全功能最小系统板,在做这两块板子的过程中发现要想尽力缩小DSP的面积实在不容易(目前只能达到50mm×45mm,这还是没有其他器件的情况下),尤其是双电源的供电方式和1.9V的电源让人很头疼。

后来因为一个项目,接触了LPC2148并做了一块板子,发现小型的ARM7在外设够用的情况下其实很不错,于是开始搜集相关芯片资料,也同时对小面积的AVR和51都进行了大致的比较,这个时候发现了CortexM3的STM32,比2148拥有更丰富和灵活的外设,性能几乎是2148两倍(按照MIPS值计算)。正好2148我还没上手,就直接转了这款STM32F103。

与2811相比较(核心1.8V供电情况下),135MHz×1MIPS。现在用STM32F103,72MHz×1.25MIPS,性能是DSP的66%,STM32F103R型(64管脚)芯片面积只有2811的51%,STM32F103C型(48管脚)面积是2811的25%,最大功耗是DSP的20%,单片价格是DSP的30%。且有更多的串口,CAP和PWM,这是有用的。高端型号有SDIO,理论上比SPI速度快。

由以上比较,准备将未来的拥有操作系统的高端应用交给DSP的新型浮点型单片机28335,而将所有紧凑型小型、微型应用交给STM32。

ARM Cortex-M3相比于ARM其他系列微控制器,具有以下优势或特点:
1.三级流水线+分支预测
ARM Cortex-M3与ARM7内核一样,采用适合于微控制器应用的三级流水线,但增加了分支预测功能。

现代处理器大多采用指令预取和流水线技术,以提高处理器的指令执行速度。流水线处理器在正常执行指令时,如果碰到分支(跳转)指令,由于指令执行的顺序可能会发生变化,指令预取队列和流水线中的部分指令就可能作废,而需要从新的地址重新取指、执行,这样就会使流水线“断流”,处理器性能因此而受到影响。特别是现代C语言程序,经编译器优化生成的目标代码中,分支指令所占的比例可达10-20%,对流水线处理器的影响会的更大。为此,现代高性能流水线处理器中一般都加入了分支预测部件,就是在处理器从存储器预取指令时,当遇到分支(跳转)指令时,能自动预测跳转是否会发生,再从预测的方向进行取指,从而提供给流水线连续的指令流,流水线就可以不断地执行有效指令,保证了其性能的发挥。
ARM Cortex-M3内核的预取部件具有分支预测功能,可以预取分支目标地址的指令,使分支延迟减少到一个时钟周期。

2.哈佛结构
从内核访问指令和数据的不同空间与总线结构,可以把处理器分为哈佛结构和普林斯顿结构(或冯.诺伊曼结构)。冯.诺伊曼结构的机器指令、数据和I/O共用一条总线,这样内核在取指时就不能进行数据读写,反之亦然。这在传统的非流水线处理器(如MCS51)上是没有什么问题的,它们取指、执行分时进行,不会发生冲突。但在现代流水线处理器上,由于取指、译码和执行是同时进行的(不是同一条指令),一条总线就会发生总线冲突,必须插入延迟等待,从而影响了系统性能。ARM7TDMI内核就是这种结构的。
而哈佛结构的处理器采用独立的指令总线和数据总线,可以同时进行取指和数据读写操作,从而提高了处理器的运行性能。ARM Cortex-M3、ARM966E、ARM926EJ、ARM1136JF等内核都采用了哈佛结构。

3.内置嵌套向量中断控制器(NVIC)
针对业界对ARM处理器中断响应的问题,Cortex-M3首次在内核上集成了嵌套向量中断控制器(NVIC)。Cortex-M3的中断延迟只有12个时钟周期(ARM7需要24-42个周期);Cortex-M3还使用尾链技术,使得背靠背(back-to-back)中断的响应只需要6个时钟周期(ARM7需要大于30个周期)。以STM32运行在75MHz为例,中断延迟只有80ns-160ns。另外,Cortex-M3采用了基于栈的异常模式,使得芯片初始化的封装更为简单。
ARM7TDMI内核不带中断控制器,具体MCU的中断控制器是各芯片厂商自己加入的,这使得各厂商的ARM7 MCU中断控制部分都不一样,给用户使用及程序移植带来了很大麻烦。Cortex-M3内核集成NVIC,各厂商生产的基于Cortex-M3内核的MCU都具有统一的中断控制器,对用户使用各种Cortex-M3 MCU,特别是中断编程带来了很大的便利。

4.支持位绑定操作
以前的ARM内核不支持位操作,当需要对一个变量或端口的某一位操作时,先要用逻辑与/或指令屏蔽其他的位,使位操作需要较多的指令和时钟周期。ARM
Cortex-M3采用了一种特殊的方法——位绑定:把一个地址单元的32位变量中的每一位,通过一个简单的地址转换算法,映射到另一个地址空间,每一位占用一个地址,对此地址空间的操作,只有数据的最低一位是有效的,其余高31位的值被忽略。相当于把一个“横”的32位字给“竖”起来。这样对新的映射空间操作时,就可以不用屏蔽操作,优化了RAM和I/O寄存器的读写,提高了位操作的速度。
这种方法粗看起来好像损失了很多地址空间,其实对于32位的ARM处理器而言,总共可以寻址4GB的空间,而对于一个MCU来说,一般只用到几百KB的空间。所以这种处理方法丝毫不会影响一个MCU的正常使用,又大大简化了处理器的设计,可以说是一种良策。

5.支持串行调试(SWD)
ARM处理器一般都使用JTAG调试接口,使得仿真、调试工具统一而廉价,方便了用户开发。但JTAG调试接口至少要占用芯片的5-6个引脚,这对于一些引脚较少的MCU来说,有时会对仿真调试和I/O使用带来麻烦。
ARM
Cortex-M3在保持原来JTAG调试接口的基础上,还支持串行调试(SWD)。使用SWD时,只占用2个引脚,就可以进行所有的仿真和调试,节省了调试用引脚,用户就可以使用更多的引脚。
另外,Cortex-M3支持8个硬件断点(ARM7、ARM9只支持2个硬件断点),可以减少断点调试时对代码的影响,保证仿真、调试的时序准确性。

6.内核支持低功耗模式
ARM内核已经是一个高性能、低功耗的内核,但ARM7、ARM9等内核本身只有运行/停止模式,没有其他模式。各芯片厂商只能在内核基础上,对各自加入的外设定义各种低功耗模式。Cortex-M3加入了类似于8位处理器的内核低功耗模式,支持3种功耗管理模式:通过一条指令立即睡眠;异常/中断退出时睡眠;深度睡眠。使整个芯片的功耗控制更为有效。以STM32为例,其RAM和寄存器状态保持的停机模式耗电仅为14uA,从此状态的启动时间仅为7us。
Cortex-M3的运行功耗(Active Mode)也很低。以STM32系列微控制器为例,其典型功耗约为500uA/MHz,也只是目前业界超低功耗单片机MSP430系列(约为250uA/MHz)的2倍。但MSP430是16位处理器,而STM32是32位处理器。

7.高效的Thumb2 16/32位混合指令集
ARM7、ARM9等内核使用不同的处理器状态分别执行32位的ARM指令和16位的Thumb指令,使用状态切换指令完成ARM状态和Thumb状态的切换。Cortex-M3使用更高效的Thumb2指令集,它是一种16/32位混合编码指令,兼容Thumb指令。对于一个应用程序编译生成的Thumb2代码,以接近Thumb编码的代码尺寸,达到了接近ARM编码的运行性能。Thumb2是一种紧凑、高效的新一代指令集。
Thumb2指令集是面向高级语言的指令集,适合于C语言编程,由编译器生成目标代码,不建议直接使用Thumb2汇编语言编程。

8. 32位硬件除法和单周期乘法
以往的ARM处理器没有除法指令,在某些除法密集型应用中性能不尽如意。Cortex-M3加入了32位除法指令,弥补了这一缺陷,使Cortex-M3可以和其他通用处理器一样,完成各种数学运算操作。
Cortex-M3还改进了乘法运算部件,32结果的32位x32位乘法操作只要一个时钟周期。这一性能使得使用Cortex-M3来进行乘、乘加运算时,已逼近DSP的性能,因此特别适合一些需要简单DSP的应用领域,如电机控制、数字滤波、FFT变换等。
需要指出的是,32位的乘/除运算,对于一个8位机而言,已经是一段比较复杂的程序,而对于32位的Cortex-M3而言,只需一句指令。因此,即使二者工作主频一样,实际运行性能也不是一个数量级的。




关键词:STM32学前班教

评论


技术专区

关闭