美文网首页我爱编程嵌牛IT观察
STM32F10x之SysTick 定时器

STM32F10x之SysTick 定时器

作者: CJbaby | 来源:发表于2017-12-07 11:30 被阅读0次

姓名:周崇杰   学号:16140120059    专业:机械设计制造及其自动化

转载自:http://blog.csdn.net/u011318735/article/details/17620315,有删节

【嵌牛导读】:STM32F1系列的产品的SysTick定时器操作简单,功能强大,本文将会通过库函数讲解该定时器的使用。

【嵌牛鼻子】:STM32单片机,SysTick定时器。

【嵌牛提问】:STM32单片机的SysTick定时器如何操作以及编程呢?

【嵌牛正文】:

SysTick定时器被集成在NVIC中。因此,只要是Cortex-M3内核的单片机,就都有它。这个学习笔记就用SysTick定时器来实现走马灯的功能。

SysTick定时器非常简答,只有四个寄存器。这四个寄存器的含义在《Cortex-M3权威指南》那本书中讲的非常的清楚,这里不复述了,下面只讲讲在STM32上SysTick有什么特殊之处。按照CMSIS标准,用C语言访问这四个寄存器时使用的寄存器名称分别如下:

SysTick->CTRL

SysTick->LOAD

SysTick->VAL

SysTick->CALIB

SysTick->CALIB的值固定为9000,因此,只有当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。

STM32提供了2个时钟源:

0: AHB/8

1: Processor clock (AHB)

因此,SysTick->CTRL = 7表示使用处理器时钟作为时钟源,使能SysTick,并且使能SysTick中断。SysTick->CTRL = 3时频率降为原来的1/8。

我的开发板上有四个LED,分别对应的GPIO端口D的PD2、PD3、PD4和PD7。

下面是例子程序,仍然先是直接设置寄存器。

#include "stm32f10x.h"

#define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD

#define GPIO_LED_PORT                                GPIOD

#define GPIO_LED1                                    GPIO_Pin_2

#define GPIO_LED2                                    GPIO_Pin_3

#define GPIO_LED3                                    GPIO_Pin_4

#define GPIO_LED4                                    GPIO_Pin_7

#define GPIO_LED_ALL                                 GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4

voidLED_Spark(void)

{

staticintstate = 0;

switch(state)

{

case0:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);

state ++;

break;

case1:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);

state ++;

break;

case2:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);

state ++;

break;

case3:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);

state = 0;

break;

default:

state = 0;

break;

}

}

intmain(void)

{

SystemInit();

RCC->APB2ENR  |=  0x00000020;

GPIOD->CRL = 0x24422244;//PD2 PD3 PD4 PD7 Set to Output mode

SysTick->LOAD = 24000000/200;

SysTick->CTRL = 3;

for(;;)

{

}

}

/**

* @brief  This function handles SysTick Handler.

* @param  None

* @retval None

*/

voidSysTick_Handler(void)

{

staticintcount = 0;

count ++;

if(count == 100)

{

LED_Spark();

count = 0;

}

}

然后是利用STM32 固件函数库提供的函数的例子。

#include "stm32f10x.h"

#define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD

#define GPIO_LED_PORT                                GPIOD

#define GPIO_LED1                                    GPIO_Pin_2

#define GPIO_LED2                                    GPIO_Pin_3

#define GPIO_LED3                                    GPIO_Pin_4

#define GPIO_LED4                                    GPIO_Pin_7

#define GPIO_LED_ALL                                 GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4

voidLED_Spark(void)

{

staticintstate = 0;

switch(state)

{

case0:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);

state ++;

break;

case1:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);

state ++;

break;

case2:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);

state ++;

break;

case3:

GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);

GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);

state = 0;

break;

default:

state = 0;

break;

}

}

intmain(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

SystemInit();

SysTick_Config(SystemCoreClock/100);

/* Enable GPIOB, GPIOC and AFIO clock */

RCC_APB2PeriphClockCmd(RCC_GPIO_LED, ENABLE);//RCC_APB2Periph_AFIO

/* LEDs pins configuration */

GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);

for(;;)

{

}

}

/**

* @brief  This function handles SysTick Handler.

* @param  None

* @retval None

*/

voidSysTick_Handler(void)

{

staticintcount = 0;

count ++;

if(count == 100)

{

LED_Spark();

count = 0;

}

}

需要说明的是,若是用 SysTick_Config 函数来设置SysTick的中断频率,时钟源就不能人为的指定了,这时使用的时钟源就是内核的频率。

SystemCoreClock 是个全局变量,它的值就是内核的运行频率,不过前提要调用 SystemInit() 函数来设置内核的频率。如果内核的频率是字节写寄存器来设置的,SystemCoreClock 的值就不一定对了。

相关文章

  • 9.20

    系统定时器: 1.SysTick简介 2.SysTick功能框图讲解 3.SysTick定时实验讲解 运用定时器做...

  • STM32F10x之SysTick 定时器

    姓名:周崇杰 学号:16140120059 专业:机械设计制造及其自动化 转载自:http://blog.csd...

  • 5.STM32之系统定时器(SysTick)

    1.系统定时器介绍 总体概述 SysTick 定时器被捆绑在 NVIC 中,用于产生SysTick异常(异常号:1...

  • SysTick定时器以及delay延迟函数(寄存器版)解析

    一、什么是SysTick 1、Systick定时器也叫滴答定时器或者系统定时器,是一个24位的内核级别的倒计数定时...

  • stm32---SysTick

    1.SysTick定时器SysTick定时器也叫滴答定时器,是Cortex-M3的一个外设,嵌在NVIC。它是一个...

  • 《嵌入式-STM32开发指南》第二部分 基础篇 - 第2章 Sy

    关于STM32 的时钟系统,Systick系统定时器工作原理分析以及Systick系统定时器寄存器分析请看笔者的上...

  • STM32CubeMX学习笔记(4)——系统延时使用

    一、SysTick简介 SysTick —系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定...

  • SysTick定时器

    Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装...

  • 2017/12/18

    SysTick定时器被捆绑在NVIC中,用于产生SysTick异常。在以前,操作系统还有所有使用了时基的系统...

  • 12.18

    SYSTick定时器(滴答时钟):Timer定时器;时基分三大模块:时钟源(最小单位)、重载计数、计数增/减(起始...

网友评论

    本文标题:STM32F10x之SysTick 定时器

    本文链接:https://www.haomeiwen.com/subject/flldixtx.html