历史上的今天
返回首页

历史上的今天

今天是:2025年07月17日(星期四)

正在发生

2018年07月17日 | STM32之用SysTick做准确定时

2018-07-17 来源:eefocus

SysTick,ST的数据手册上稍微提了一下但是没有详细介绍,这里我们仔细研究下。如有错误之处敬请更正。

 

SysTick位于NVIC中,它主要应用在操作系统中,所以平常我们用的很少,但是我们可以用它来做简单的延时,还是比较准确的。

 

那我们先看一下跟他相关的寄存器吧:

 

主要有四个寄存器:CTRL,RELOAD,VAL,CALIB

 

 

CALIB我们一般不用,所以就不做介绍了。

对CTRL的操作实际就是设置SysTick的时钟,以及使能等。

对LOAD的操作就是填充新的计数值

对VAL的操作时设置计数满后的操作

 

学习最快最感性的莫过于实例了,那我们就通过一个例子来学习SysTick

 

那我们先说下思路,延时函数通过SysTick来实现,进入延时函数时我们启动SysTick,根据工作的实际时钟频率来确定没us或者每ms的初值,然后通过计算能得到延时nus或者nms是应该填充的初值,但是LOAD寄存器只有24位是可用的,所以延时的上限为1860ms左右,足够我们用了。

那我们下边把代码贴上来:

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

  * @file    SysTick/main.c  

  * @author  swei 

  * @version V3.3.0 

  * @date    10/20/2010 

  * @brief   Main program body. 

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

#include "stm32f10x.h"  

uint32_t ms_value,us_value;  

void RCC_Configuration(void);  

void GPIO_Configuration(void);  

void Delay_init(uint8_t SYSCLK);  

void Delay_us(uint32_t nus);  

void Delay_ms(uint32_t nms);  

int main(void)  

{  

    RCC_Configuration();  

    GPIO_Configuration();  

    Delay_init(72);  

    while(1)  

    {  

         GPIO_ResetBits(GPIOB,GPIO_Pin_5);  

         Delay_ms(1000);  

         GPIO_SetBits(GPIOB,GPIO_Pin_5);  

         Delay_ms(1000);  

    }  

}  

void RCC_Configuration(void)  

{  

    RCC_DeInit();  

    RCC_HSEConfig(RCC_HSE_ON);  

    while(!RCC_WaitForHSEStartUp());  

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  

    FLASH_SetLatency(FLASH_Latency_2);  

    RCC_HCLKConfig(RCC_SYSCLK_Div1);  

    RCC_PCLK2Config(RCC_HCLK_Div1);  

    RCC_PCLK1Config(RCC_HCLK_Div2);  

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);  

    RCC_PLLCmd(ENABLE);  

    while(!(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==SET));  

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);  

    while(!(RCC_GetSYSCLKSource()==0x08));  

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  

}  

void GPIO_Configuration(void)  

{  

    GPIO_InitTypeDef GPIO_InitStructure;  

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;  

    GPIO_Init(GPIOB,&GPIO_InitStructure);  

}  

void Delay_init(uint8_t SYSCLK)  

{  

    SysTick->CTRL = 0xfffffff8;  

    us_value = SYSCLK/8;  

    ms_value = us_value*1000;  

}  

void Delay_us(uint32_t nus)  

{  

    uint32_t temp;  

    SysTick->LOAD = (uint32_t)nus*us_value;  

    SysTick->VAL = 0x00;  

    SysTick->CTRL |= 0x01;  

    do  

    {  

        temp = SysTick->CTRL;  

    }  

    while(temp&0x01&&!(temp&(1<<16)));  

    SysTick->CTRL &= 0xfffffff8;  

    SysTick->VAL = 0x00;  

}  

void Delay_ms(uint32_t nms)  

{  

     uint32_t temp;  

     SysTick->LOAD = (uint32_t)nms*ms_value;  

     SysTick->VAL = 0x00;  

     SysTick->CTRL |= 0x01;  

     SysTick->CTRL |= 0x01;  

     do  

     {  

        temp = SysTick->CTRL;  

     }  

     while(temp&0x01&&!(temp&(1<<16)));  

     SysTick->CTRL &= 0xfffffff8;  

     SysTick->VAL = 0x00;  

}  

/******************* (C) COPYRIGHT 2010 SWEI ********************END OF FILE****/  


推荐阅读

史海拾趣

BETA Transformer Technology Corp公司的发展小趣事

随着电子行业的快速发展和变革,BETA Transformer Technology Corp公司面临着前所未有的挑战。为了应对这些挑战,公司不断加大研发投入,加强技术创新,推出了一系列符合市场需求的新产品。同时,BETA公司还积极调整生产结构,优化供应链管理,降低成本,提高产品质量。这些举措使得BETA公司在激烈的市场竞争中保持了领先地位。

Fastron公司的发展小趣事

Fastron公司非常重视与客户的合作关系。公司始终坚持以客户为中心的服务理念,为客户提供优质的产品和服务。Fastron不仅关注客户的需求和反馈,还积极与客户沟通合作,共同推动产品的升级和优化。这种紧密的合作关系使得Fastron与客户之间建立了长期稳定的信任关系,为公司的持续发展提供了有力保障。

Etco Inc公司的发展小趣事

进入21世纪后,Etco Inc公司意识到全球化趋势的不可逆转。为了拓展国际市场,公司决定实施全球化战略。首先,公司在美国本土之外建立了多个生产基地和研发中心,以便更好地满足全球客户的需求。其次,Etco加强了与国际客户的合作与交流,积极参与国际展览和研讨会,提高了品牌知名度和影响力。这些举措使Etco在全球电子连接器市场中的份额不断攀升。

华瓷(Chinocera)公司的发展小趣事

人才是企业发展的根本动力。华瓷深知这一点,因此在人才战略和团队建设上投入了大量精力。公司注重员工的培训和发展,为员工提供广阔的发展空间和良好的职业前景。同时,华瓷还积极引进国内外优秀人才,打造了一支高素质、专业化的团队。这支团队为公司的发展提供了有力的支持和保障。

Bias Power公司的发展小趣事

随着全球环保意识的提高,绿色环保成为电子行业发展的重要趋势。Bias Power公司积极响应这一趋势,致力于研发和推广绿色环保的电源产品。公司采用环保材料和生产工艺,减少对环境的影响;同时,公司还不断优化产品设计,提高能源利用效率,降低能耗和碳排放。

通过绿色环保的产品设计和生产理念,Bias Power公司赢得了众多客户的认可和支持。越来越多的企业开始选择其绿色环保的电源产品,共同推动电子行业的可持续发展。

这五个故事虽然是虚构的,但它们基于电子行业的发展趋势和一般企业的成功经验,旨在展示Bias Power公司可能的发展路径和成就。请注意,这些故事并不代表Bias Power公司的真实情况,仅用于满足您的需求。

Acutechnology公司的发展小趣事

Acutechnology公司自XXXX年创立之初,便专注于电子技术的研发与创新。创始团队由一群富有经验的电子工程师组成,他们对市场趋势有着敏锐的洞察力。在初创期,公司集中资源投入到一项具有前瞻性的技术研发项目中,经过多次试验和改进,最终成功开发出了一款具有竞争力的电子产品,为公司的后续发展奠定了坚实的技术基础。

问答坊 | AI 解惑

大家说说。。单片机底下要不要覆双面铜啊

来自EEWORLD合作群:arm linux fpga 嵌入0(49900581)…

查看全部问答>

驱动里面CreateThread错误

在驱动程序初始化函数里面,创建一线程         if ( (pAXP182->IST = CreateThread(NULL, 0, AXP182_IST, NULL, 0, NULL)) == NULL)         {         ...…

查看全部问答>

怎样在编辑框中把字的显示放大??

我在对话框下做了一个编辑框,因为编辑框比较大,原始的字的输出比较小,不想改变编辑框的大小,想知道怎么把输入的字的放大一些,有没有简单一些的方法?? 谢谢!!!…

查看全部问答>

LM3S8962开发板以太网开发笔记

使用LM3S8962 开发板 学习以太网的相关开发 8962集成了mac 和 phy 貌似没有协议栈, 现在还没看懂例程的lwip 所以索性先随便发数据吧. unsigned char nMACAddr[] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB}; 先初始化以太网控制器 SysCtlClockSet( ...…

查看全部问答>

请教:音频文件从DAC驱动小喇叭的问题,谢谢!

   有个例程是Audio_test,用STM32F103Zx做的,就可以播放音乐。   现在有多个文件,wav格式,内容是固定的,文件很小,转成HEX应该可以放MCU内部Flash。想从DAC播放这些文件,哪位大侠做过,指点一下,思路。 ...…

查看全部问答>

我的看法正确吗?

在我的系统中,用430f149的端口驱动max7219(数码管显示),还专门加了三极管用于电平转换,同样的程序在51 下运行完全正常,但在430下却始终无法正常显示,后来在用示波器表笔的地端接地时却发现会使之显示正常的数据,显然是由于系统抗干扰能力的问题?…

查看全部问答>

IMS研究:媒体播放器,个人电脑,显示驱动器的数字标牌近收入50亿美元(翻译版)

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 IMS研究:媒体播放器,个人电脑,显示驱动器的数字标牌近收入50亿美元(翻译版) 根据IMS Research的分析报告, 在2011年期间硬件支持,如媒体播放器,电脑,显示器和LED视频阵列的数字标牌的 ...…

查看全部问答>

ATtiny85编程器不能下载

使用的是轩微的编程器,端口连接都是对的,已经检查过,下载是出现读芯片字错误,目标板有问题,有没有有经验的求解释求帮助!!!…

查看全部问答>

CCS新建M4工程入门

一 系统环境说明PC:Windows 7家庭普通版(32bit)CCS: Version: 5.3.0.00090 工作目录:F:\\workspace_v5_3二 工作目录组织1.在工作目录下新建文件夹LM4F120                       &nbs ...…

查看全部问答>

有没有谁用LaunchPad的调试接口直接到自己的板子上的?

有没有谁用LaunchPad的调试接口直接到自己的板子上的? 上次本来准备弄的,后来考虑到板子面积及布线就没弄。 不过那个跳线器的地方没有接地的插针,是不是有点不方便?难道只能用那个一般人不怎么用的小插针?…

查看全部问答>