在单片机开发中,我们常常需要用到延时功能,例如控制LED闪亮、计时等。延时的原理就是利用单片机进行循环计数,每计数一个单位时间就可以使程序停留在某个时间。
但是,由于单片机的计数精度限制,实现精确延时需要选择更加合适的方法。
在stm32单片机中,延时方法可以分为大体的软件延时和硬件定时器延时。其中又可细分为以下几种常见的方法:
这种方法是非常简单粗暴的,就是不断的循环等待一段时间。但是由于单片机的执行速度非常快,所以使用这种方法并不能得到较高的精度。在此不作展开。
使用systick定时器进行延时操作,是最常见的一种延时方法。该方法在底层驱动程序中已经实现了优化,具有较高的精确定时能力。在程序中使用的方法是设定定时器的reload值,并开启定时器中断,当系统时钟根据该reload值计数到0时,就会触发中断,从而进行延时操作。控制程序的停留时间间隔由IDL时间决定,可以通过对系统时钟源进行切换来调整IDL时间来实现不同精度的延时。
该方法利用定时器模块的硬件计数器和中断功能,实现更加高效的延时操作。该方法的精度主要取决于定时器模块计数器的位数、控制数据更新的速度以及模块中断响应的速度等因素。相较于Systick定时器,定时器模块可以拥有更高的计数精度及响应速度,拥有更加求精的应用场景。
在实际应用中如何选择适合的延时方法呢?下面列举一些原则供参考:
对于需要精准计数的场景,应该选用能够提供更高精度的计时模式,如定时器模块。若精度要求不是很高,则可以采用Systick定时器。
时钟源的切换及其对电源的影响,也是在工程中需要考虑的因素。为了尽量降低计数时的功耗,应尽量减少IDL时间的占用,避免让时钟处于空闲状态导致功耗过大。同时,如果其他模块需要使用时间相关的抽样指令,则需要根据需要的资源进行判断选择。
不同的延时方法会影响代码的实现难度、代码量及其执行效率等问题。但是,在实际应用中,要优先考虑延时准确度等性能因素。其他因素可以在保证性能不降低的前提下再进行考虑。
对于需要极高延时精度的场合,还可以使用闭环延时。使用定时器模块自带的脉宽调制及输入捕捉功能来进行循环计数,结合中断响应实现更高的精确度。
总之,在stm32单片机的延时选择方面,应该结合实际应用场景和特点进行选择,以达到严格的计时及精度要求。