初学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  滴答时钟  定时 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic566452.html

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

推荐阅读

stm32——跑马灯实验(用库函数实现)
库函数介绍1,初始化函数:void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);作用:初始化一个或者多个IO口(同一组)的工作方式和速度。该函数主要是操作GPIO_CRL(CRH)寄存器,在上拉或者下拉的有时候有设置BSRR或者BRR寄存器例如:GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitTypeDef.GPIO_Pin = GPIO_Pin_5;//LED0-->PB.5 端口配置GPIO_InitTypeDef.GPIO_Mode = GPIO_Mode_OUT_PP;//推挽输出GPIO_
发表于 2022-06-27
<font color='red'>stm32</font>——跑马灯实验(用库函数实现)
stm32—文件封装
一,环境:开发环境:MKD5固件库版本:V3.5(可自行在官网下载)二,步骤:1, 在建立工程之前,我们建议用户在电脑的某个目录下面建立一个文件夹,后面所建立的工 程都可以放在这个文件夹下面,这里我们建立一个文件夹为 Template。2,点击 MDK 的菜单:Project –>New Uvision Project ,然后将目录定位到刚才建立的文件夹 Template 之下,在这个目录下面建立子文件夹 USER(我们的代码工程文件都是放在 USER 目录,很多人喜欢新建“Project”目录放在下面,这也是可以的,这个就看个人喜好了), 然后定位到 USER 目录下面,我们的工程文件就都保存到 USER 文件夹下面。工程命
发表于 2022-06-27
<font color='red'>stm32</font>—文件封装
stm32跑马灯——寄存器和位操作
寄存器版:GPIO基础:每组io口有7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。硬件连接:例如:由上图1可知:要使用到LED0和LED1,他们的IO口分别为PB5和PE5由上图2可知:要使用到LED0和LED1,他们的IO口分别为PA8和PD2GPIO的输出模式为推挽输出。代码:使能IO口时钟:配置寄存器RCC APB2ENR.初始化IO口模式:配置寄存器GPIOx CRH/CRL操作IO口,输出高低电平:配置寄存器GPIOX_ODR或者BSRR/BRR.这里采用上图1的的原理图:led.h:#ifndef __LED_H //避免重复引用#define __LED_Hvoid LED_Init(void)
发表于 2022-06-27
<font color='red'>stm32</font>跑马灯——寄存器和位操作
stm32蜂鸣器实验
硬件连接:提示:不能通过IO口直接驱动大功率器件实验步骤:使能IO口时钟。调用RCC_APB2PeriphColckCmd();初始化IO口模式。调用函数BEEP_Init();操作IO口,输出高低电平。代码:beep.h:#ifndef __BEEP_H#define __BEEP_H #include "sys.h"//蜂鸣器端口定义#define BEEP PBout(8) // BEEP映射到PB8,蜂鸣器接口 void BEEP_Init(void); //初始化#endifbeep.c:include "beep.h"//初始化PB8为输出口.并使能这个口的时钟//蜂鸣器初始
发表于 2022-06-27
<font color='red'>stm32</font>蜂鸣器实验
Systick滴答定时器讲解
Systick定时器基础知识讲解:Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有- Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。Systick定时器就是系统滴答定时器,一个24位的倒计数(从大到小)定时器,计到0时,将从RELOAD寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。SysTick定时器被捆绑在NVIC中,用于产生SYS
发表于 2022-06-24
Systick滴答<font color='red'>定时</font>器讲解
STM32的端口复用和重映射
什么是端口复用?STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。例如:串口1的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做复用功能串口1的发送接收引脚的时候,叫端口复用。复用功能的配置:以下端口复用配置过程以PA9,PA10配置为串口1为例GPIO端口时钟使能。RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);复用外设时钟使能。比如你要将端口PA9,PA10复用为串口,所以要使能串口时钟。RCC_APB2PeriphC
发表于 2022-06-24
<font color='red'>STM32</font>的端口复用和重映射

推荐帖子

用GD32做个音乐频谱练练手
由于手上有GD32C8T6和12864的液晶彩屏,某些PCB厂商的政策又很给力,决定做一款音乐频谱显示屏玩玩 设计目标:小型,低成本,电池供电,双声道,彩色 1.设计电路 设计PCB 3.写代码 基本思路: 要显示20-20KHZ的频谱范围,采样率设定在40KHZ 使用DMA采样256点,采样定时器使用tiM2。DMA数据满后触发中断,计算FFT。 4.驱动LCD 由于IO富裕,所以使用8080接口 LCD屏幕是565模式16位色,128*64分辨率,0.96寸。微型
csaaa GD32 MCU
怎么指定Cadence原理图中原理图库和封装库的路径
大家好,我最近学习Cadence,感觉和之前的AD软件完全不一样。我拷贝了别人已经做好的一个原理图,也从他给我的PCB文件中把封装库导入到我自己建立的一个文件夹里面,还有他在原理中的原件库我也拷贝到我自己建立的文件夹中,现在的问题是:我怎么指定Cadence原理图中原理图库和封装库的路径。这样的话我在进行原理图DRC检查才不会报错。并且能够正确地生成网表。怎么指定Cadence原理图中原理图库和封装库的路径
Rephontil PCB设计
Flash读写问题
小弟刚入门,向各位请教一个关于Flash的读写问题 在ADuc702x中,Flash是统一编址的,直接使用ARM指令就可以读Flash的数据,能不能直接使用arm指令直接写Flash?好像是不能吧,需要写入Flash寄存器固定的写入序列是吧,不过读为什么可以,原理是什么呢?Flash读写问题
fenglangxing 嵌入式系统
电子产品电磁兼容性学习问答
请先登陆再下载电子产品电磁兼容性学习问答
护花使者 FPGA/CPLD
本人刚刚开始学习cadence virtuoso,发现只要原理图出现电感并联仿真就报错
本人刚刚开始学习cadencevirtuoso,发现只要原理图出现电感并联仿真就报并联的电感形成短路回路的错,这是什么原因?我知道并联电感可以用一个电感代替,但就是单纯想知道为什么并联电感就会报错,谢谢大家 本人刚刚开始学习cadencevirtuoso,发现只要原理图出现电感并联仿真就报错
非标准理工男 模拟电子
STM32-Oneday技术讲座
大家可以通过各种渠道拿到工具了,不知道有没有必要搞一个全国范围的技术讲座,围绕着软件,还有芯片的外围功能和调试技术,做一个入门级的培训。可以送一些书,,,上海,深圳,北京拿到工具的人希望讲什么内容?1)MDK软件的使用2)中文书3)STM32调试技术及技巧还有什么想法,大家提出来看看,尽量满足要求。。。STM32-Oneday技术讲座
badapple628 stm32/stm8
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

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

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