专注电子技术学习与研究
当前位置:单片机教程网 >> STM32 >> 浏览文章

stm32 SysTick的详细配置

作者:佚名   来源:本站原创   点击数:  更新时间:2014年03月28日   【字体:

一、文件main.c
 
#include "stm32f10x.h"
#include "SysTick.h"
/*
 * 函数名:main
 * 描述  :主函数
 * 输入  :无
 * 输出  :无
 */
int main(void)
{
/* 配置SysTick 为10us中断一次 */
    SysTick_Init();
    for(;;)
    {
        Delay_us(50000);    // 50000 * 10us = 500ms
    }
   
}
 
二、文件SysTick..c对SysTick_Init进行初始化
 
void SysTick_Init(void)
{
/* SystemFrequency / 1000    1ms中断一次
 * SystemFrequency / 100000 10us中断一次
 * SystemFrequency / 1000000 1us中断一次
 */
//if (SysTick_Config(SystemFrequency / 100000))// ST3.0.0库版本
    if (SysTick_Config(SystemCoreClock / 100000))// ST3.5.0库版本
    {
        while (1);/* Capture error */
    }
    SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;// 关闭滴答定时器
}
 
三、文件system_stm32f10x.c中定义SystemCoreClock
 
uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */
 
四、文件core_cm3.h里的函数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 */
}
 
五、文件core_cm3.h
 
#define SysTick_CTRL_CLKSOURCE_Pos          2                                   /*!< SysTick CTRL: CLKSOURCE Position */
#define SysTick_CTRL_CLKSOURCE_Msk         (1ul << SysTick_CTRL_CLKSOURCE_Pos)  /*!< SysTick CTRL: CLKSOURCE Mask */
 
#define SysTick_CTRL_TICKINT_Pos            1                                   /*!< SysTick CTRL: TICKINT Position */
#define SysTick_CTRL_TICKINT_Msk           (1ul << SysTick_CTRL_TICKINT_Pos)    /*!< SysTick CTRL: TICKINT Mask */
 
#define SysTick_CTRL_ENABLE_Pos             0                                   /*!< SysTick CTRL: ENABLE Position */
#define SysTick_CTRL_ENABLE_Msk            (1ul << SysTick_CTRL_ENABLE_Pos)     /*!< SysTick CTRL: ENABLE Mask */
 
/* SysTick Reload Register Definitions */
#define SysTick_LOAD_RELOAD_Pos             0                                    /*!< SysTick LOAD: RELOAD Position */
#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos)
 
六、文件SysTick.c
 
static __IO u32 TimingDelay;
 
void Delay_us(__IO u32 nTime)
{
    TimingDelay = nTime;
    SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;// 使能滴答定时器
    while(TimingDelay != 0);
}
 
七、文件SysTick.c
 
void TimingDelay_Decrement(void)
{
    if (TimingDelay != 0x00)
    {
        TimingDelay--;
    }
}
 
八、文件stm32f10x_it.c
 
SystemCoreClock / 100000=10us中断一次,TimingDelay为总中断次数
extern void TimingDelay_Decrement(void);
void SysTick_Handler(void)
{
    TimingDelay_Decrement();
}

 

关闭窗口

相关文章