STM32 SysTick 精确延时(非中断方式)

发布者:CelestialLight最新更新时间:2018-07-20 来源: eefocus关键字:STM32  SysTick  精确延时  非中断方式 手机看文章 扫描二维码
随时随地手机看文章

SysTick是Cortex-M内核自带的一个24位定时器,所以我们可以在core_cm3.h或core_cm4.h头文件中看到它的寄存器定义和配置函数SysTick_Config()。SysTick的功能非常简单,仅仅提供一个时基功能,支持中断请求,因此它的寄存器寥寥无几。

以下是手册上对SysTick寄存器的介绍:


CTRL为控制寄存器:

ENABLE:使能位

TICKINT: 中断的开关,当计数溢出且TICKINT=1时SysTick将发出中断申请。

CLKSOURCE:时钟选择位,CLKSOURCE=1时选择系统时钟,如果是M3则为72MHz,M4则为168MHz。否侧选择外部时钟作为时钟源。

COUNTFLAG: 溢出标志位,计数到0时置1,而且硬件自动清零。

LOAD为重载值寄存器:

当计数到0时SysTick自动将此寄存器的值加载到VAL寄存器中。注意它是24位的,所以最大值为0XFFFFFF。

VAL为当前值寄存器:

SysTick是从上往下计数的,所以此寄存器的值是递减的。

那么,了解了SysTick的寄存器之后就可以配置它了。首先将CLKSOURCE位置1,选择系统时钟作为时钟源,以M4内核为例,就是168MHz。为了让SysTick每1us溢出一次,就须要把重载值设置为167(168-1)。当需要延时n(us)时,就将ENABLE位置1,让SysTick开始计时,然后等待n次COUNTFLAG标志之后退出就行了。

下面是示例代码:

#include "delay.h"

 

void delay_config(void)

{

SysTick->CTRL |= SysTick_CTRL_CLKSOURCE_Msk; //时钟源为系统时钟168MHz

SysTick->LOAD = 167; //重载值为168-1,每1us溢出一次

}

 

void delay_ms(vu32 nTime)

{

nTime *= 1000;

SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能SysTick,开始计数

while(nTime--){

while((SysTick->CTRL&0X010000) == 0); //等待COUNTFLAG标志位置1

}

SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk); //失能SysTick,停止计数

}

 

void delay_us(vu32 nTime)

{

SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;

while(nTime--){

while((SysTick->CTRL&0X010000) == 0);

}

SysTick->CTRL &= (~SysTick_CTRL_ENABLE_Msk);

}


关键字:STM32  SysTick  精确延时  非中断方式 引用地址:STM32 SysTick 精确延时(非中断方式)

上一篇:STM32F407定时器编码器模式
下一篇:stm32之SysTick的理解

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

STM32定时器产生PWM彻底应用
这次学习STM32花了很长时间,一个礼拜多,也有颇多收获,学习过程也有颇多曲折。这次的任务是:用STM32的一个定时器在四个通道上产生四路频率可调占空比可调的PWM波。 看到这个题,我先看STM32的数据手册,把STM32的定时器手册看完就花了一天,但是看了一遍任然不知道所云,就看库函数,略有点理解,就想一哈把这个程序调出来,于是就花了一天多时间仿照网上别人的程序来写,花了一天多写出来调试,结果行不通,做了无用功,于是静下心来想想,还是一步一步的来。 我先用STM32的通用定时器用PWM模式产生四路相同占空比,不同频率的PWM波,配置如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM
[单片机]
STM32配置外部中断(EXTI)流程
1:配置外设GPIO端口(具体配置为请看配置GPIO流程) GPIO_Init(); 2:使能复用功能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 3:初始化外部中断以及配置中断映射 EXTI_InitTypeDef EXTI_InitStruct; GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //中断映射 EXTI_InitStruct.EXTI_Line = EXTI_Line0; //中断线 EXTI_I
[单片机]
玩转STM32CubeMX | STM32内部FLASH
1.内部FLASH简介 之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下图示 STM32F1的闪存模块由:主存储器、信息块和闪存存储器接口寄存器3部分组成 *主存储器:用来存放代码和数据常量,起始地址是0x08000000,BOOT0和BOOT1都接GND时,就是从该起始地址运行
[单片机]
玩转STM32CubeMX | <font color='red'>STM32</font>内部FLASH
解读STM32位带操作, 让你快速了解并掌握它的用途
今天重温一下经典的位带操作,主要结合Cortex-M3内核(STM32)来讲述,相信许多朋友在初学的时候都被绕晕过。 关于位带操作,它的难点其实在于需要理解或掌握较多基础知识。当你掌握这些基础知识,它其实就不难了。 接下来带领大家掌握关于Cortex-M3的位带操作,顺便让大家回顾一下这些基础知识。 1初识位带操作 Bit-banding简称位带,有人也叫位段。支持位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。 很多朋友是从学习51单片机过来的,都知道P1.1这个引脚可以单独控制,我们操作的这个引脚就是一个Bit位。 我们都知道在STM32中不能直接操作寄存器的某一个Bit位,比如单独控制PA端口输出数据寄存
[单片机]
解读<font color='red'>STM32</font>位带操作, 让你快速了解并掌握它的用途
STM32F103程序设计-1-STM32开发环境的建立
STM32开发环境的建立需要使用的软件有两个,一个是编写单片机程序的软件Keil MDK,另一个是串口下载程序时要使用的软件MCUISP。如果使用仿真器下载程序的话则需要安装仿真器的驱动程序,这个在以后的课程中将进行讲解。下面先看一下孟老师给大家的相关软件如下图所示。 其中mdk_513.exe为Keil MDK的安装包,该软件的安装一路点击Next,直到最后看到Finish安装结束。安装结束后打开软件,软件界面如下图所示。 点击上图中的按钮将弹出一个安装各种型号单片机所需包的界面,如下图所示。 Keil5与之前版本不同的是要单独安装你所使用单片机的相应安装包。如果在线联网不成功,有很大的可能是软件没能连到相关网站上,
[单片机]
STM32F103程序设计-1-STM32开发环境的建立
STM32 禁用swd-jtag下载口后,重新下载程序的方法
由于工作需要,复用了PA15的时候,程序禁用swd-jtag功能,网上多方查找解决方法。 在重新上电的时候,保证BOOT0为高电平,BOOT1为低电平,即可禁止程序从烧写过的代码启动,这时,重新烧写程序即可。 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存=芯片内置的Flash。 2)SRAM=芯片内置的RAM区,就是内存啦。 3)系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROROMM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位
[单片机]
STM32 多个定时器PWM波输出频率不同。
问题:STM32F4芯片,TIM1,TIM2,TIM3,TIM4输出PWM波,相同设置参数下TIM1频率是其他定时器两倍。 原因:因为TIM1和TIM8的内部时钟源总线与其他定时器不同,APB1与APB2的最高频率不同,正好相差一倍。
[单片机]
如何有效地使用串口通讯接收数据
引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口中断,在中断中读取数据就行了! 中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了? 同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了! 这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢? DMA简介 题外话:其实,上面的问题是很有必要思考一下的,不断思考,才能进步。 什么是DMA DMA :全称Direct Memory Access,即直接存储器访问
[单片机]
如何有效地使用串口通讯接收数据
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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