STM32F10x 学习笔记之SysTick 定时器

发布者:悠然自在最新更新时间:2020-11-11 来源: eefocus关键字:STM32F10x  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   

  

  

void LED_Spark(void)  

{  

    static int state = 0;  

    switch (state)  

    {  

    case 0:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);  

        state ++;  

        break;  

    case 1:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);  

        state ++;  

        break;  

    case 2:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);  

        state ++;  

        break;  

    case 3:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);  

        state = 0;  

        break;  

    default:  

        state = 0;  

        break;  

    }  

}  

int main(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 

 */  

void SysTick_Handler(void)  

{  

    static int count = 0;  

    count ++;  

    if (count == 100)   

    {  

        LED_Spark();  

        count = 0;  

    }  

}  


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


[cpp]  view plain copy

#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   

  

void LED_Spark(void)  

{  

    static int state = 0;  

    switch (state)  

    {  

    case 0:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED1);  

        state ++;  

        break;  

    case 1:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED2);  

        state ++;  

        break;  

    case 2:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3);  

        state ++;  

        break;  

    case 3:  

        GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);  

        GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED4);  

        state = 0;  

        break;  

    default:  

        state = 0;  

        break;  

    }  

}  

int main(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 

 */  

void SysTick_Handler(void)  

{  

    static int count = 0;  

    count ++;  

    if (count == 100)   

    {  

        LED_Spark();  

        count = 0;  

    }  

}  

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


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

关键字:STM32F10x  SysTick  定时器 引用地址:STM32F10x 学习笔记之SysTick 定时器

上一篇:STM32F10x 学习笔记之解决JLink 无法下载程序的问题
下一篇:STM32F10x 学习笔记3之CRC计算单元

推荐阅读最新更新时间:2024-10-24 10:45

STM32F10x 学习笔记之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(
[单片机]
浅谈STM32F10X芯片SysTick系统时钟定时器
1、介绍 实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。 系统时钟及系统定时器时钟(详见手册) 2、寄存器描述 SysTick控制及状态寄存器STK_CTRL SysTick重装载数值寄存器STK_LOAD SysTick当前数值寄存器STK_VAL SysTick校准数值寄存器STK_CALIB 与SysTick相关的固件库函数有以下几个: 配置SysTick系统时钟:SysTick_CLKSourceConf
[单片机]
STM32F10x 学习笔记之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(HC
[单片机]
浅谈STM32F10X芯片SysTick系统时钟定时器
如题,正文如下: 1、介绍 实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。 系统时钟及系统定时器时钟(详见手册) 2、寄存器描述 l SysTick控制及状态寄存器STK_CTRL l SysTick重装载数值寄存器STK_LOAD l SysTick当前数值寄存器STK_VAL l SysTick校准数值寄存器STK_CALIB 与SysTick相关的固件库函数有以下几个: l
[单片机]
STM32F10x 学习笔记 2 (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(H
[单片机]
STM32F10X SysTick小教程
前言: SysTick就是STM32 的系统滴答,SysTick的最大使命,就是定期地产生异常请求,作为系统的时基。一般的可以用来作延时,当然了还可以用来计时。 对于它的通俗讲法就是,周期性的的系统中断,滴答滴答的。接下来,我们就以他的为基础做简单延时函数的教程。 这里我用的开发板时正点原子的MiniSTM32,芯片型号为STM32F103RCT6. This is easy, so you can do that very easily! view plain copy ***REMENBER STM32 is you! :) 我们在这里进行通俗的讲解,详细的内容,可以在以后再去看STM32手册。 代
[单片机]
STM32F10x 使用SysTick的延时函数
整个工程下载: http://www.rayfile.com/files/66369fee-d80c-11df-ac1d-0015c55db73d/ 关键代码: UART.h: /******** 串口收发 环形缓冲区实现 ******** * 版本.........: 1.0 * 作者.........: 陈利栋 * 目标.........: ATmega128 * 文件名.......: UART.h * 编译器.......: IAR for AVR V5.5 * 创建时间.....: 2010.10.15 * 最后修改.....: 2010.10.15 ***************************
[单片机]
轻松操作STM32F10X系列单片机的定时器
一、TIMx简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。 二、TIMx主要功能 通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括: ● 16位向上、向下、向上/向下自动装载计数器 ● 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1 ~65536之间的任意数值 ● 4个独立通道: ─ 输入捕获 ─
[单片机]
轻松操作<font color='red'>STM32F10X</font>系列单片机的<font color='red'>定时器</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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