系统节拍的使用

我们在使用SysTick时,首先要确定时钟周期;然后才能使用它。

SysTick的最大计数值为:2^24(2的24次方)

超过此值,系统自动置0。

在配置的时候,如果超过此值;不启动SysTick。

#define SYSTICK_MAXCOUNT       ((1<<24) -1)                                    /* SysTick MaxCount                                                      */

#if (__Vendor_SysTickConfig == 0)

/** \brief  System Tick Configuration

This function initialises the system tick timer and its interrupt and start the system tick timer.
    Counter is in free running mode to generate periodical interrupts.

\param [in]  ticks  Number of ticks between two interrupts
    \return          0  Function succeeded
    \return          1  Function failed
*/
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  //if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
  if (ticks > SYSTICK_MAXCOUNT)  return (1);            /* Reload value impossible */
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

#endif

/*@} end of CMSIS_Core_SysTickFunctions */

注意,在CMSIS V2.02是没有“SYSTICK_MAXCOUNT”宏定义的。

我们在使用这个函数,之前需要作2件事情:

1. 初始化系统时钟

SystemCoreClockUpdate();

2. 确定50us的时钟值

#define PCLK            (SystemCoreClock / 4)
#define PCLK_BENCHMARK  (PCLK / 1000)
#define PCLK_50US       (PCLK_BENCHMARK * 2)

主程序:

/****************************************Copyright (c)****************************************************
**                                 TDTC Tech Dev
**                                     HRB
**--------------File Info---------------------------------------------------------------------------------
** File name:           main.c
** Last modified Date: 
** Last Version:       
** Descriptions:       
**
**--------------------------------------------------------------------------------------------------------
** Created by:          TDTC
** Created date:        2015-07-09
** Version:             V0.01
** Descriptions:        UART Send
**
**--------------------------------------------------------------------------------------------------------      
*********************************************************************************************************/
#include "LPC17xx.h"
//#include "uart.h"

#define    LED          1UL << 2                                 /* P2.2       */
#define    LED_INIT()   LPC_GPIO2->FIODIR |= LED                 /* LED INIT   */
#define    LED_OFF()    LPC_GPIO2->FIOSET |= LED                 /* LED OFF    */
#define    LED_ON()     LPC_GPIO2->FIOCLR |= LED                 /* LED ON     */

#define PCLK            (SystemCoreClock / 4)
#define PCLK_BENCHMARK  (PCLK / 1000)
#define PCLK_50US       (PCLK_BENCHMARK * 2)

void SysTick_Handler (void)
{
    static uint32_t count=0;
        count++;
        if(count%2) {
            LED_ON();
        } else {
            LED_OFF();
        } 
}

int main(void)
{
    SystemCoreClockUpdate();
    //UARTInit(0, 19200);
    LED_INIT();
    LED_OFF();
    SysTick_Config( PCLK_50US * 2 ); // 1ms

while (1) {
        ;
    }
}

我们在系统节拍中断(SysTick_Handler)中进行闪灯, 以此激活波形。

在Saleae逻辑分析仪中的波形图

时间: 2024-12-14 02:32:07

系统节拍的使用的相关文章

ucos系统初始化及启动过程

之前在ucos多任务切换中漏掉了一个变量, OSCtxSwCtr标识系统任务切换次数 主要应该还是用在调试功能中 Ucos系统初始化函数为OSInit(),主要完成以下功能 全局变量初始化 就绪任务表初始化 空任务控制块初始化 事件控制块链表初始化 信号量集初始化 存储器管理初始化 Qs队列控制初始化 系统空闲任务初始化 系统统计任务初始化 部分功能需要依靠宏定义打开另外要注意一个变量OSTaskCtr标识系统全部任务数,在初始化完成之后就可以创建任务了,创建任务完成之后启动系统使用OSStar

【转】OAL之系统时钟

1. 系统时钟与内核的关系 WinCE 5.0采用基于时间片的抢占式多任务的实时内核,而且每个线程可以根据需要自行设定线程时间片的大小(参考CeSetThreadQuantum函数),默认为100ms,这个默认值dwDefaultThreadQuantum也可以在OEMInit()时自行设定.在内核源文件中,与单词Quantum有关的变量名一般是指时间片,WinCE内核定义了几个与时钟有关的全局变量,他们也是内核与OAL接口的一部分: 1) dwReschedTime,这个变量在内核的调度程序中

FreeRTOS高级篇9---FreeRTOS系统延时

FreeRTOS提供了两个系统延时函数:相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil().相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束:绝对延时是指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务.换句话说:任务以固定的频率执行.在<FreeRTOS系列第11篇---FreeRTOS任务控制>一文中,已经介绍了这两个API函数的原型和用法,本文将分析这两个函数的实现原理. 1. 相对延时函数v

CANopen笔记2

PDO 过程数据对象用于在节点之间传送过程数据,如I/O模块I/O状态读取和设定,模拟量采集和模拟量输出等等,协议考虑从机硬件限制最多支持4组PDO,每组包含一个RPDO和一个TPDO.The Gold drive supports 4 TPDO and 4 RPDO. Each PDO contains up to 8 bytes of data. 现在以I/O模块为例进行说明:设I/O模块有24路输入,24路输出.24输入通过TPDO传给监控终端或其他节点,24输出通过RPDO由控制节点对其

FreeRTOS高级篇11---空闲任务分析

当RTOS调度器开始工作后,为了保证至少有一个任务在运行,空闲任务被自动创建,占用最低优先级(0优先级). xReturn = xTaskCreate( prvIdleTask, "IDLE",configMINIMAL_STACK_SIZE, (void * ) NULL, (tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle); 空闲任务是FreeRTOS不可缺少的任务,因为FreeRTOS设计要求必须至少有一个

FreeRTOS系列第16篇---可视化追踪调试

使用RTOS编程,为每个任务分配多大的堆栈空间就成了一项技术活:分配多了浪费系统资源,分配少了又恐怕会发生堆栈溢出.由于中断和抢占式调度器的存在,我们要估算出一个任务需要多少堆栈是非常困难的,今天我们就介绍一种方法,来获取每个任务的剩余堆栈空间.本文以NXP LPC177x_8x系列微控制器为例. 我们将这个功能做成一个命令,添加到<FreeRTOS系列第15篇---使用任务通知实现命令行解释器>一文介绍的命令解释列表中.当程序运行一段时间后,我们在SecureCRT软件中输入命令"

RHCA学习笔记:RH442-Unit9内核定时与进程延时

Unit 9 Kernel Timing and Process Latency 内核定时与进程延时 学习目标: A.了解CPU 是怎样追踪时间的 B.调整CPU的访问次数 C.调整调度延时 D.虚拟机上的CPU任务调整 9.1How Linux tracks time Linux下的时间追踪 A. 硬件定时器是靠使用时钟来完成计时的. 包括以下时间资源: a. Real time clock(RTC):实时时钟是用来持久存放系统时间的设备,即便系统关闭后,它也可以靠主板上的微电池提供的电力保持

ARM7 与Cortex M3的区别

Cortex-M3和ARM7的比较 2005年3月,ARM公司公布了最新的ARMv7架构,并定义了三大系列: ”A“系列面向尖端的基于虚拟内存的操作系统和用户应用.主要针对日益增长的运行包括Linux.Windows CE和Symbian在内的消费电子和无线产品: ”R“系列针对实时系统.主要针对需要运行实时操作系统来进行控制应用的系统,包括骑车电子.网络和影像系统. ”M“系列针对微控制器和低成本应用提供优化.针对开发费用非常敏感,同时对性能要求不断增加的嵌入式应用,如微控制器.骑车车身控制系

ARM7与ARM Cortex比较

ARM7与ARM Cortex比较  1.ARM实现方法 ARM Cortex是一种基于ARM7v架构的最新ARM嵌入式内核,它采用哈佛结构,使用分离的指令和数据总线(冯诺伊曼结构下,数据和指令共用一条总 线).从本质上来说,哈佛结构在物理上更为复杂,但是处理速度明显加快.根据摩尔定理,复杂性并不是一件非常重要的事,而吞吐量的增加却极具价值. ARM公司对Cortex的定位是:向专业嵌入式市场提供低成本.低功耗的芯片.在成本和功耗方面,Cortex具有相当好的性能,ARM公司认为它特别适用于汽车