STM32F4(用SysTick实现Delay函数)

发布者:骄阳少年最新更新时间:2018-04-23 来源: eefocus关键字:STM32F4  SysTick  Delay函数 手机看文章 扫描二维码
随时随地手机看文章

1,开发环境


      1,适用芯片:STM32F4全部芯片


      2,固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0


      3,IDE:MDK517



2,驱动源码


      Delay.h文件


/**************************************************************** 

 * Copyright (C) 2016, XinLi, all right reserved. 

 * File name:    Delay.h 

 * Date:         2016.03.22 

 * Description:  Delay Driver 

*****************************************************************/  

  

#ifndef __DELAY_H  

#define __DELAY_H  

  

/**************************************************************** 

 *                        Header include 

*****************************************************************/  

#include "stm32f4xx.h"  

  

/**************************************************************** 

 *                       Macro definition 

*****************************************************************/  

  

  

/**************************************************************** 

 *                       Type definition 

*****************************************************************/  

  

  

/**************************************************************** 

 *                     Structure definition 

*****************************************************************/  

  

  

  

#ifdef __cplusplus  

 extern "C" {  

#endif  /* __cplusplus */  

  

/**************************************************************** 

 *                     Variable declaration 

*****************************************************************/  

  

  

/**************************************************************** 

 *                     Function declaration 

*****************************************************************/  

void Delay_us(uint64_t nus);  

void Delay_ms(uint64_t nms);  

void Delay_s(uint64_t ns);  

  

#ifdef __cplusplus  

}  

#endif  /* __cplusplus */  

  

#endif  /* __DELAY_H */  


      Delay.c文件



/**************************************************************** 

 * Copyright (C) 2016, XinLi, all right reserved. 

 * File name:    Delay.c 

 * Date:         2016.03.22 

 * Description:  Delay Driver 

*****************************************************************/  

  

/**************************************************************** 

 *                        Header include 

*****************************************************************/  

#include "Delay.h"  

  

/**************************************************************** 

 *                       Global variables 

*****************************************************************/  

  

  

/**************************************************************** 

 *                     Function declaration 

*****************************************************************/  

static void Delay_Init(void);  

  

/**************************************************************** 

 *                     Function definition 

*****************************************************************/  

  

/**************************************************************** 

 * Function:    Delay_Init 

 * Description: Delay Configuration. 

 * Input: 

 * Output: 

 * Return: 

*****************************************************************/  

static void Delay_Init(void)  

{  

  static uint8_t first = 0;  

    

  if(first == 0)  

  {  

    first = 1;  

      

    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);  

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Disability SysTick counter */  

  }  

}  

  

/**************************************************************** 

 * Function:    Delay_us 

 * Description: Microsecond delay. 

 * Input:       nus 

 * Output: 

 * Return: 

*****************************************************************/  

void Delay_us(uint64_t nus)  

{  

  uint32_t temp = 0;  

  uint64_t nms = 0;  

    

  Delay_Init();  

    

  if(nus == 0)  

  {  

    return;  

  }  

    

  nms = nus / 1000;  

  nus = nus % 1000;  

    

  if(nms > 0)  

  {  

    Delay_ms(nms);  

  }  

  

  if(nus > 0)  

  {  

    SysTick->LOAD = SystemCoreClock / 8000000 * nus;  /* Time load (SysTick-> LOAD is 24bit) */  

    SysTick->VAL = 0x000000;                          /* Empty counter */  

    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;         /* Start the countdown */  

  

    do  

    {  

      temp = SysTick->CTRL;  

    }  

    while(temp&0x01 && !(temp&(1<<16)));        /* Wait time is reached */  

  

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Close Counter */  

    SysTick->VAL = 0x000000;                    /* Empty counter */  

  }  

}  

  

/**************************************************************** 

 * Function:    Delay_ms 

 * Description: Millisecond delay. 

 * Input:       nms 

 * Output: 

 * Return: 

*****************************************************************/  

void Delay_ms(uint64_t nms)  

{  

  uint32_t temp = 0;  

    

  Delay_Init();  

    

  if(nms == 0)  

  {  

    return;  

  }  

    

  while(nms > 500)  

  {  

    SysTick->LOAD = SystemCoreClock / 8000 * 500; /* Time load (SysTick-> LOAD is 24bit) */  

    SysTick->VAL = 0x000000;                      /* Empty counter */  

    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;     /* Start the countdown */  

  

    do  

    {  

      temp = SysTick->CTRL;  

    }  

    while(temp&0x01 && !(temp&(1<<16)));        /* Wait time is reached */  

  

    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Close Counter */  

    SysTick->VAL = 0x000000;                    /* Empty counter */  

      

    nms -= 500;  

  }  

    

  SysTick->LOAD = SystemCoreClock / 8000 * nms; /* Time load (SysTick-> LOAD is 24bit) */  

  SysTick->VAL = 0x000000;                      /* Empty counter */  

  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;     /* Start the countdown */  

  

  do  

  {  

    temp = SysTick->CTRL;  

  }  

  while(temp&0x01 && !(temp&(1<<16)));        /* Wait time is reached */  

  

  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  /* Close Counter */  

  SysTick->VAL = 0x000000;                    /* Empty counter */  

}  

  

/**************************************************************** 

 * Function:    Delay_s 

 * Description: Second delay. 

 * Input:       ns 

 * Output: 

 * Return: 

*****************************************************************/  

void Delay_s(uint64_t ns)  

{  

  while(ns > 0)  

  {  

    Delay_ms(1000);  

    ns--;  

  }  

}  


关键字:STM32F4  SysTick  Delay函数 引用地址:STM32F4(用SysTick实现Delay函数)

上一篇:STM32CubeMX处理UTF-8编码中文注释存在的问题及解决方法
下一篇:STM32精确延时(非中断,非ST库函数)

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

STM32F4——串口(USART)通信总结
一、概述: USART即通用同步异步收发器,用于灵活的与外部设备全双工数据交换,它支持多种通信传输方式,可以通过小数波特率发生器提供多种波特率。 二、串口IO: 对于STM32F407有6个串口,对于每个串口对应的IO可以从芯片原理图中对应找到,对于其串口1,对应的IO为PA9/PB6端口对应串口1的发送端,PA10/PB7端口对应串口1的接收端。 三、通信参数: 对于数据的传输需要设定好相关的数据传输协议,因此必要的参数设定是有必要的,其中包括:起始位、数据位(8位或9位)、奇偶校验位(开启与否)、停止位(1、1.5、2位)、波特率设定。 四、相关寄存器: 其中相关寄存器有:状态寄存器、数据寄存器、波特率寄存器、
[单片机]
STM32开发 -- Systick定时器
一、Systick定时器介绍 参看:STM32菜鸟成长记录—系统滴答定时器(systick)应用 参看:SysTick定时器和delay延迟函数 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号: 15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。例如,为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 **优点: **节省
[单片机]
STM32开发 -- <font color='red'>Systick</font>定时器
STM32F4_ USART配置及细节描述
Ⅰ、概述 关于USART串口通信,可以说是MCU的标配。不管是在实际项目应用中,还是在开发过程中,它都起着很重要的作用。 在项目应用中我们常常使用UART串口进行通信,根据通信的距离及稳定性,还选择添加RS232、RS485等对UART数据进行转换。 在开发过程中,我们常常用它来打印调试信息,我们购买的开发板基本上都有一个UART通信接口(DB9的接头),这个接口主要的一个作用就是用来开发时调试使用。 本文主要针对STM32初学者,使用STM32F4标准外设库、Keil集成IDE,对STM32F4的USART进行配置及描述。1.详细描述使用自定义打印数据、自定义中断接收数据;2.重定义打印数据printf; Ⅱ、实例工程下载
[单片机]
<font color='red'>STM32F4</font>_ USART配置及细节描述
stm32f429三通道ADC配置
static void Rheostat_ADC_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure;//2.3.4 // ʹÄÜ GPIO ʱÖÓ RCC_AHB1PeriphClockCmd(RHEOSTAT_ADC_GPIO_CLK, ENABLE); // RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); // ÅäÖà IO PA0 GPIO_InitStructure.GPIO_Pin = RHEOSTAT_ADC_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = G
[单片机]
MSP432库函数学习笔记-SysTick
1,SysTick计数器使能相关 void SysTick_enableModule(void); //启动SysTick计数器 //! This function stops the SysTick counter. If an interrupt handler has been //! registered, it is not called until SysTick is restarted. void SysTick_disableModule(void); //关闭SysTick计数器 此函数会导致(重新)启动SysTick计数器,但此函数并不会重置计数器的值,会从当前值开始计算,不会重载为上一次调用SysTic
[单片机]
STM32系列第5篇--Systick滴答定时器
Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。 Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。 S
[单片机]
STM32F4xx官方IAP源码
单片机源程序如下: /* Includes ------------------------------------------------------------------*/ #include menu.h #include stm324xg_eval.h /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -----
[单片机]
STM32F4——NVIC中断优先级及外部中断
NVIC中断优先级 一、简介: CM4内核可以支持256个中断,包括16个内核中断和240个外部中断,256级的可编程中断设置。对于STM32F4没有用到CM4内核的所有东西,只是用到了一部分,对于STM32F40和41系列共有92个中断,其中有10个内核中断和82个可屏蔽中断,常用的为82个可屏蔽中断。 二、相关寄存器: ISER 中断使能寄存器组,用来使能中断,每一位控制一个中断,由于上面已经说明了控制82个可屏蔽的中断,因此利用ISER 这三个32位寄存器就够了。一下的几个寄存器同理。 ICER 中断除能寄存器组,用来消除中断。 ISPR 中断挂起控制寄存器组,用来挂起中断。 ICPR 中断解挂
[单片机]
<font color='red'>STM32F4</font>——NVIC中断优先级及外部中断
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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