LPC1114的SysTick延时时间的计算方式如下图
我用这个延时做了一个LED闪烁的例子,现在共享给大家。下面是源代码,附件里有工程文件。
#include "LPC11xx.h" /* LPC11xx definitions */
#include "gpio.h"
uint32_t flag = 0;
/*----------------------------------------------------------------------------
SysTick_Handler
*----------------------------------------------------------------------------*/
void SysTick_Handler(void)
{
uint32_t temp;
temp = SysTick->CTRL;
if(flag)
{
// Turn LED on, then wait
GPIOSetValue( 0, 7, 1 );
flag = 0;
}
else
{
flag = 1;
// Turn LED off, then wait
GPIOSetValue( 0, 7, 0 );
}
}
/* Main Program */
int main (void) {
/* Basic chip initialization is taken care of in SystemInit() called
* from the startup code. SystemInit() and chip settings are defined
* in the CMSIS system_<part family>.c file.
*/
GPIOInit();
/* Set port 0_7 - LED2 on LPCXpresso board to output */
GPIOSetDir( 0, 7, 1 );
if (SysTick_Config(SystemCoreClock / 3)) { /* Setup SysTick Timer for 330 msec interrupts */
while (1); /* Capture error */
}
while (1) /* Loop forever */
{
;
}
}
程序本身也比较简单,用到了SysTick的一个库函数SysTick_Config(uint32_t ticks),和中断函数SysTick_Handler(void)。中断函数很简单,就是首先读取中断标志位以清零该位值,后面用一个标志位flag来实现每进一次中断翻转一下LED的IO口,从而实现LED的闪烁。库函数SysTick_Config(uint32_t ticks)的原型如下,
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* 判断该计数值是否超限即超过24位 */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置重装载寄存器 */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置SysTick的中断优先级*/
SysTick->VAL = 0; /* 装载当前计数值 */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* 使能 SysTick 的中断和计数 */
return (0); /* 成功返回0*/
}
该函数如果设置成功则返回0,设置失败则返回1。
关于延时时间的计算公式为T=(reload+1)/Fcclk,即reload= Fcclk*T - 1;我这里用的是330ms的延时即1/3S的延时,因此我函数里用的是SystemCoreClock / 3,但是一定要注意一点就是reload的值一定不能超过24位的。
systick.rar
(62.08 KB, 下载次数: 151)
[
本帖最后由 lixiaohai8211 于 2010-5-31 22:33 编辑 ]