理工科的小伙伴们应该或多或少都用过单片机,写过点亮跑马灯的代码。对下面的代码应该不会陌生:这是一段初始化GPIO的定义过程。 其中有一行是专门定义驱动速度快慢,对于STM32单片机而言,有low,medium,high三种速度可供选择。当时写代码的时候,并不知道这些代码改变了硬件什么状态,只知道照着例程copy就行,但是工作后,才明白,每一行代码背后都会有底层硬件逻辑的变化,速度选取快慢会对硬件功能有影响的。 在STM32F103单片机的I/O端口基本结构图可以看出,开关速度频率的设置是针对输出信号的,用来控制推挽结构的晶体管。对于单片机,GPIO口是挂接在AHB总线上,输入状态是恒定的,按时钟APB2分频时钟进行刷新的。 通过查看规格书,可以看出GPIO输出速度有三种模式,分别是:最大输出速度2MHz、最大输出速度10MHz和最大输出速度50MHz,关于这个最大速度是指的压摆率的意思:当信号的上升时间tr加下降时间tf小于三分之二个周期,并且占空比为50%的时候的最大频率。如下图所示的频率特性。如果tr和tf占据的周期时间太长,就会导致高电平和低电平的时间太短。tr和tf是受硬件电路决定,比如驱动电流,负载电容等等因素。 当频率提高的时候,周期T就会慢慢缩短,此时tr和tf的时间还是不变的话,就会造成tr和tf在一个周期的占比逐渐提升,从而使得稳定高电平和稳定低电平的Thold-time越来越短。而使输出的数字信号能有效的被接收端正确识别,Thold-time就不能太短,很多芯片对Thold-time是有限制说明的,所以当Thold-time缩短到六分之一周期T的时候,就不能再短了。信号此时的频率就是最大频率。可以通过下图看出,tr=tf=5ns,最大速度频率是50MHz,周期T=20ns,Thold-time就只有5ns,也就是周期的四分之一,此时负载电容容值再增大,就会导致Thold-time时间太短,而不能被正确识别。所以GPIO的最大频率是受限于上升时间和下降时间。 从硬件来看,信号的上升时间和下降时间是由电路的驱动能力和负载电容决定的,对于单片机而言,驱动能力就是输出电流大小,这个由单片机决定,所以设置了最大速度,那么就决定了负载电容不能超过某一个限值,否则就会导致输出达不到预期的速度。当负载电容一定的时候,单片机的驱动电流越大,上升下降时间就越小,Thold-time时间就会更长,就更能满足下级电路的要求-也就是推挽电路的开关。通过讨论,也了解了,改变上升时间需要改变驱动电流大小和负载电容大小,在单片机内部,设置不同的最大速度模式,就改变了单片机内部模块的输出电阻,输出电阻大小决定了输出驱动电流的改变。从而也就达到了改变上升时间和下降时间的目的。 通过FFT分析可知,越大的上升时间,其谐波分量就越少,也就是驱动电流越小,就越有利于EMI的设计。但输出频率就不会太高。所以需要在开关速度和EMI之间取平衡,得到最好的效果。在仅仅点亮几个LED的时候,就使用最低的频率,够用就行。
|