初学stm32-Systick滴答时钟定时

发布者:行者无疆1978最新更新时间:2022-05-26 来源: eefocus关键字:stm32  Systick  滴答时钟  定时 手机看文章 扫描二维码
随时随地手机看文章

滴答定时器概述

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如uCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做uCOS心跳时钟。


Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。


SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。


Systick中断的优先级也可以设置。


一共4个Systick寄存器

CTRL------------->SysTick 控制和状态寄存器

LOAD------------->SysTick 自动重装载除值寄存器

VAL----------------> SysTick 当前值寄存器

CALIB ------------> SysTick 校准值寄存器

对于STM32,外部时钟源是 HCLK(AHB总线时钟)的1/8,内核时钟是 HCLK时钟配置函数:SysTick_CLKSourceConfig();

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

滴答定时器相关函数

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

这一句把SysTick的时钟选择外部时钟, 这里需要注意的是: SysTick 的时钟源自 HCLK 的 8 分频, 假设我们外部晶振为 8M,然后倍频到 168M,那么SysTick 的时钟即为 21Mhz,也就是 SysTick 的计数器 VAL 每减 1,就代表时间过了1/21us 。


SysTick_CLKSourceConfig(); //Systick时钟源选择 misc.c文件中


SysTick_Config(uint32_t ticks); //初始化systick,时钟为HCLK,并开启中断

//core_cm3.h/core_cm4.h文件中


void SysTick_Handler(void);//Systick中断服务函数


滴答定时器实现延时

#include "stm32f4xx.h"

#include "led.h"


static __IO uint32_t TimingDelay;

void Delay(__IO uint32_t nTime)

TimingDelay = nTime;

while(TimingDelay != 0);

}

//每隔1ms进入中断

void SysTick_Handler(void)

{

if (TimingDelay != 0x00) 

TimingDelay--;

}

}

int main(void)

Led_Init();

//配置systick时钟源及中断 SystemCoreClock = 168000 000  1ms产生中断

//初始化systick,时钟为HCLK,并开启中断

if (SysTick_Config(SystemCoreClock / 1000)) //systick时钟为HCLK,中断时间间隔1ms

{

    GPIO_ResetBits(GPIOE, GPIO_Pin_14);

    while (1)

    {

GPIO_ToggleBits(GPIOF, GPIO_Pin_9);

Delay(1000);  //延时1S

}

}

   return 0;

}

//led初始化见前面几篇博客


封装函数delay.c


#include "delay.h"



u32 my_us = 21;     //计21个数,用时1us

u32 my_ms = 21000;  //计21000个数,用时1ms


void Delay_Init(void)

{

//systick定时器频率:168/8 = 21MHZ    

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);


}


//参数u32 nus值范围:0~798915

void delay_us(u32 nus)

{

u32 temp;

//设置重装值

SysTick->LOAD = my_us*nus - 1;

//设置VAL为0

SysTick->VAL = 0x00;

//开定时器

SysTick->CTRL |= (0x01<<0);

do

{

temp = SysTick->CTRL;  //temp 第十六为1,则说时计数到0

}while(  temp & (0x01<<0) && !(temp & (0x01<<16)) );

//判断定时器是否开启   判断计数是否到0

//关定时器

SysTick->CTRL &= ~(0x01<<0);


}


//参数u32 nms值范围:0~798

void delay_ms(u32 nms)

{


u32 temp;

//设置重装值

SysTick->LOAD = my_ms*nms - 1;

//设置VAL为0

SysTick->VAL = 0x00;

//开定时器

SysTick->CTRL |= (0x01<<0);

do

{

temp = SysTick->CTRL;  //temp 第十六为1,则说时计数到0

}while(  temp & (0x01<<0) && !(temp & (0x01<<16)) );

//判断定时器是否开启   判断计数是否到0

//关定时器

SysTick->CTRL &= ~(0x01<<0);


}


void delay_s(int n)

{

int i;

for(i=0; i {

delay_ms(500);

delay_ms(500);

}

}

关键字:stm32  Systick  滴答时钟  定时 引用地址:初学stm32-Systick滴答时钟定时

上一篇:初学stm32-库函数开发步骤及总结
下一篇:初学stm32-通用定时器的使用

推荐阅读最新更新时间:2024-11-16 20:00

stm32学习笔记---ADC电压采集
1. ①电压输入范围 ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定。 我们在设计原理图的时候一般把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到 ADC 的输入电压范围为:0~3.3V。 如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可 以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V,这样 ADC 就 可以测量了。 2. ②输入通道 我们确定好 ADC 输入电压之后,那么电压怎么输入到 ADC?这里我们引入通道的概念, STM32 的 ADC
[单片机]
<font color='red'>stm32</font>学习笔记---ADC电压采集
STM32串口中断卡死主循环一直进中断问题分析
在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象。 问题分析如下: 1、程序USART2不停接收并处理串口数据,波特率115200; 2、主循环卡死; 3、USART1中断及TIM2中断响应函数运行正常;(USART1及TIM2中断优先级均比USART2高) 4、出现现象后,拔掉USART2的接收数据线,现象不能回复正常; 5、出现现象后,拔掉后再插入USART2的接收数据线,现象不能回复正常; 6、并未出现HardFault现象; 基于以上4点,可能原因如下: 1、USART2接收中断标志没有清除; 2、堆栈数据溢出,导致程序异常; 3、USART2中断重入导致异常; 4、USART2中断
[单片机]
<font color='red'>STM32</font>串口中断卡死主循环一直进中断问题分析
OFDM水声通信系统定时同步的FPGA实现
0 引 言 正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)技术是一种多载波调制技术,它将宽带信道分解为相互正交的一组窄带子信道,利用各个子信道进行并行数据传输,因此其频谱利用率高、抗多径衰落能力强。目前已经在数字视频广播(DVB-T2)、无线局域网(802.11a/g])等系统中成功得到应用,并且成为第四代移动通信的核心技术之一。水声信道是一个时、空、频变的多径信道,它具有强多径、窄频带和强噪声等特点,将OFDM传输技术应用到水声通信中,已成为水声通信的研究热点之一。 OFDM系统自身的正交多载波调制特点,决定了其对同步误差十分敏感。能否实现准确的符号定时同步
[网络通信]
如何用STM32单片机蜂鸣器来演奏音乐
本文用STM32单片机蜂鸣器来演奏音乐,用的开发软件是STM32CubeIDE。 蜂鸣器 有源蜂鸣器 内部有震荡源,只要通电就会有响声,但是声音频率固定。 无源蜂鸣器 内部不含振荡源,蜂鸣器管脚输出一定频率的信号,才能发声。 本实例中用到的是无源蜂鸣器,控制频率高低发出不同声调的声音。 电路原理图 由电路原理图可知,蜂鸣器在PB5管脚,以一定频率翻转PB5管脚的电平,可以使蜂鸣器发声。 STM32工程 打开STM32CubeIDE软件,新建STM32工程。关于STM32CubeIDE软件的使用方法,可以参考此文:STM32中PWM的配置与应用详解。 配置时钟。 项目设置。 设置调试模式。 开启PB5管脚。
[单片机]
如何用<font color='red'>STM32</font>单片机蜂鸣器来演奏音乐
PIC单片机定时器相关用法
什么是定时器? 定时器顾名思义就是用来定时的。在单片机应用中常常用于各种各样的定时。比如让LED灯每隔 1S 亮一次。 这个1S 就是由定时器做到的。 指令周期 指令周期就是单片机执行一个指令所花费的时间。这也是定时器定时的最小时间单位。时钟频率/4=指令频率。1/指令频率=指令周期。 假设现在的时钟是4MHZ ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0.0000001s也就是1us,这个1us就是指令周期,这1us也就是定时器定时的最小单位。 定时器与预分频器 假设在没有预分频器情况下。开启定时器 每隔一个指令周期定时器就加一。假设时钟是4MHz 也就是每隔 1us 定时器加一。 如果有了预分频器假设预分
[单片机]
PIC单片机<font color='red'>定时</font>器相关用法
动态扫描方法和定时器1在数码管的前三位显示出秒表
/* 用动态扫描方法和定时器1在数码管的前三位显示出秒表 */ #include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char uint closedu,closewe; uchar code wetable ={ 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar code dutable ={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}
[单片机]
STM32 DMA
DMA,全称为:Direct Memory Access,即直接存储器访问,DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。 DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。DMA 是个非常好的功能,它不但能减轻 CPU 负担
[单片机]
STM32 USB那点事之6
SetEPTxCount(ENDP2, count) 假如count小于或等于报描述报告告中规定的COUNT,那么USB输入设备可以发送数据,但HID Complaint Device向USB输入设备层请求数据是得不到数据。 先选中: 在BUS Hound,中的体现: 如果count =report Count Size :那么结果如下: 反之:count report Count Size时候:如下: 上面一个是HID Complaint Device向USB输入设备请求不到数据,而下面就可以请求得到数据了!
[单片机]
<font color='red'>STM32</font> USB那点事之6

推荐帖子

將NandFlash做為USB disk不能被PC正常識別的問題.
我的NandFlash共256M,在Eboot中做成兩個Partition,一個是BNFS,一個是DOS32(FAT),啟動後在WinCE的存儲管理器中能看到DSK1:下有兩個分區:Part00和Part01,且讀寫正常.然後設置如下:DefaultClientDriver=Mass_Storage_ClassDll=usbmsfn.dllInterfaceSubClass=dword:06InterfaceProtoc
wewe2000 嵌入式系统
贝尔 PCB 设 计 规 范.pdf
贝尔PCB设计规范.pdf贝尔PCB设计规范.pdf好东西,下载珍藏起来,谢谢楼主好东西,下载珍藏起来,谢谢!!!{:1_103:}挺有用的,谢谢楼主!感谢楼主分享!!!:) 感谢楼主分享!!!
zuo_zelin PCB设计
EDI CON China 2017已近在眼前,4月25-27日我们不见不散~
EDICONChina2017已近在眼前,4月25-27日我们不见不散~EDICONChina(电子设计创新大会)是一个由产业推动的会议和展览,为设计工程师和系统集成商提供针对当今通信、计算、RFID、无线、导航、航空航天及相关市场的最新射频/微波和高速数字产品和技术信息。这项一年一度的盛事提供半导体、模块、印刷电路板和系统级的实用设计解决方案,与会者可亲身参与体验。EDICONChina汇集了中国创新前沿和世界领先跨国科技公司的设计师。
EEWORLD社区 综合技术交流
【国产FPGA安路 高集成低功耗SF1系列FPSoC新品】RISC-V SDK代码框架分析
前言前面搭建了RISC-V的开发环境,这一篇来讲讲SDK代码框架,这有利于后面程序开发。过程查找链接脚本对于嵌入式项目,要了解代码框架,最先要从链接脚本入手,从这里可以找到启动代码,程序入口等信息,然后层层递进抽丝剥茧才能了解全貌。右键点击工程-Properties看到链接脚本如下D:\BOARD\SF1-FPSoC\SF1S60CG121I_SF102\SF1S60CG121I_SF102\TN810_SF102\src\mcu_ahb_to_
qinyunti 国产芯片交流
关于直流电机测速的发射管和接收管问题 急。。。。急。。。
做一个直流电机测试模块~用红外发射管跟红外接收管接收管用HS0038发射管上是不是要接38Khz的信号~如图1电机带动的转片上有孔反射管的红外线可以透过是不是当接受管接收到红外光时输出低电平当档着的时候输出高电平当电机转起来的时候输出端会输出脉冲用单片机就可以检测了发射,接受这块对不对请教下~还有就是我能不能发射端直接用一个发光二极管接收端用光敏三极管这样发射管的一端就接+VCC当光射到接受端的光敏三极管上时输出
heeh_only 单片机
HT1623 datasheet
HT1623datasheetHT1623datasheet
maker Microchip MCU
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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