datasheet

系统滴答SysTick两种实现方式

2016-09-26来源: eefocus关键字:系统滴答  SysTick  实现方式
其实系统滴答就是一个24位的倒计时定时器,而且能够自动装置。仪器8位单片机如AVR/51要跑操作系统,需要专门占用一个定时器,但是由于优先级的原因很容易被其他程序打乱。而STM32以Cortex M3为内核,它专门开辟了一个硬件定时器,具有很高的优先级,即使在系统处于睡眠状态也能工作。我们使用系统滴答点亮LED灯的方法有两种:

第一种方法:就是将系统滴答作为普通的定时器,采用查询的方法。首先使用SysTick->LOAD装置初值,即要倒计的值。然后时钟SysTick->CTRL控制寄存器使能计数器工作在连拍模式,也就是计数减到0的时候,会出现一个标志位:COUNTFLAG,然后在使用while不断地查询这一位。按照这种编程方法封装的文件代码为:

SYSTICK.C

#include "systick.h"

 

//延时Nms

//注意Nms的范围

//Nms<=0xffffff*8/SYSCLK

//对72M条件下,Nms<=1864

void delay_ms(u16 Nms)

{   

 SysTick->LOAD=(u32)Nms*9000; //给重装载寄存器赋值,9000时,将产生1ms的时基

 SysTick->CTRL|=0x01;               //开始倒数   

 while(!(SysTick->CTRL&(1<<16)));   //等待时间到达

 SysTick->CTRL=0X00000000;         //关闭计数器

 SysTick->VAL=0X00000000;           //清空计数器    

}  

//延时us          

void delay_us(u32 Nus)

{

 SysTick->LOAD=Nus*9;       //时间加载     

 SysTick->CTRL|=0x01;            //开始倒数   

 while(!(SysTick->CTRL&(1<<16)));//等待时间到达

 SysTick->CTRL=0X00000000;       //关闭计数器

 SysTick->VAL=0X00000000;        //清空计数器    

}

SYSTICK.H

#ifndef __SYSTICK_H

#define __SYSTICK_H      

#include "stm32f10x_conf.h"

void delay_ms(u16 Nms);

void delay_us(u32 Nus);

 

 

#endif 

第二种方法:中断的方法。程序调用core_cm3.c里的SysTick_Config的函数,方便不同cortex M3处理之间的移植。里面设置装置寄存器,内核时钟,向下计数到0导致systick 中断,和使能寄存器。

 

SysTick_Config的函数定义为

static __INLINE uint32_t SysTick_Config(uint32_t ticks)

{

  if (ticks > SysTick_LOAD_RELOAD_Msk)  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

 

 

这里要注意的是系统滴答是24位寄存器,不能超过2的24次方,大约16M左右,所以我这里设置的是:系统时钟的五分之一,14.4M。

SysTick_Config(SystemCoreClock/5);//这样每隔0.2s中断发生一次

主要程序代码为:

unsigned char num=0;//第几盏灯亮

void LED_Spark(void)

{

 

  switch(num++)

  {

    case 0://灯1亮

      LED1_ON();LED2_OFF();LED3_OFF();LED4_OFF();

      break;

    case 1://灯2亮

      LED1_OFF();LED2_ON();LED3_OFF();LED4_OFF();

      break;

    case 2://灯3亮

      LED1_OFF();LED2_OFF();LED3_ON();LED4_OFF();

      break;

    case 3://灯4亮

      LED1_OFF();LED2_OFF();LED3_OFF();LED4_ON();

      break;

    default://全灭

      num=0;LED1_OFF();LED2_OFF();LED3_OFF();LED4_OFF();

      break;

  }

 

}

int main(void)

{

  /* Setup STM32 system (clock, PLL and Flash configuration) */

  SystemInit();

 

  /* Add your application code here

     */

  LED_Configuration();

  SysTick_Config(SystemCoreClock/5);//每隔0.2s中断调用一次

  NVIC_SetPriority(SysTick_IRQn, 0x0);//设置优先级

  /* Infinite loop */

  while (1)

  {

  }

}

关键字:系统滴答  SysTick  实现方式

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/article_2016092629833.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:FreeRTOS 在STM32上的移植 V1.0
下一篇:C语言 STM32 求绝对值函数

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32---系统滴答定时器(systick)应用

利用stm32的系统滴答滴来获取系统的时间基准,以此应用到接收串口数据的超时退出。具体如下:    current_sys_time = SysTick->VAL;(获取当前时间基准)。    while (com_available(&rx_buffer1) < 1)    {       //超时退出接收串口数据    if((SysTick->VAL - current_sys_time) > Delay)       { 
发表于 2019-05-22
STM32---系统滴答定时器(systick)应用

stm32中的系统滴答定时器使用

系统滴答定时器对于stm32的初学者来说还是非常重要的,因为随着你学习的深入编程过程中肯定会调用延时函数,比如我之前的一些gpio相关的实验中。那么延时函数的编写也是几种方法的,一般开始接触都是让系统循环等待,利用stm32处理程序所用的机器时间去延时。这种延时函数如下图所示:        很显然这是一个弊端很明显的做法,因为在延时函数进行时系统无法进行其它操作,这样大大降低了系统的效率。所以我们一般在编程中都会去利用定时器去定时。下面我就介绍下用系统滴答定时器的方法。      SysTick定时器(系统滴答定时器)是一个倒计时定时器,被捆绑
发表于 2019-01-02
stm32中的系统滴答定时器使用

STM32的系统滴答定时器(Systick)

1.systick时钟来源2.SysTick库函数3.源码 /**  *@} */ /** @defgroup SysTick_clock_source  *@{ */ #define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)#define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)#define IS_SYSTICK_CLK_SOURCE(SOURCE) (((SO
发表于 2018-12-24
STM32的系统滴答定时器(Systick)

stm32系统滴答定时器使用

;     Delay(500);           */            //功能2代码:上位发特定指令,中位机执行相应操作              //     RS485_Test();              }     }(3)系统滴答定时器的配置--主角登场:主函数中: 
发表于 2018-12-21
stm32系统滴答定时器使用

STM32系统滴答定时器(systick)应用

一:系统滴答定时器(systick)1.systick介绍     Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。滴答中断?这里来简单地解释一下。操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好
发表于 2018-09-11
STM32系统滴答定时器(systick)应用

STM32——系统滴答定时器

一、SysTick【内核中】【风格:先描述一下库对寄存器的封装,再举例实现某些功能】        SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号: 15)。在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统
发表于 2018-07-19

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved