历史上的今天
返回首页

历史上的今天

今天是:2025年04月23日(星期三)

正在发生

2018年04月23日 | STM32F4(用SysTick实现Delay函数)

2018-04-23 来源:eefocus

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--;  

  }  

}  



推荐阅读

史海拾趣

Dongguan Jingyue Electronics Co Ltd公司的发展小趣事

Dongguan Jingyue Electronics Co Ltd深知市场拓展的重要性。在立足本土市场的基础上,公司积极开拓国际市场,通过参加国际展会、建立海外销售渠道等方式,不断提升品牌知名度和市场份额。同时,公司还注重品牌建设,通过提升产品质量、优化售后服务等方式,增强消费者对品牌的信任感和忠诚度。

DURAKOOL公司的发展小趣事

面对日益激烈的市场竞争和不断变化的客户需求,DURAKOOL公司始终保持着对创新的追求。公司不断投入研发资源,推动产品升级和技术进步。同时,公司也关注行业趋势和未来发展,积极探索新的业务领域和市场机会。展望未来,DURAKOOL将继续致力于成为全球电子行业的领先者。

请注意,以上故事均为虚构,旨在提供与DURAKOOL公司发展相关的故事概要。如需了解更多关于DURAKOOL公司的详细信息,建议查阅相关报道或公司官方资料。

Burr-Brown公司的发展小趣事

Burr-Brown在音频领域取得了显著的成就。1957年,公司推出的Model 130成为世界上第一个固态运算放大器(op amp),这一技术在现代高级音频系统中仍占据核心地位。1982年,公司发布的16位单片数模转换器(DAC)更是彻底改变了音乐的播放和发行方式,使得音乐可以以高保真度进行复制,并方便地随身携带。Burr-Brown的技术成为优质音频的代名词,赢得了广泛的行业认可。

AD Semiconductor公司的发展小趣事

2000年,Burr-Brown被著名的美国德州仪器公司(Texas Instruments)收购,成为其高性能模拟器件部门的一部分。这一收购为Burr-Brown提供了更强大的资源和支持,使其能够继续专注于模拟器件(如ADC、DAC等)的生产和创新。在德州仪器的引领下,Burr-Brown持续保持技术领先,为全球电子行业的发展做出了重要贡献。

这五个故事共同展现了Burr-Brown公司从创立到发展壮大的历程,以及其在电子行业中的卓越成就和持续创新的精神。通过不断适应市场变化和技术进步,Burr-Brown成功地在竞争激烈的电子行业中脱颖而出,成为一家备受尊敬的企业。

EMCORE公司的发展小趣事

Burr-Brown公司,成立于1956年,初期仅有两名雇员,并得益于房地产开发商的支持。公司起初专注于制造模拟集成电路,第一年的销售总额为1600美元。创始人布朗怀揣雄心壮志,提出在一年内将厂房扩大到1200平方英尺,并期望销售收入能增长到7200美元。随着销售的稳步增长,公司不断迁往更大的设施,最终在1965年购买了附近的机场,为公司未来的成长奠定了坚实的基础。

Gold Peak Group公司的发展小趣事
控制电路的布局应合理,避免元件之间的电磁干扰和机械碰撞。

问答坊 | AI 解惑

I2C 总线规范中文资料下载

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 非常翔实、全面的四篇文档,没有比这更详细的。好好阅读,一切尽在掌握! 几乎在所有的总线接口中,最重要的参数就是时序。对于初学者,不应仅满足于器件的连接和编程。需要掌握总线接口时序 ...…

查看全部问答>

基于AVR单片机的通用USB接口模块设计

1 引言 USB接口以其数据传输快、连接简单、易于扩展、支持热插拔等特点已成为外设与PC通信的主要方式之一。随着嵌入式系统的发展,嵌入式微处理器需增加通用的USB接口,以便实现与PC等USB主机系统的通信。针对这样的需求,这里采用PHILIPS公司的USB ...…

查看全部问答>

TI开展MSP430开发版免费申请活动了,赶快参加吧

  只需到TI的网站填写调查问卷,就有机会获得免费的MSP430开发板,赶快行动吧     能以 8 位产品价格实现 16 位出色性能与超低功耗的 Value Line 系列 MSP430™ 处理器,可帮助您轻松启动设计,真正做到以更少投 ...…

查看全部问答>

请问从事硬件设计(非电子设计,就是主要不是搞vlsi),应该有什么样的基础,请详细说明

我是一个初学者,我的师兄在大唐电信工作  他本科是学计算机科学与技术的 他研究生学习的是计算机控制技术   他做过汽车电子的项目 他做过嵌入式系统 他很忙 联系不上他 所以问大家 作为硬件工程师  需要那些 ...…

查看全部问答>

keilde 问题

这是一个8*8led的扫描程序,用keil时新建保存了,在新建工程后引入,编译,就提示这个了 “文件被外部编译器改变,是否重新载入” 显示错误是 “创建目标 \'目标 1\' PA51汇编 STARTUP.A51 ... PA51汇编 saomiao.asm ... 连接 ... BL51 BANK ...…

查看全部问答>

怎样选择GPRS模块?

我第一次接触GPRS模块 不知道怎么选择模块 应该考虑哪些问题。 现在我所知道的是我主要需要用这个模块进行短信服务,需要内嵌TCP/IP协议的模块,希望高手能给我指教。 同时我想知道有什么资料能让我对GPRS模块有个更快的了解呢? 谢谢!!!!! ...…

查看全部问答>

ARM下如何实现XML解析

我想在SmartARM2200开发板上实现XML格式的数据传输.当然,就要求能解析XML数据,找了很多资料,实在是不知道怎么下手. 从网上下了ADS下来,本想在开发板: 在uCOS-II系统下 实现 TCP通讯实验 这个例子里面直接加入XML数据的解析函数就可以了.但是找了很 ...…

查看全部问答>

PL通过RS485连接两台触摸屏方法

任意一台带RS485口输出的PLC,使用同一端口连接两台触摸屏,如何实现?   现在的触摸屏都有“多屏一机”的功能,一台触摸屏做主机,另一台做从机。 主触摸屏一个485口连接PLC,主触摸屏再用以太网口或者串口连接另一台从触摸屏。一般触摸屏 ...…

查看全部问答>