历史上的今天
今天是: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--;
}
}
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 非常翔实、全面的四篇文档,没有比这更详细的。好好阅读,一切尽在掌握! 几乎在所有的总线接口中,最重要的参数就是时序。对于初学者,不应仅满足于器件的连接和编程。需要掌握总线接口时序 ...… 查看全部问答> |
|
1 引言 USB接口以其数据传输快、连接简单、易于扩展、支持热插拔等特点已成为外设与PC通信的主要方式之一。随着嵌入式系统的发展,嵌入式微处理器需增加通用的USB接口,以便实现与PC等USB主机系统的通信。针对这样的需求,这里采用PHILIPS公司的USB ...… 查看全部问答> |
|
只需到TI的网站填写调查问卷,就有机会获得免费的MSP430开发板,赶快行动吧 能以 8 位产品价格实现 16 位出色性能与超低功耗的 Value Line 系列 MSP430™ 处理器,可帮助您轻松启动设计,真正做到以更少投 ...… 查看全部问答> |
|
请问从事硬件设计(非电子设计,就是主要不是搞vlsi),应该有什么样的基础,请详细说明 我是一个初学者,我的师兄在大唐电信工作 他本科是学计算机科学与技术的 他研究生学习的是计算机控制技术 他做过汽车电子的项目 他做过嵌入式系统 他很忙 联系不上他 所以问大家 作为硬件工程师 需要那些 ...… 查看全部问答> |
|
我第一次接触GPRS模块 不知道怎么选择模块 应该考虑哪些问题。 现在我所知道的是我主要需要用这个模块进行短信服务,需要内嵌TCP/IP协议的模块,希望高手能给我指教。 同时我想知道有什么资料能让我对GPRS模块有个更快的了解呢? 谢谢!!!!! ...… 查看全部问答> |
|
我想在SmartARM2200开发板上实现XML格式的数据传输.当然,就要求能解析XML数据,找了很多资料,实在是不知道怎么下手. 从网上下了ADS下来,本想在开发板: 在uCOS-II系统下 实现 TCP通讯实验 这个例子里面直接加入XML数据的解析函数就可以了.但是找了很 ...… 查看全部问答> |
|
任意一台带RS485口输出的PLC,使用同一端口连接两台触摸屏,如何实现? 现在的触摸屏都有“多屏一机”的功能,一台触摸屏做主机,另一台做从机。 主触摸屏一个485口连接PLC,主触摸屏再用以太网口或者串口连接另一台从触摸屏。一般触摸屏 ...… 查看全部问答> |




