STM32学习笔记——使用SysTick定时器做延时

发布者:缘到泉最新更新时间:2015-08-14 来源: eefocus关键字:STM32  SysTick  定时器 手机看文章 扫描二维码
随时随地手机看文章
   开学了,无法再像假期一样能够一整天玩板了!好在这学期的课说少不少,说多也不多,每周也有十几大节。剩下的时间除去学生工作等一些七七八八的事情,间断着还是能看看教程玩玩板!越发发现《STM32菜鸟学习手册——啰嗦版》真是不错的入门教程,简单易懂。其他诸如《固件库手册》等等官方文件更是必不可少,可惜ST公司的网页找手册实在麻烦得很呐!

   这两天一直在看有关于系统嘀嗒时钟SysTick的文件,但由于3.5版的固件库较2.0版的库,已经将SysTick相关的驱动函数移除,用户要使用SysTick就必须改为调用CMSIS中的函数,而网上大多数的例程(包括《菜鸟学习手册》)使用的都是2.0的库,以至于在学习中遇到许多问题,程序编译总会出现问题。一般都是“无法找到与SysTick相关的函数,函数未定义”错误。因此,查找了许多文献才得以解决。

   SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。主要应用于操作系统,作为“嘀嗒中断”维持操作系统“心跳”的节律。当然,SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

1.SysTick寄存器:

寄存器

说明

地址

CTRL

SysTick控制和状态寄存器

0xE000E010

LOAD

Systick重装值寄存器

0xE000E014

VAL

Systick当前值寄存器

0xE000E018

CALIB

SysTick校准值寄存器

0xE000E01C

 

      SysTick控制和状态寄存器(SysTick_CTRL)

STM32学习笔记——使用SysTick定时器做延时

    说明:

CLKSOURCE位:CM3允许为SysTick提供两个时钟源以供选择。第一个是内核的“自由运行时钟”FCLK。“自由”表现在它不来自系统时钟HCLK,因此在系统时钟停止时FCLK也继续运行。第二个是一个外部的参考时钟。但是使用外部时钟时,因为它在内部是通过FCLK来采样的,因此其周期必须至少是FCLK的两倍(采样定理)。很多情况下芯片厂商都会忽略此外部参考时钟,因此通常不可用。

COUNTFLAG位:当SysTick定时器从1计到0时,它将把COUNTFLAG位置位;而下述方法可以清零之:

读取SysTick控制及状态寄存器(STCSR);

往SysTick当前值寄存器(STCVR)中写任何数据。

 

      SysTick重装值寄存器(SysTick_LOAD)

STM32学习笔记——使用SysTick定时器做延时

   

    说明:

   当计数器倒数至0时,使用SysTick_LOAD寄存器来指定载入“当前值寄存器”的初始值。初始值可以是1到0x00FFFFFF之间的任何值。[page]

 

      Systick当前值寄存器(SysTick_VAL)

STM32学习笔记——使用SysTick定时器做延时

      SysTick校准值寄存器(SysTick_CALIB)

STM32学习笔记——使用SysTick定时器做延时

 

各寄存器示意图:

STM32学习笔记——使用SysTick定时器做延时

2.SysTick函数

3.0版以后的STM32固件库在标准外设库中移除了SysTick的驱动,因此用户必须调用CMSIS定义的函数。

CMSIS只提供了一个SysTick设置的函数,替代了STM32原有SysTick驱动的全部函数。

 

[cpp] view plaincopy
 
  1. SysTick_Config(uint32_t ticks);  

 

该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysTick时钟默认使用系统时钟。

此外,还可以使用SysTick_CLKSourceConfig函数来改变时钟源,使用NVIC_SetPriority设置中断优先级(往后再深入)。

SysTick_CLKSourceConfig函数

函数名

SysTick_CLKSourceConfig

函数原型

SysTick_CLKSourceConfig(u32 SysTick_CLKSource)

行为描述

配置SysTick的时钟源

输入参数

SysTick_CLKSource:SysTick的时钟源

输出参数

返回值

前提条件

调用函数

 

SysTick_CLKSource允许值

SysTick_CLKSource

描述

SysTick_CLKSource_HCLK_Div8

SysTick时钟源为AHB时钟的1/8

SysTick_CLKSource_HCLK

SysTick时钟源为AHB时钟

 [page]

例:

选择1/8的AHB时钟作为SysTick时钟源

 

[cpp] view plaincopy
 
  1. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  

 

 

3.例程

3.1 程序代码

本例程代码在点亮LED灯例程代码上做修改,使用SysTick定时延时,除延时外其他代码不变,与SysTick相关语句给予注释。

 

[cpp] view plaincopy
 
  1. #include "stm32f10x.h"  
  2. void Delay(u32 nTime);//声明延迟函数  
  3. void GPIO_Configuration(void);  
  4. int main(void)  
  5. {  
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  
  7. GPIO_Configuration();  
  8. while(SysTick_Config(SystemCoreClock/1000)!=0);//配置SysTick,装入初始值,装载值根据时钟源频率而定,72MHz时钟源则产生1ms中断需要装载值为(72000000/1000)  
  9.   while(1)  
  10.   {  
  11.    GPIO_ResetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9);  
  12.    GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8);  
  13.    Delay(1000);  
  14.    GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_8);  
  15.    GPIO_SetBits(GPIOC,GPIO_Pin_7|GPIO_Pin_9);  
  16.    Delay(1000);  
  17.    GPIO_Write(GPIOC,0x0140);  
  18.    Delay(1000);  
  19.    GPIO_Write(GPIOC,0x0280);  
  20.    Delay(1000);  
  21.    }  
  22. }  
  23.    
  24. void GPIO_Configuration(void)  
  25. {  
  26.   GPIO_InitTypeDefGPIO_InitStructure;  
  27.  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;  
  28.  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  
  29.  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  
  30.  GPIO_Init(GPIOC,&GPIO_InitStructure);  
  31. }  
  32.    
  33. volatile u32 TimingDelay;//定义全局变量,其声明在stm32f10x_it.c中  
  34. void Delay(u32 nTime)//定义延迟函数  
  35. {  
  36. TimingDelay=nTime;//将延迟数赋予全局变量  
  37. while(TimingDelay!=0);  
  38. }  

 

其中,在stm32f10x_it.c中:

 

[cpp] view plaincopy
 
  1. extern volatile u32 TimingDelay; //声明全局变量  
  2. void SysTick_Handler(void)  
  3. {  
  4.   TimingDelay--;  
  5. }  

 

3.2 结果

编译烧入开发板后,LED等以1s的时间精确交替闪烁。

 

参考文献:

[1]JosephYiu,宋岩译.《Cortex-M3权威指南》[EB/OL].http://ishare.iask.sina.com.cn/f/11378333.html?retcode=0,2010-11-05/2012-09-09.

[2]ST.《STM32固件库2.0.3与3.0版本的比较中文版》[EB/OL].http://ishare.iask.sina.com.cn/f/18297257.html?from=like,2011-08-22/2012-09-09.

[3]Xxbing8.STM32_SysTick[EB/OL].http://hi.baidu.com/xxbing8/item/c99ea4f53f996ad042c36ab82012-06-14/2012-09-09.


关键字:STM32  SysTick  定时器 引用地址:STM32学习笔记——使用SysTick定时器做延时

上一篇:STM32学习笔记——利用通用定时器TIM2进行精确延时
下一篇:STM32学习笔记——学前准备

推荐阅读最新更新时间:2024-03-16 14:28

嵌入式stm32学习:I2C-读写EEPROM
bsp_i2c_gpio.h #ifndef _BSP_I2C_GPIO_H #define _BSP_I2C_GPIO_H #include stm32f4xx.h #include inttypes.h #define EEPROM_I2C_WR 0 /* 写控制bit */ #define EEPROM_I2C_RD 1 /* 读控制bit */ /* 定义I2C总线连接的GPIO端口,用户只需要修改下面四行代码即可任意改变SCL和SDA的引脚 */ #define EEPROM_I2C_GPIO_PORT GPIOB #define EEPROM_I2C_G
[单片机]
以CPLD为核心的定时器
    摘要: 文章介绍了以EDA技术作为开发手段来实现99分钟内定时的设计构成和各电路模块的功能,并给出了各模块的设计源程序。     关键词: VHDL语言 CPLD 定时器 传统的99分钟定时器的设计硬件连线比较复杂,可靠性差。随着CPLD的出现,基于VHDL语言的定时器电路设计将变得相对简单而且性能稳定,这点充分体现了可编程逻辑器件数字电路中的优越性。 1 总体结构 在设计具有整体清零功能,并可在99分钟内任意定时的定时器时,笔者采用了MAX7128LC84-15作为主芯片和两位数码管,并采用时钟信号来提供秒信号设计了一个简单的定时器。该定时器的工作方式是以秒速度递增置预定时间,而以分速度递减至
[半导体设计/制造]
stm32中断服务函数的机制
简述:当中断触发时,会保存当前运行状态,然后跳转到中断向量处执行(可嵌套),中断完成后再返回保存的运行状态执行。 中断服务函数并非用户(写程序的人)调用,而是预先写入中断向量(相应中断执行首地址),中断发生后自动执行,所以源码中只需定义实现自己的中断服务函数而不需要考虑在mian中调用的时。 那么问题的关键便是一个普通的c函数是如何实现写入中断向量。mcu的地址最低区是用作中断向量表的,即中断触发后,将执行相应中断向量(字)处的指令(一般为跳转指令)然后跳转到相应的中断服务函数执行,那么中断向量是如何跳转到中断服务函数的地址的呢。 首先我们要看中断服务函数的声明,库文件中唯一的中断服务函数标示符只存在startup.s
[单片机]
51波特率发生器定时器初值计算方法
在模式0和模式2下,串口波特率固定,模式0为Fosc/12。模式2为Fosc/32或Fosc/64,具体由PCON寄存器的SMOD位决定。 在模式1和模式3下,波特率是一个可变值,波特率可以由定时器1产生(8052可以由定时2产生),那么波特率到底为多少呢?波特率由定时器1的溢出率来决定: Baud Rate = (2SMOD/32)*(Timer 1 Overflow Rate) 注意:2SMOD这里的SMOD是指数,SMOD为波特率双倍波特率位,该位在PCON寄存器中。 当使用timer 1作为波特率产生器时,通常需要将timer 1配置成8位自动重装的工作模式下,同时还要禁止timer 1中断,那么timer 1的溢出率是怎
[单片机]
STM32 PWM之实现呼吸灯
一、简述 记--使用定时器4输出PWM来实现呼吸灯效果。 在人眼辨识能力范围内,调节LED亮的时间,达到LED灯的亮度不同。例:给低电平LED就亮,如果一个脉冲中全是低电平那么LED最亮,如果一个脉冲一半是高电平,一半是低电平,那么LED就显得有点暗,这样调整脉冲中的高低电平的比例就可以达到LED的亮度调节。 例子:链接: https://pan.baidu.com/s/1UEoZCFGvJSwpzSynFv73gA 提取码: 3ipx 二、效果 LED1逐渐由暗变亮,接着由亮变暗。 三、工程结构 四、源文件 main.c文件 #include stm32f
[单片机]
<font color='red'>STM32</font> PWM之实现呼吸灯
stm32如何获取自己的ID号
一、函数。 void STM32_GetChipID(unsigned int *cID) { cID =*(vu32*)(0x1ffff7e8); cID =*(vu32*)(0x1ffff7ec); cID =*(vu32*)(0x1ffff7f0); } 二、可以用串口打印出来。 Printf( \r\nChip ID: %d, %d, %d\r\n , cID , cID , cID );
[单片机]
基于STM32单片机通过GPIO输出点亮LED灯
一. GPIO初始化 STM32单片机和51单片机不同,51单片机只需与引脚相连后就可以使用引脚发出高低电平信号控制外部器件,而STM32单片机需要先对引脚进行配置(初始化),如果使用引脚用作I2C、SPI、USART等通讯接口时,就是所谓的复用功能时,就需要再配置外设的工作参数。 1.使能GPIO端口时钟; RCC_APBxPeriphClockCmd(RCC_APBxPeriph_GPIOy , ENANLE/DISABLE); 函数表示使能或者不使能APBx(Advanced Peripheral Bus)的外设时钟,APBx表示时钟总线APB1或APB2,APB1为低速的外设时钟(最大为36MHz),APB2
[单片机]
基于<font color='red'>STM32</font>单片机通过GPIO输出点亮LED灯
新款STM32U5:让便携产品拥有惊艳图效
凝聚ST超低功耗微控制器技术精华的STM32U5于2021年问世,是一款堪称可改变游戏规则的低功耗MCU。 作为STM32高性能低功耗系列旗舰产品, STM32U5延续STM32F2/F4/F7的应用范围,同时又有更低的能耗,具有更高的性价比。 在工业控制系统中,U5可以承担主控器、系统监控以及图形显示等核心职能。 高性能,低功耗,丰富的数字外设和更高性能的模拟接口,强大的安全特性,以及支持图形加速,让STM32U5在工业控制、工业表计和医疗健康,个人穿戴设备等应用领域取得良好的表现,为泛工业系统创新赋能。在这个视觉统治一切的时代,人们对图形效果的追求永远没有止境,同时也希望实现起来更简单快速,性价比更高。“如果只
[单片机]
新款STM32U5:让便携产品拥有惊艳图效
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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