关于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 *******************************************/
................
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