滴答定时器概述
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-库函数开发步骤及总结
下一篇:初学stm32-通用定时器的使用
推荐阅读最新更新时间:2024-11-16 20:00
推荐帖子
- 將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
设计资源 培训 开发板 精华推荐
- 用于工业资产跟踪的 DC 到 DC 多输出电源
- 莱洛三角_esp32-DRV8313
- 使用 ON Semiconductor 的 NCP1086 的参考设计
- AD587UQ 低功耗电压基准、12 位 CMOS DAC 应用的典型应用电路
- LDK130M18R 1.8V、300 mA 低静态电流、极低噪声 LDO 的典型应用固定版本电路
- 【训练营】【物联网实战】灯带世界+846932A
- 使用 NXP Semiconductors 的 MKL36Z256VLL4 的参考设计
- LT1952IGN-1 36V 至 72V 输入至 12V 在 20A 无(光耦合器)同步总线转换器的典型应用电路
- LTC3400BES6 演示板、1.2MHz、高效同步升压转换器、Vin = 1V 至 3V、Vout = 3.3V @ 90mA
- 性价比极高的STM32入门开发板
- 【传感器,开玩啦】第一关:免费申请评测运动和环境传感器开发板
- 夏末秋初,玩转EE芯积分,边赚边花+礼品兑换剧透
- 有奖直播|第三代 TI C2000™ 新特性资源更新
- 【读书月】读一本RT-Thread技术好书,写下你的读书笔记
- 揭秘正确选择探头的5大要素 (泰克原装探头促销,高贵不贵,199元起)
- 证明自己,VICOR技术问题测试问卷,等您来挑战!好礼等您拿!
- TE户外照明互连解决方案样片来袭 免费申领进行中!
- 留下你的点评,是德科技信号分析仪,精美礼品等你拿!
- Follow me第二季第1期来啦!与得捷一起解锁【Adafruit Circuit Playground Express】超能力!
- ELEXCON 2022 深圳国际电子展11月6日(新档期)开幕,速领门票!更有N重好礼等你拿!