STM32F10XXXX---SysTick滴答定时器

关于SysTick滴答定时器详细说明《STM32F10xxx的Cortex-M3编程手册英文文档》:如下图



网上流传的汉化寄存器说明如下:



参考:http://blog.sina.com.cn/s/blog_4f09c0b501015fq8.html


基础应用实例:

/**
  ******************************************************************************
  * @file    SysTick/main.c 
  * @author  guo
  * @version V3.5.0
  * @date    03-February-2015
  * @brief   GPIO_Pin_10 引脚输出周期2s的方波
  ******************************************************************************
  */ 

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/** @addtogroup STM32F10x_StdPeriph_Examples
  * @{
  */

/** @addtogroup SysTick_TimeBase
  * @{
  */ 

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
//static u8  us_value=0;//us延时倍乘数
static u16 ms_value=0;//ms延时倍乘数

/* Private function prototypes -----------------------------------------------*/
void Delay_ms(uint32_t nms);
void  RCC_Configuration(void);
void  GPIO_Configuration(void);
void SysTick_init(void);


/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
	
	/* Initialize Leds mounted on STM3210X-EVAL board */
	RCC_Configuration();  //LED 输出配置
	GPIO_Configuration(); //使用的资源时钟配置
  	SysTick_init();	   //初始配置
	while (1)	  
	{
	  	/* 引脚置低  */
		GPIO_ResetBits(GPIOC, GPIO_Pin_10);
	    /* Insert 1000 ms delay */
		Delay_ms(1000);
	    /* 引脚置高*/
		GPIO_SetBits(GPIOC, GPIO_Pin_10);
	    /* Insert 100 ms delay */
		Delay_ms(100);
	}
}

void  RCC_Configuration(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
}

void  GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
}

void SysTick_init(void)  
{  
    SysTick->CTRL = 0x01; 	//选择外部时钟9MHz(HCLK/8),并使能定时器
	ms_value = 9000; 	 //数据手册:系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。
} 

void Delay_ms(uint32_t nms)  
{  
     uint32_t temp;  
     SysTick->LOAD = (uint32_t)nms*ms_value - 1;  	//时间加载(SysTick->LOAD为32 bit)
     SysTick->VAL = 0x00;  	 //清空计数器
     do  
     {  
        temp = SysTick->CTRL;  
     }  
     while(temp&0x01&&!(temp&(1<<16)));  //等待时间到达,COUNTFLAG 标志位会置位--> 读值清零
}  

/*******************END OF FILE *******************************************/

中断实例:

文件:main.c

/**
  ******************************************************************************
  * @file    SysTick\SysTick_IT\main.c 
  * @author  guo
  * @version V3.5.0
  * @date    04-February-2015
  * @brief   GPIO_Pin_10 引脚输出周期2s的方波
  ******************************************************************************
  */ 

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"

/** @addtogroup STM32F10x_StdPeriph_Examples
  * @{
  */

/** @addtogroup SysTick_TimeBase
  * @{
  */ 

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void Delay_ms(uint32_t nms);
void  RCC_Configuration(void);
void  GPIO_Configuration(void);
void SysTick_init(void);


/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
	
	/* Initialize Leds mounted on STM3210X-EVAL board */
	RCC_Configuration();  //LED 输出配置
	GPIO_Configuration(); //使用的资源时钟配置
  	SysTick_init();	   //初始配置
	while(1)	  
	{
	}
}

void  RCC_Configuration(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
}

void  GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
}


void SysTick_init(void)  
{  
    SysTick->CTRL = 0x00; 	//失能
	SysTick->LOAD = (uint32_t)(9000000-1); 	//数据手册:系统嘀嗒校准值固定为9000,当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。
	SysTick->VAL =0x00;                    //清空计数器
	SysTick->CTRL = 0x03; 	//选择外部时钟9MHz(HCLK/8),并使能定时器+中断
} 
/*******************END OF FILE *******************************************/


中断处理stm32f10x_it.c:

................
extern void  GPIO_Configuration(void);
................

/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
	static char flag = 0;
	//uint32_t temp;
	//SysTick->VAL = 0x00;  	 //清空计数器
	//temp = SysTick->CTRL;   //清除标志位
	if(flag == 0)	{GPIO_ResetBits(GPIOC, GPIO_Pin_10);flag = 1;}
	else
	{GPIO_SetBits(GPIOC, GPIO_Pin_10);flag = 0;}
}

注.....:

1、如何设置它的优先级?-----默认最低优先级------ http://blog.csdn.net/sunjiajiang/article/details/7741715

2、systick的中断服务函数里,是否需要清除中断标志位?

《STM32F10xxx的Cortex-M3编程手册英文文档》 寄存器STK_VAL中提到“A write of any value clears the field to 0, and also clears the COUNTFLAG bit in the STK_CTRL register to 0.”,

实际上不写SysTick->VAL貌似也没什么问题 (//SysTick->VAL = 0x00;),目测工作正常。


Cortex-M3中断机制及SysTick 简介:http://blog.sina.com.cn/s/blog_6ebd49350100q85c.html









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值