初学stm32-Systick滴答时钟定时

最新更新时间: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-通用定时器的使用

推荐阅读最新更新时间:2023-09-22 01:31

STM32驱动DHT22温湿度传感器程序
#include dht22.h #include delay.h //复位DHT22 void DHT22_Rst(void) { DHT22_DQ_OUT=0; //拉低DQ delay_ms(20); //拉低至少18ms DHT22_DQ_OUT=1; //DQ=1 delay_us(30); //主机拉高20~40us } //等待DHT22的回应 //返回1:未检测到DHT22的存在 //返回0:存在 u8 DHT22_Check(void) { u8 retry=100; while ((!DHT22_DQ_IN)&&retry)//DHT2
[单片机]
第二节: 外部中断学习(用CubeMX学习STM32)
前言: 关于中断简单介绍 中断的流程: 中断流程图: 中断方式传送数据具有可以有效提高单片机工作效率, 适合于实时控制系统等优点, 相对于查询方式更为常用。 当CPU处理某件事情的时候, 外部发生的某一事件(如电平的改变、脉冲边沿跳变、定时器/计数器溢出等)请求CPU迅速处理, 于是CPU暂时中断当前的工作, 转去处理发生的事件。 处理完该事件后, 再回到原来中断处, 继续工作。 这样的过程称为中断 上图为中断流程图 这个中断的概念是不是有点晦涩难懂? 主要是这个是书上的内容, 所以不是很形象. 我再解释一遍:想象一个场景, 1、当有一天你正在和川建国同志吃饭(你和他吃饭这个事情就是主程序); 2、突然有个电话打给
[单片机]
第二节: 外部中断学习(用CubeMX学习<font color='red'>STM32</font>)
[单片机框架] [app_led] [WS2812x] 利用软定时器实现WS2812x闪烁和呼吸等灯光模式
数据时序图 0,1码的高低电平时间: 利用单线协议来点亮WS2812X 模拟IO 兼容带OS /******************************************************************************** * @file led_ws2812x.c * @author jianqiang.xue * @version V1.0.0 * @date 2021-11-23 * @brief LED灯光,OneWire控制 * @example #include business_function.h #include app_led
[单片机]
[单片机框架] [app_led] [WS2812x] 利用软<font color='red'>定时</font>器实现WS2812x闪烁和呼吸等灯光模式
STM32 4 path PWM output
  STM32的普通定时器有四路输出:TIMx_CH1、TIMx_CH2、TIMx_CH3和TIMx_CH4,可以使用输出比较的方法产生不同频率的方波输出,简单的方法是:   1)设置计数器为向上计数模式,将自动重装载寄存器设置为0xFFFF;这样计数器会循环计数。   2)每个定时器通道设置为输出比较模式,并设置比较匹配时对应的输出管脚翻转输出。   3)按照输出波形的半波周期计算出一个数值称作Half_Cyc。例如:定时器的时钟频率是72MHz,需要产生3456Hz的方波,则Half_Cyc = 72M/(3456*2) = 41667;如需要产生200kHz的方波,则Half_Cyc = 72M/(200k*2)
[单片机]
Keil5建立stm32工程
一、准备工作: 1、首先在项目名称下建立一个文件夹,作为存放程序的地方; 2、在总文件夹下,依次建立User、Driver、List、Output三个文件夹,作为存放main函数、驱动函数、编译和输出文件的子文件夹; 二、建立工程 1、打开keil软件,选择建立工程并且保存后会自动弹出如下界面: 2、选择所需的芯片类型后,自动弹出如下界面: 3、选择CMSIS下的CORE项、Device项的Startup项、StdPeriph Driver下的RCC项、framework项(这里面含有stm32f10x_config.h misc.c misc.h),这些是必选的项目。剩下的一些外设驱动可以在程序编写的过程中添加。
[单片机]
Keil5建立<font color='red'>stm32</font>工程
STM32F4——定时器原理及应用中断、输入捕获、PWM输出
一、简介: 不同的STM32系列有不同数量的定时器,针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器可以将其分为3类,高级定时器、通用定时器和基本定时器,三种定时器大同小异,下边会针对通用定时器来介绍定时器的原理和应用。对于通用定时器根据位数和计数方式的不同又可以分为3类,相关分类的图表如下: 二、应用: 1、更新:计数器的上溢或下溢。2、事件触发。3、输入捕获。4、输出比较。5、支持针对定位的增量编码和霍尔传感器电路。5、触发输入作为外部时钟或按周期电源管理。下边会针对部分应用做相关介绍和代码分析。 三、框图: 下图是通用定时器TIM2~TIM5的框图,其
[单片机]
STM32F4——<font color='red'>定时</font>器原理及应用中断、输入捕获、PWM输出
stm32串口的学习
串口的基本配置 (使用固件库) 根据这图我们可以知道 stm32 至少会有3个串口 由于自己是使用串口一 所以配置的为usart1 1 时钟使能(用到哪个串口`和GPIO要把相应的时钟开启) 2 串口复位;(一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。) 3 GPIO口配置; 4 串口参数配置; 5 根据需要开启中断 下面的代码部分 一 时钟使能 由于UART的TX和RX和AFIO都挂在APB2桥上,因此采用固件库函数RCC_APB2PeriphClockCmd()进行初始化。UARTx需要分情况讨论,如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,
[单片机]
<font color='red'>stm32</font>串口的学习
基于STM32从零写操作系统系列---使用C语言
目的 C语言,相对于汇编有更好的可读性,便于维护等优点。下面实验将使用C语言实现点亮LED灯。C语言与硬件是紧密连在一起的,结合芯片中的flash和sram,简单了解C语言。 要求 1.有一定的C语言基础 2.了解编译链接脚本 3.了解stm32F103的硬件结构 实验源代码在这下载,代码中有详细注释! 分析 1.首先了解硬件,如图 FLASH,就是存放.bin文件的地方。SRAM,用于存放程序的堆栈,全局变量。 2.了解链接脚本,如图: MEMORY,用于定义存储器范围。 AT rom,表示将对应的SECTION放置到rom中,即Flash中。 _data_start / _data_end,用
[单片机]
基于<font color='red'>STM32</font>从零写操作系统系列---使用C语言

推荐帖子

求基于MSP430F149测频率,通过1602显示
做了几天了,都没有进度,帮一下忙吧,谢谢了 求基于MSP430F149测频率,通过1602显示
盛开的色拉酱 微控制器 MCU
跪求高手单片机小程序
串口通信故障诊断思路:计算机作为上位机定时对作为下位机的单片机“点名”,无“应答”就说明串口通信发生故障。具体的方案:在程序运行过程中,计算机定时向单片机发一个控制代码(FEH),单片机接收到该代码后,根据通信协议向计算机回传一个身份识别代码(该身份识别代码可以由程序产生,也可以写入串行EEPROM内)。计算机在一定时间内接收到单片机发送来的识别代码并与驱动程序识别代码比较,如2个身份识别代码相符,计算机驱动程序正常运行。若计算机在一定时间内没有收到识别代码或收到的识别代码与驱动程序识
hongyy3 单片机
关于LED驱动电源的谐波测试必备
杭州远方PF9811,才两千多块钱; 2-50次谐波都能测出来; 按IEC61000-3-2,谐波要测到39次关于LED驱动电源的谐波测试必备
czf0408 LED专区
运放构成的信号累加电路输入的三种分析法
两种加法电路与对应的描述方程。 先对第一种分析,图示第一种比较简单,我们知道运放的Vin-=Vin+。所以第一个电路图上三个电阻的公共节点电势Vin-=0. (V1/R1)+(V2/R2)=(0-Vout)/RF。移项处理后就得到了公式中的第一个:Vout=-(Rf/R1)*V1-(RF/R2)*V2.请从一楼的图上看更清楚。 第二个图难以理解,当年我感觉难以理解,现在懂了,变的很简单了,我这里主要是像我从前一样迷糊的同学讲的,欢迎大家将自己有所悟的基础知识拿来与大家
gaoyang9992006 ADI参考电路
再问一个问题,我是初学者,别见笑
感谢楼主和其他朋友对小弟上一个问题帮助!!有哪位大虾知道自动控制增益的芯片么,我采集的信号动态范围很大,近距离不用放大信号就饱和了,远距离信号又很小淹没在噪声里,现在滤波已经解决,信号饱和却是个问题,如何实现AGC,他对系统的实时响应速度是不是会有影响,我不知道,大虾提供小弟点资料,谢谢了再问一个问题,我是初学者,别见笑
fengshu DSP 与 ARM 处理器
华为“网络工程师”培训专用教程
华为“网络工程师”培训专用教程 网络工程师必备。。。。。。。。。。。华为“网络工程师”培训专用教程
37°男人 Linux与安卓
小广播
设计资源 培训 开发板 精华推荐

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

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

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