一种采用SysTick中断实现精确延时的方法*

2017-09-03 09:22
单片机与嵌入式系统应用 2017年8期
关键词:微控制器调用中断

陶 静

(全球能源互联网研究院,南京 210003)

一种采用SysTick中断实现精确延时的方法*

陶 静

(全球能源互联网研究院,南京 210003)

在使用STM32微控制器作为处理器的系统中,常采用递减函数实现延时,该方法适用于一般延时,实现精确延时时误差较大。本文介绍了一种采用SysTick中断实现精确延时的方法,该方法能大大提升延时精度。通过实验验证,SysTick中断方式可将1 μs延时的误差由26%降低至3%。

STM32;延时;SysTick

引 言

STM32是ST(意法半导体)公司发布的一款32位ARM微控制器,该微控制器基于针对高性能、低成本、低功耗的嵌入式应用设计的Cortex-M3内核。随着STM32在工业控制系统、无线网络与传感器等领域广泛应用,暴露出来的问题也越来越多,其中包含如何实现精确延时。常见的延时方法是调用递减函数,该方法能实现固定未知时间段的延时,但运用在对延时精度要求高的场合时(例如采用私有协议的高频通信、高频数据存储与解析等),误差较大。本文提出了一种基于SysTick的延时方式,能够很好地解决这个问题。

为了更好地说明并验证效果,本文以实现1 μs的延时为目标,以STM32F207ZGT6最小系统PCB板、Agilent Technologies MS07104B示波器、ST-LINK下载器为硬件环境,Keil μVision4为软件调试工具,进行程序编写及调试。

1 递减实现延时

1.1 方法介绍

在一般对延时精确度要求不高的场合下,例如:以一定的频率设置GPIO口的电平高低来点亮或熄灭LED灯、产生占空比为50%的PWM波形、随机延时等,常使用设置一个参数并调用递减函数的方式来实现延时。使用这种方法时需要按照以下步骤进行:

① 首先定义一个参数delayCount;

② 然后定义一个函数Delay,在该函数中循环执行递减操作,直到delayCount递减为0才能跳出循环。

void Delay(__IO uint32_t delayCount){

while(delayCount--)

}

③ 根据运用场景的需要,在函数中调用Delay函数,并给delayCount赋值。

1.2 实验结果

为了直观高效地验证效果,本文采用了通过调用STM32库函数GPIO_ToggleBits来变换某一引脚电平的方式。在main函数中完成系统及GPIO口初始化后执行以下操作:

while (1){

GPIO_ToggleBits(GPIOD, GPIO_Pin_1);

Delay(0x100);

}

程序编译成功后通过ST-LINK下载到STM32F207ZGT6中,通过示波器采集到的PD1引脚的波形如图1所示。

图1 递减函数实现未知时间的延时

由图1可知,占空为比50.2%的PWM波,正脉冲宽度为15.3 μs,负脉冲宽度为15.2 μs(正脉冲比负脉冲多出的0.1 μs是因为PD1引脚被设置为内部STM32F207ZGT6引脚电平拉高所占用时间,可忽略不计)。本例中共执行了0x100(即256)次自减,推算出每次自减耗时为59.375 ns。若在实际应用中需要产生1 μs的延时,需递减16.84次,取整为17次,则将while (1)中的Delay(0x100)修改为Delay(0x11)。重新编译程序并下载后,采得的波形如图2所示。

图2 递减函数实现1 μs的延时

由图2可知,占空比为50.4%的PWM波,正脉冲宽度为1.28 μs,负脉冲宽度为1.26 μs,误差为26%。

由上述实验可知,该方法可以适用于未知时间或某一范围的延时。若需采用该方法实现某一范围的延时,需具备以下条件:①需要结合示波器或软件仿真工具测量并计算得出递减指令执行的时间,再计算所需延时执行递减函数的次数,在调用函数时,将次数赋值给函数中的参数;②减少计算过程中四舍五入去整的次数,避免累计误差导致精度出现较大偏差。

2 SysTick实现精确延时

2.1 SysTick实现精确延时的原理

SysTick是Cortex-M3内核自带的一个24位倒数计时定时器,将SysTick控制及状态寄存器中的使能位置1后,SysTick会从SysTick_LOAD寄存器中加载计数值并开始递减,当减为0时重新加载计数值并产生中断。只要不清除使能位,则不停地执行上述操作。SysTick在STM32F2xx的时钟树中有2个来源:AHB时钟或AHB/8。本文基于STM32F207ZGT6最小系统PCB板进行实验仿真,硬件中外接的是25 MHz晶振,时钟配置时采用HSE时钟源,经PLL倍频后得到SYSCLK。在main函数中调用RCC_GetClocksFreq(&ClockInfo)函数核实时钟配置,结果如图3所示。

图3 STM32的时钟配置

可知SYSCLK的频率为0x0727 0E00(即120 MHz),而AHB分频为1,则可知AHB时钟也为120 MHz。当需要实现精确延时,可以按以下步骤实现:

① 先计算出延时期间晶振振荡的次数,配置SysTick,并将该次数加载到SysTick_LOAD中,配置SysTick的中断优先级;

② 编写中断函数和延时函数;

③ 根据运用场景的需要,在函数中调用延时函数并给延时参数赋值。

2.2 具体实现方法

根据上述原理,当需要实现1 μs的精确延时,需将SysTick计数值配置成120M/106,即每振荡120次也就是每1 μs进入一次中断程序。具体函数如下:

voidSysTick_Configuration(void){

if (SysTick_Config(SystemCoreClock / 1000000)) {

while (1);

}

NVIC_SetPriority(SysTick_IRQn, 0x0);

}

SysTick在Cortex-M3中有独立的中断程序,在其他应用场景下可完成系统的定时任务,本文中只完成计数值的递减。具体函数如下:

voidSysTick_Handler(void){

if (delayCount !=0x00)

delayCount --;

}

在main函数中调用精确延时的delay_us函数,同时赋值给nus。只有当dalayCount递减为0时,才跳出循环。具体函数如下:

void delay_us(u16 nus){

delayCount =nus;

while(delayCount !=0);

}

2.3 实验结果

本文在main函数中完成系统及GPIO口初始化、SysTick配置后,执行以下操作:

while (1){

GPIO_ToggleBits(GPIOD, GPIO_Pin_1);

delay_us (1);

}

示波器抓取的波形如图4所示。

图4 SysTick实现1 μs的延时

由图4可知,占空比为50.5%的PWM波,正脉冲宽度为0.99 μs,负脉冲宽度为0.97 μs,误差为3%,延时精度远高于递减方式实现的延时,适用于对延时精度要求较高的场合,且此方法与递减方法相比,不需要预先计算指令执行所需时间,也无需多次计算得出需递减的数值。

结 语

[1] 廖义奎.Cortex-M3之STM32嵌入式系统设计[M].北京:中国电力出版社,2012.

[2] 丁红,王怀德.基于Cortex-M3为内核的开发板设计与制作[J].现代电子技术,2012,35(18):19-21.

[3] YIU Joseph.Cortex-M3权威指南[M].宋岩,译.北京:北京航空航天大学出版社,2009.

[4] ST.RM0033:STM32F205xx,STM32F207xx,STM32F215xx and STM32F217xx advanced ARM-based 32-bit MCUs[EB/OL].[2017-04].http://www.st.com/content/ccc/resource/technical/document/reference_manual/51/f7/f3/06/cd/b6/46/ec/CD00225773.pdf/files/CD00225773.pdf/jcr:content/translations/en.CD00225773.pdf.

[5] 赵一夔.基于ARM Cortex-M3的嵌入式系统设计与实现[D].西安:西安电子科技大学,2010.

[6] Son S,Baek Y.Design and Implementation of Real-Time Vehicular Camera for Driver Assistance and Traffic Congestion Estimation[J].Sensors,2015,15(8):20-31.

[7] 王永虹,徐炜,郝立平.STM32系列ARM Cortex-M3微控制器原理与实践[M].北京:北京航空航天大学出版社,2008.

[8] 李晓丹.基于STM32的物联网嵌入式网关的设计[J].计算机工程与应用,2015,51(4):61-65.

[9] 张从鹏,赵康康.基于STM32的串口服务器系统开发[J].仪表技术与传感器,2016(1):73-75.

[10] 赵祥,周建斌,周靖,等.基于Cortex-M3处理器的时间交替采样系统的设计[J].仪表技术与传感器,2015(12):100-102.

[11] 杨振江.基于STM32 ARM处理器的编程技术[M].西安:西安电子科技大学出版社,2016.

[12] 丁力,宋志平,徐萌萌,等.基于STM32的嵌入式测控系统设计[J].中南大学学报:自然科学版,2013(S1):260-265.

陶静(高级工程师),主要从事电力系统通信技术的研究。

Precise Delay Method Using SysTick Interrupt

Tao Jing

(Global Energy Interconnection Research Institute,Nanjing 210003,China)

The system uses STM32 MCU as the processor,which often uses a decreasing function to generate delay,but this method is only suitable for generating a general delay and not suitable for precise delay.In the paper,a method to realize precise delay by using SysTick interrupt is introduced.This method can greatly improve the precision of delay.Through the experiment,the SysTick interrupt mode can reduce the deviation of 1 μs delay from 26% to 3%.

STM32;delay;SysTick

* 国家电网公司科技项目“面向电力通信多域交互的软件定义光网络关键技术研究”[SGRIXTKJ[2016]500号]。

TP311

A

�士然

2017-04-12)

猜你喜欢
微控制器调用中断
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
物联网技术在微控制器实验教学中的应用
跟踪导练(二)(5)
千里移防,卫勤保障不中断
基于系统调用的恶意软件检测技术研究
Atmel针对新一代物联网应用发布全新32位微控制器
最新STM32设计工具增加对混合信号微控制器的支持
意法半导体(ST)推出世界首款基于ARM Cortex-M7的STM32 F7系列微控制器
利用RFC技术实现SAP系统接口通信