STM32中,systick具体延时时间计算

发布者:asd999ddd最新更新时间:2018-07-20 来源: eefocus关键字:STM32  systick  延时时间 手机看文章 扫描二维码
随时随地手机看文章

/****************************************************************************
*  STM32单片机SysTick系统滴答定时器实验程序
*
*
*
*****************************************************************************/
#ifndef                _SYSTICK_H
#define                 _SYSTICK_H
#include "SysTick.h"
#define    SYSTICK_CSR   (*((volatile unsigned long *) 0xE000E010))//控制寄存器
#define    SYSTICK_LOAD  (*((volatile unsigned long *) 0xE000E014))//重载寄存器
#define    SYSTICK_VAL   (*((volatile unsigned long *) 0xE000E018))//当前值寄存器
#define    SYSTICK_CALRB (*((volatile unsigned long *) 0xE000E01C)) //校准值寄存器
unsigned long SysTick_Delay;//全局变量
//配置寄存器
void SysTick_InitStructReadCmd(void)
{
SYSTICK_VAL = 0;  //当前值寄存器清零
SYSTICK_LOAD = SystemCoreClock / 1000000; //重要部分就在这里  系统72000000 / 100000
SYSTICK_CSR |= 0x06;   //先关闭SysTick使能用的时候在打开
}
//中断服务程序
void SysTick_Hangler(void)
{
SYSTICK_VAL = 0;     //当前值寄存器清零
if(SysTick_Delay != 0x00)//判断延时SysTick_Delay 是否等于0
{
SysTick_Delay--;//减到0结束
}

//延时函数
void Delay_10us(unsigned long Countlinef)
{
SYSTICK_CSR |= 0x07;  //启动SysTick使能
SysTick_Delay = Countlinef;  //把延时变量赋值SysTick_Delay全局变量
while(SysTick_Delay != 0);  //判断延时时间是否到
SYSTICK_CSR |= 0x06;  //时间到关闭 SysTick使能用的时候在打开
}
int main(void)
{
SystemInit(); //注意这么是把系统时钟设初始化为 72M主频,这里是必须的
SysTick_InitStructReadCmd();
while(1)
{
GPIOD->BSRR = 0x00000100;
Delay_10us(1000000)  ; //实现1ms延时
GPIOD->BRR  = 0x00000100;
}
}
//====================================END=============================================//
/*   好了我们开始讲解程序1us是怎么实现的,我们使用时钟源为APB时钟,APB系统频率陪配置为72MHZ
     SYSTICK_LOAD = SystemCoreClock / 1000000; SysTick重载初值重要的地方就在这里
1:SystemCoreClock 这个是什么意思,跟踪库函数找到如下:
    #ifdef SYSCLK_FREQ_HSE
        uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;       
        #elif defined SYSCLK_FREQ_24MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;     
        #elif defined SYSCLK_FREQ_36MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;       
        #elif defined SYSCLK_FREQ_48MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;       
        #elif defined SYSCLK_FREQ_56MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        
        #elif defined SYSCLK_FREQ_72MHz
        uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        
        #else /*!< HSI Selected as System Clock source */
//     uint32_t SystemCoreClock         = HSI_VALUE;     
/*这里不难看出,我们初始化SystemInit(); 是系统已经把SystemCoreClock配置成72M下面就不难理解了,
               先看一下计算公式:T = TICKS * (1/f);  
               T : 为要计时的总时间。
               TICKS :为SYSTICK_LOAD 的输入参数。
   (1/f)为使用时钟源的时钟周期,f为时钟源的时钟频率
   使用时钟源为AHB时钟, 频率被配置72M;
   把SYSTICK_LOAD重载寄存器赋值为 SystemCoreClock / 1000000;呵呵呵大家
   发现了什么,就是72000000 / 1000000 = 72;大家都应该知道了72个时钟周期
   中断一次,大家接着看(1/f)是时钟周期的时间。1/72M = 0.13888888888888888888888888888889;
   1us诞生了,0.13888888888888888888888888888889*72 = 1;1us哈哈哈大家明白了吧。
  //野火资料出问题的地方 ticks=SystemFrequency / 10 000 =720,相当于:72000000 / 10000 ;这里少了一个0  结果等于 = 7200 不等于720看资料看的纠结哈哈哈。
这个程序折磨我1个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。
    
*/

//讲得简单易懂,当然精确定时还是要定时器的


关键字:STM32  systick  延时时间 引用地址:STM32中,systick具体延时时间计算

上一篇:使用SysTick的普通计数模式对延迟进行管理
下一篇:STM32 在RVMDK下简单延时计算

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

STM32复习笔记(十)LCD的介绍和使用方法
一、TFTLCD驱动原理-TFTLCD简介: (1)介绍TFTLCD: TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 TFTLCD具有:亮度好、对比度高、层次感强、颜色鲜艳等特点。是目前最主流的LCD显示器。广泛应用于电视、手机、电脑、平板等各种电子产品。 (2)2.8寸 TFTLCD接口说明(16位80并口): (3)TFTLCD 16位80并口驱动简介: (4)ILI9341 驱动时序: 重点时序: 读ID低电平
[单片机]
<font color='red'>STM32</font>复习笔记(十)LCD的介绍和使用方法
STM32 ADC 多通道16路电压采集
下面介绍一种利用STM32单片机制作的16路多通道ADC采集电路图和源程序。采用USB接口与电脑连接,实则USB转串口方式,所以上位机可以用串口作为接口。电路图中利用LM324作为电压跟随器,起到保护单片机引脚的作用。直接在电脑USB取点,省去外接电源麻烦,实测耗电电流不到20ma. 1.主控电路图: 2. USB转串口电路图 3.LM324电压跟随器电路图 4.滤波电路图 5.16路接口电路图 6.电源电路图 7.16路ADC初始化程序: void Adc_Init(void) { //先初始化IO口 RCC- APB2ENR|=0X7 2; //使能PORTA\PORAB\PORTC口
[单片机]
<font color='red'>STM32</font> ADC 多通道16路电压采集
STM32捕获/比较通道
每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器),包括捕获的输入部分(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。 输入:数字滤波、多路复用和预分频器 输出:比较器和输出控制 在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。 在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较。 输出比较模式的配置步骤: 1. 选择计数器时钟(内部,外部,预分频器) 2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中 3. 如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。 4. 选择输出模式,例如
[单片机]
STM32外部中断测试
环境: 主机:WIN7 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: STM32有20个外部中断线,其中EXTI0-EXTI15给I/O端口使用 EXTI线16连接到PVD输出 EXTI线17连接到RTC闹钟事件 EXTI线18连接到USB唤醒事件 EXTI线19连接到以太网唤醒事件(只适用于互联型产品) 源代码: 初始化: //打开NTRX外部中断 void open_ntrx_irq(void) { //定义中断结构体 NVIC_InitTypeDef NVIC_InitStructure ; //定义外部中断结构体 EXTI_InitTypeDe
[单片机]
<font color='red'>STM32</font>外部中断测试
基于STM32应用的FreeRTOS中断设置
一、FreeRTOS中断设置介绍 FreeRTOSConfig.h中定义了两个宏,分别是: configKERNEL_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY ​configKERNEL_INTERRUPT_PRIORITY用来设置RTOS内核自己的中断优先级。因为RTOS内核中断不允许抢占用户使用的中断,因此这个宏一般定义为硬件最低优先级。 configMAX_SYSCALL_INTERRUPT_PRIORITY用来设置可以在中断服务程序中安全调用FreeRTOS API函数的最高中断优先级。优先级小于等于这个宏所代表的优先级时,程序可以在
[单片机]
基于<font color='red'>STM32</font>应用的FreeRTOS中断设置
ucosii在stm32上的移植详解4
详解3中有一个问题还没解释,就是stm32f10x_it.c中已经有SysTick中断函数的定义SysTick_Handler(),为什么官方版非要弄个OS_CPU_SysTickHandler()。答案就在启动文件上,一般我们自己开发基于stm32芯片的软件,都会使用标准外设库CMSIS中提供的启动文件,而官方移植的启动文件却是自己写的,在两个文件init.s,vectors.s中(Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK)。init.s负责进入main(),vectors.s设置中断向量。OS_CPU_SysTickHandler和OS_CPU_PendSVHand
[单片机]
使用STM32点亮一颗LED实验
本次实验系统环境 Matlab版本: 2021b 系统环境 :Win10专业版 模型与原理图 simulink模型如图5.1所示,实验现象PB8以0.5S周期反转,PB9以1S周期翻转闪烁,本次实验电路原理如图5.2所示,实验所使用的下载器为STLINK 2V1版本,下载器自带一个串口,完整实验电路板如图5.3所示 图5.1 两颗LED闪烁simulink模型 图5.2 LED闪烁电路图 图5.3 实验开发板 基础模型介绍与分析 “Digital Write”模型用于控制I/O口作为普通输出用,双击模型可更改引脚编号,如图5.4所示其引脚对应STM32的PB8端口,例如想使用PA5引脚时,可通过将其改为“PA_
[单片机]
使用<font color='red'>STM32</font>点亮一颗LED实验
Cortex-M4 Systick滴答定时器
Tickclock可以实现精确延时,在K60的datasheet中没有详细将,现在我把我找到资料分享一下,关于systick在Cortex-M4中有讲到 我们大家平常在单片机开发中经常会使用到延时函数,一般的,我们会使用变量自加循环判断的方法来实现软件延时。但是, 这种方法有个弊端——延时时间不精确。 主要体现在: 1, 在C语言编写的延时函数中,每条函数语句的执行时间可能不同,这样,在实现延时的过程中,想通过增加或减少函数语 句来实现延时的增加或减小控制起来不太方便,时间的精确性当然很难控制; 2, 由于各种不同的控制器运行的主频可能不同,执行相同的延时函数所需要的的时间值可能就不同。这样,使得这种延时函 数在不同
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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