当前位置:首页 > 单片机 > 单片机
[导读]SysTick是Cortex-M0内核的一部分。它主要被用来作为嵌入式操作系统的10ms中断定时器。在单片机不上操作系统的时候,它就可以作为一个普通的定时器使用。SysTick是一个24位的倒计时定时器。也就是说它在工作的时候,是

SysTick是Cortex-M0内核的一部分。它主要被用来作为嵌入式操作系统的10ms中断定时器。在单片机不上操作系统的时候,它就可以作为一个普通的定时器使用。

SysTick是一个24位的倒计时定时器。也就是说它在工作的时候,是倒着数数的。例如给这个定时器的初值为488,它将会从488倒着数到0,然后产生中断。

寄存器定义

1. 系统定时器控制和状态寄存器CTRL

位符号描述复位值0ENABLE系统定时器允许位。1,允许;0,不允许。01TICKINT系统定时器中断允许位。1,允许;0,不允许。02CLKSOURCE系统定时器时钟源选择位。1,时钟=主时钟;0,时钟=主时钟/2.
15:3–保留。不能给这些位写1.不定16COUNTFLAG系统定时器倒计到0,此位置1.
31:17–保留。不能给这些位写1.不定

2. 系统定时器重载值寄存器LOAD

位符号描述复位值23:0RELOAD系统定时器计数器倒数到0后,将此数再次赋予定时器初值031:24–保留。不能给这些位写1.不定

3. 系统定时器当前值寄存器VAL

位符号描述复位值23:0CURRENT读此寄存器返回系统定时器的当前值。给这个寄存器赋值,将使定时器归0,且清CTRL中的COUNTFLAG位。031:24–保留。不能给这些位写1.不定

应用例程

新建一个工程,结构如下图所示:

在main.c文件中,加入以下代码:

#include “lpc11xx.h”

#define LED1_ON LPC_GPIO1->DATA &= ~(1<<0)

#define LED1_OFF LPC_GPIO1->DATA |= (1<<0)

#define LED2_ON LPC_GPIO1->DATA &= ~(1<<1)

#define LED2_OFF LPC_GPIO1->DATA |= (1<<1)

uint32_t msTicks=0;

void led_init()

{

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 使能IOCON时钟

LPC_IOCON->R_PIO1_0 &= ~0x07;

LPC_IOCON->R_PIO1_0 |= 0x01; //把P1.0脚设置为GPIO

LPC_IOCON->R_PIO1_1 &= ~0x07;

LPC_IOCON->R_PIO1_1 |= 0x01; //把P1.1脚设置为GPIO

LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 禁能IOCON时钟

LPC_GPIO1->DIR |= (1<<0);

LPC_GPIO1->DATA |= (1<<0);

LPC_GPIO1->DIR |= (1<<1);

LPC_GPIO1->DATA |= (1<<1);

}

void SysTick_Handler(void)

{

msTicks++;

}

int main()

{

led_init();

SysTick_Config(SystemCoreClock/100); //设置每毫秒进一次中断

while(1)

{

while(msTicks<100);

msTicks = 0;

LED1_ON;

LED2_OFF;

while(msTicks<100);

LED1_OFF;

LED2_ON;

msTicks = 0;

}

}

此例程实现了一个流水灯的效果。目的不是怎么做流水灯,而是怎么使用用Systick。

第27行,SysTick_Config()函数是KEIL自带的函数,位于core_cm0.h文件中。用来配置系统定时器的中断间隔时间。这个函数的参数不能大于24位值,参数是要赋给LOAD寄存器的。在SysTick_Config()函数中,把CTRL寄存器的bit2设置为1,即选择主时钟作为系统定时器的时钟源。那么,定时器两值递减的时间间隔就是1/ SystemCoreClock秒,SystemCoreClock是当前的主频,当配置好主频后,这个寄存器的值就被赋予了主频值,所以,我们以后如果要用当前主频,直接用SystemCoreClock即可。比如,要产生10毫秒的时间间隔,参数就应该是SystemCoreClock/100。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

中断方式串口接收数据新建一个工程,结构如下图所示:在main.c文件中,输入以下代码:#include “lpc11xx.h”#include “uart.h”uint8_t rec_buf;void UART_IRQH...

关键字: Cortex lpc1114 mo uart 串口中断 收发数据

LPC_IOCON->R_PIO1_0 &= ~0x07;LPC_IOCON->R_PIO1_0 |= 0x02;上面是设置P1.0为AD1的语句。P1.0低三位是引脚功能选择位,所以配置低三位就可以...

关键字: lpc1114 引脚功能 设置

LPC1114内部一共有4个定时器,2个32位定时器,2个16位定时器,使用方式都一样,只是要注意使用16位定时器时,寄存器的值不要超出65535。给它们分别取名称为CT16B0、CT16B1、CT32B0、CT32B1...

关键字: lpc1114 通用定时器

上图是LPC1114系统滴答定时器(SysTick)的结构图。系统滴答定时器位于Cortex-M0内核中,也就是说,不论是LPC1114,还是其他的Cortex-M0内核单片机,都有这个系统定时器。其存在的主要目的是为嵌...

关键字: systick 滴答定时器 cortex-m0系统

在"嵌入式学习006_Systick使用(一)"中,详细介绍了Systick中寄存器的使用方法,用到了很多函数,实际上到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS.h中定义...

关键字: STM32 systick

1 硬件电路配置这里还是借用前面LED电路我就不贴图片。2 时钟说明SysTick和HCK的时钟频率是一样的库函数代码如下/***@briefInitializeandstarttheSysTickcounterandi...

关键字: STM32 systick 定时器

你还在为如何给LPC1114主控的电路板留程序下载接口而烦恼吗?下面瑞生(Ration)以自己曾经做过的项目为例给大家分享一下吧!1.LPC1114如何下载程序?这个当然是你必须要知道的问题。LPC1114一共2种下载方...

关键字: lpc1114 程序下载接口

#include\"ds18b20.h\"uint8_ttemp_sign;voiddelay_ds(uint16_tzz){uint8_txx;uint16_tyy;for(xx=0;xx

关键字: 18b20 lpc1114 测量温度

某同学:你好,看了基础篇SysClk、GPIO、UART的例程,在用到IOCON模块,UART模块在SYSAHBCLKCTRL寄存器中都需要相应时钟允许位置1,IOCON使能,在设置完后又禁能,UART使用时只使能,不用...

关键字: lpc1114 iocon 模块时钟

前言今天讲解“STM32F103 SysTick系统滴答”,“SysTick系统滴答”是属于Cortex-M3内核的一部分,主要是为运行的操作系统提供滴答时钟,如常见的操作系统:uCOS、RTOS等。不管M3芯片属于哪一...

关键字: stm32f1 systick 系统滴答
关闭
关闭