第一范文网 - 专业文章范例文档资料分享平台

Systick 定时器

来源:用户分享 时间:2025/5/24 11:56:26 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

#define SysTick_CTRL_COUNTFLAG_Msk (1ul << SysTick_CTRL_COUNTFLAG_Pos) 定义CLKSOURCE在SysTick_CTRL寄存器中的位置 #define SysTick_CTRL_CLKSOURCE_Pos 2

#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos)

定义TICKINT在SysTick_CTRL寄存器中的位置 SysTick 倒数到 0 时会导致挂

起Systick处理器

#define SysTick_CTRL_TICKINT_Pos 1

#define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos) 定义ENABLE在SysTick_CTRL寄存器中的位置 使能Systick定时器 #define SysTick_CTRL_ENABLE_Pos 0

#define SysTick_CTRL_ENABLE_Msk (1ul << SysTick_CTRL_ENABLE_Pos) /* SysTick Reload Register Definitions SysTick_LOAD =0xFFFFFF */ #define SysTick_LOAD_RELOAD_Pos 0

#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul << SysTick_LOAD_RELOAD_Pos) /* SysTick Current Register Definitions SysTick_VAL=0xFFFFFF */ #define SysTick_VAL_CURRENT_Pos 0

#define SysTick_VAL_CURRENT_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos) Initialize and start the SysTick counter and its interrupt. static __INLINE uint32_t SysTick_Config(uint32_t ticks) {

if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */

/* set Priority for Cortex-M0 System Interrupts */

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);

SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | /*选择内核时钟*/ SysTick_CTRL_TICKINT_Msk | /* Enable SysTick IRQ*/ SysTick_CTRL_ENABLE_Msk; /*Enable SysTick Timer */ return (0); /* Function successful */ }

通过设置SysTick_CTRL寄存器中的TICKINT位为1,SysTick 倒数到 0 时会导致挂起Systick处理器。

本例中HSE晶振为25MHZ void rcc_configuration(void) {

RCC_DeInit(); /*reset rcc regsiter to default*/

RCC_HSEConfig(RCC_HSE_ON); /* turn on hse*/

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET); /*wait until hse ready*/

RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE,2); /*config PREDIV1 division */

/*config pllclk :fpllclk=12.5x4=50mhz */

RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_4);

RCC_HCLKConfig(RCC_SYSCLK_Div1); /*config hclk:fhclk=fsysclk */ RCC_PCLK2Config(RCC_HCLK_Div1);

/*config pclk2:fpclk2=fhclk=fsysclk */

RCC_PCLK1Config(RCC_HCLK_Div2); /*config pclk1:fpclk1=fhclk/2=25mhz */ FLASH_SetLatency(FLASH_Latency_2); /* FLASH Prefetch Buffer Enable*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); RCC_PLLCmd(ENABLE); /* enanle plllclk*//*最后使能pllclk*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);/*wait untill pllclk ready */ RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*fpllclk=12.5x4=50mhz */ while(RCC_GetSYSCLKSource() !=0x08); /*wait untill pllclk used as sysclk*/ RCC_ClockSecuritySystemCmd(ENABLE); /* enable sysclk security*/ RCC_MCOConfig(RCC_MCO_SYSCLK); /* mco output sysclk */ }

以上为我自己写的配置时钟程序,有不对之处欢迎批评指正! 利用systick定时器做的ms级延时程序

在 STM32 的应用中,使用 Cortex-M3 内核的 SysTick 作为定时时钟,设定 每一毫秒产生一次中断,在中断处理函数里对 N 减一,在 Delay(N) 函数中循环检 测 N 是否为 0,不为 0 则进行循环等待;若为 0 则关闭 SysTick 时钟,退出函数。 void delay_ms(vu32 ntime) {

TimingDelay=ntime;

/* FLASH Two Latency cycles*/

/*systick定时器时钟源为hclk=50MHZ*/

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* Initialize and start the SysTick counter and its interrupt*/ SysTick_Config(50000); /* systick定时器1ms中断一次*/ while(TimingDelay !=0); /*延时多少ms由TimingDelay的值决定*/ }

/*Systick中断处理函数*/ void SysTick_Handler(void) {

TimingDelay--; }

搜索更多关于: Systick 定时器 的文档
Systick 定时器.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c72kfe05mo20a6ri16zob_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top