stm32无法使能usart2_STM32执行速度研究报告(精华篇)

我们要想深刻理解某个东西,充分利用某个东西,甚至对其作出预言,就需要为它建立一个模型。

本文以STM32F429执行速度为切入点,讲了两个方面:

1、STM32F429执行速度模型

2、建立模型的过程和意义

您仔细读完本文的收获是:

1、一个完整的STM32执行速度模型,可指导软件开发。

2、理解建模过程,提升解决问题的能力。

影响指令执行速度的因素很多,包括核心频率,存储器频率,外设频率,电压,代码位置,指令功能,总线冲突,资源冲突,预取指,指令缓存,数据缓存,分支预测等等。文本中,研究某个因素时,都有一个默认的前提,就是其他因素保持不变。

另外预取指,指令缓存,数据缓存,分支预测属于芯片内部的实现,只要开启就肯定能加速,并没有什么可研究的。为了避免这些因素影响测试,本文中,这些功能都是关闭的。

简写说明:

CC = Core Clock Cycle

CC表示CORTEX M4的核心时钟周期,用来作为时间单位。不要和外设时钟周期弄混。

本文的核心问题是:

执行1条指令到底需要几个核心时钟周期?

STM32F429使用的是CORTEX M4内核,3级流水线,执行一个指令有3个步骤:

  1. 取指
  2. 译码
  3. 执行

如果上述3个步骤都能在规定的时间内完成(没有延时),那么指令就能在1CC内完成。第2步译码肯定没有延时。延时在第1步取指,和第3步执行

一、取指延时

讨论取指延时的时候,必须保证没有执行延时。我们选择ADD等没有执行延时的指令进行研究。

如果代码在SRAM中执行,取指就是读SRAM,任何核心频率下都是没有延时的。

如果代码在FLASH中执行,取指就是读取FLASH。FLASH是个慢速设备,挂接在AHB总线上。AHB总线频率就是FLASH的时钟频率,当频率超过一定数值就必须要加延时,否则会出现读取错误。看下官方资料:

6e7c1a4fcb3448eab693717db434dbb6

FLASH延时周期

当电压是3.3V的时候,FLASH的最大频率不能超过30MHz,否则就需要加入延时周期。经过测试,在0延时周期下,大部分指令执行时间都是1CC。再将延时周期设置为非0值,测试一下对1CC指令的影响:

AHB为1分频时。每增加1个延时周期,执行时间增加 0.25CC,成比例增长。比如延时4周期,则执行时间增加1CC,总共就是2CC。

AHB为2分频时。原先1CC的指令需要2CC时间,另外每增加1个延时周期,执行时间增加0.5CC。

如果AHB的分频系数不为1,会导致FLASH中指令执行时间成倍增长,FLASH延时周期的调整幅度也会成倍增加,不利于微调。

AHB是高速总线,AHB上的外设除了FLASHUSB,以太网MAC之外,其他都可以运行在最大核心频率上(官方资料180M,可超频)。如果AHB不用1分频,那这些外设的效率会降低很多。

我们再来看看系统时钟框图:

624c805ed8464464a33a96e2b06826e0

STM32专门为了 USB,以太网 做了独立于AHB总线的时钟驱动。同时又给了FLASH一个能够单独调整速度的延时周期设置。很明显,官方的意思就是让你AHB用1分频。

由此得出结论:

  • AHB一定要用1分频。
  • FLASH延时周期要尽可能小。
  • 高频时,开启预取指,数据缓存,指令缓存,分支预测。按照官方说法,能够让FLASH在180M核心频率下保持0周期延时。
  • 高频时,将代码放到SRAM中运行。但是SRAM空间远小于FLASH,要考虑代码大小。

二、执行延时

讨论执行延时时,必须保证没有取指延时,因此我们将核心频率设置在25M,FLASH的延时周期为0。

计算指令(除法除外),位操作,逻辑,判断等指令,执行时间都是1CC

除法指令,根据数值的不同执行周期可以从2CC到12CC不等

跳转和分支指令,B,BL是2CC。BX,BXL是3CC。TBB,TBH是6周期。

上述指令均不涉及内存操作,指令执行速度是固定的。下面重点看看存储空间的读写指令。

57f92ea14825406a96f3a0106e3ff1ee

存储空间分布

如上图所示,STM32F429的存储空间分为五个部分:

  1. CCM内存
  2. 主内存SRAM1
  3. 辅助内存SRAM2
  4. 辅助内存SRAM3
  5. FLASH

我们用下面两个指令分别对这5个空间进行读写访问,并测试执行速度。

LDR R0, [R1]

STR R0, [R1]

测试分为3种情况:

  1. 在FLASH中执行代码
  2. 在SRAM1中执行代码,用S总线(系统总线)操作SRAM1
  3. 在SRAM1中执行代码,用I-CODE和D-CODE总线总线操作SRAM1

测试结果如下。

FLASH中执行:

1657becfe12b4e729ea10ab1da40df41

Flash中执行内存访问

可以看到,所有的执行时间都是1CC,符合预期。


SRAM1中执行,通过S总线访问SRAM1:

e3985431490e4626beffd0553e8646fc

SRAM1中执行内存访问

可以看到,除了CCM和FLASH外,其他的时间都要大于1个时钟周期。我们看看下面的系统总线框图。

ddbb5c3d401447999fb1e8f0354146f3

上图中,紫色线路标注的是取指过程,红色线路是对SRMA1的访问过程。当执行对SRAM1的访问指令时,紫色线路和红色线路基本上是同时执行,这两条线路都使用S总线,都访问SRAM1,这就会导致总线冲突和资源冲突,所以指令执行速度变慢。

同样蓝色线路(访问SRAM2)和紫色线路(取指)在S总线上也有冲突。绿色线路和紫色线路在S总线上也有冲突。所以SRAM2和SRAM3的访问也都大于1CC。至于为什么SRAM1的访问比SRAM2快就不再深究。

左上角黄色的线路是CCM访问,很明显黄色紫色没有任何冲突, 所以CCM的访问时间就是1CC。

FLASH是用D总线访问数据的,和紫色路线也不冲突。读者可自行在上图寻找FLASH访问轨迹。


SRAM1中执行,通过I-CODE和D-CODE总线访问SRAM1:

770aade6656d4daeabe0f6d80fd2e8ee

SRAM1中执行内存访问

可以看到除了对SRAM1的访问变慢外,其他的访问都是1CC完成。我们还是来看看总线图:

94586e46a3c74d03a83d44914a7215c7

I-CODE和D-CODE访问SRAM1

上图中,紫色线路是取指操作,红色线路是对SRAM1的访问。紫色红色在对SRAM1的访问上有冲突,因此指令速度变慢。也就是说,I-CODED-CODE同时访问SRAM1的时候,资源冲突会导致速度变慢。蓝色绿色线路,就和紫色线路无冲突,因此SRAM2和SRAM3的访问都是1CC。

我们再看看本节第一个实验,指令在FLASH中运行,且指令是读取FLASH,此时I-CODED-CODE同时访问FLASH,但指令速度仍然是1CC,并没有减慢,这是由上图黄色方框的加速模块实现的。这个加速模块官方描述是用来实现预取指,数据缓存,指令缓存的。现在根据实验,该加速模块还实现了I-CODED-CODE并行访问FLASH的功能(注意本实验中数据缓存功能是没开的)。


综合分析得出一个结论,只要总线矩阵中的竖线和横线上没有冲突,那么内存和FLASH访问指令就是1CC执行完成。至此模型就初步建立好了。我们再根据这个模型进行一下预言:

DMA在操作SRAM1的时候,访问SRMA1的指令速度会变慢。

DMA在操作SRAM1的时候,访问SRAM2或SRAM3或CCM的指令,速度不会变慢。

经实验验证,上述预言正确,模型也就更加稳固。

根据该模型还可做很多预言,有兴趣的朋友可以自行验证。如果验证结果正确,则该模型就更加完善。如果验证结果错误,有两种方法,

  1. 打补丁。针对错误的情况做特殊的说明。但如果错误很多很严重,这个方法就不适用了。
  2. 重新建模。比如从牛顿力学到爱因斯坦相对论。

各位使用该模型中,如果遇到不符合的情况,可自行改进该模型,也欢迎通过评论或私信的方式给我提出意见。在遇到其他问题时,也建议用建模的方式,一方面能够加深对问题的理解,另一方面如果自己的模型成立,且成功进行了预言,则会获得很大的满足感。


我们再来看看该模型如何指导软件开发。

用ADC测量信号,并用DMA持续将测量结果读取到内存 BUF 中,如果BUF在SRAM1中,那么DMA将会对SRAM1持续访问,也就是硬件在一直访问SRAM1,而此时如果软件也访问了SRAM1,那么软件和硬件的效率都会降低。正确的做法是将BUF放到SRAM2中,而软件使用SRAM1,这样就能大幅提高效率。

如果需要用到两个USART,并用DMA搬运数据,那么就应该使用USART1(APB2总线上)和USART2(APB1总线上)。用DMA1操作APB1和SRAM2。用DMA2操作APB2和SRMA3。和USART无关的软件则使用SRMA1。这样系统速度达到最优。ST公司把USART1和USART2这两个最常用的串口分别放到不同的总线上,现在就能理解到其中的含义了。

这两个例子建议读者在总线框图上自行标注出路线。

STM32资料中,最精华的就是各种框图。比如时钟框图,总线框图,供电框图。这些框图包含了大量的细节和暗示,掌握全部框图就掌握了这个芯片。

三、其他因素

  1. 开启超载的情况下官方资料说最大频率是180M。在软件配置上无冲突的最大频率是 432÷2=216MHz。 经验证SYSCLK=216,AHB=216,APB2=108,APB1=54的情况下,单片机能够正常运行。
  2. 当电压为3.3V的时候,FLASH最大支持50M的无延时访问。电压加到3.6V时估计能到60M。
  3. 最常用的就是在FLASH中运行程序,并开启预取指,数据缓存,指令缓存,分支预测。这样运行在最高频率时,绝大多数情况下也能做到0延时。

影响执行速度的因素非常多,刚开始写本文时,我一度迷失在大量细节里面,无法形成一个清晰的文档结构。最后决定取出几个最重要的因素写一个精华篇,在后续其他文档中将其他细节罗列出来。

另外对于希望从事嵌入式行业的朋友,我的建议是:学习阶段要坚持用汇编。好处就是,你能知道很多别人不知道的事情。更重要的是,你会去想很多别人没有想过的事情。如果你还是学生,那么在熟练C语言之后,就坚持用汇编吧。其实C语言的别名就是《用汇编实现大型工程的架构和方法指南》或者通俗点《教你写汇编》。熟悉了汇编才能精通C。

做单片机嵌入式就是要用汇编!你用标准库,用HAL库,用cubeMX那和做上层有什么区别呢?上层还会涉及到各种协议,你用库做嵌入式,既不懂芯片,又不懂协议。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值