SysTick定时器

一、SysTick定时器基础知识讲解

1、是一个简单的定时器,对于ST的CM3、CM4、CM7内核芯片,都有Systick定时器

2、常用来做延时,或者定时系统的心跳时钟,这样可以节省MCU资源,不用浪费一个定时器,比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。

3、SysTick定时器就是系统滴答定时器,一个24位的到技术定时器,计到0时,将从RELOAD寄存器中自动重装定时处值,只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

4、Systick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常好15)

5、SYSTick终端的优先级也可以设置。

6、4个SysTick寄存器

*CTRL 控制和状态寄存器

对于STM32,外部时钟源是HCLK(AHB总线时钟)的1/8

                       内核时钟是HCLK时钟

配置函数 HAL_SYSTICK_CLKSourceConfig();

*LOAD 自动重载除值寄存器

24位寄存器,当倒数至零时,将被重装载的值

*VAL 当前值寄存器——从上往下计数,当前值,写它则使之清零,同时还会清除SysTick控制及状态寄存器中的COUNTFLAG标志

*CALIB 校准值寄存器

二、SYSTick相关寄存器库函数讲解

*HAL库中的Systick相关函数

HAL_SYSTICK_CLKSourceConfig(); //Systick时钟源选择

Systick_Config(uint32_t ticks); 初始化SYSTick,时钟为HCLK,并开启中断

*Systick中断服务函数: void SysTick_Handler(void)

三、delay延时函数讲解(SysTick应用)

在STM32F429IGT6微控制器上,HCLK(High Clock,高频时钟)速率是180MHz。如果你需要初始化System Timer(SysTick)以利用这个时钟频率,你可以编写如下的`SysTick_Init`函数,假设你已经包含了必要的头文件并设置了SysTick预设计数值(prescaler): ```c #include "stm32f4xx_hal.h" void SysTick_Init(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; // 获取系统时钟源配置寄存器 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSI; RCC_OscInitStruct.HSEState = RCC_HSE_ON; // 启动HSI振荡器 RCC_OscInitStruct.LSIState = RCC_LSI_ON; // 启动LSI振荡器作为低频时钟源 // 根据HCLK频率配置HSI分频系数 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = (180000000 / SystemCoreClock); // 计算HSI分频系数,目标是180MHz RCC_OscInitStruct.PLL.PLLN = RCC_PLLN_VALUE; // 根据实际手册配置PLLN值 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 分频因子 RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; // 另外一个分频因子 if HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK { while(1); // 如果配置失败,进入无限循环处理错误 } // 选择HCLK频率 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 使用PLL时钟作为系统时钟源 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // HCLK保持180MHz RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1时钟频率调整 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2时钟频率调整 if HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK { while(1); // 处理时钟配置错误 } // 初始化SysTick,通常系统时钟会被自动映射到SysTick的计数器 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()); // 设置SysTick的频率为HCLK频率 // 开启SysTick HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); HAL_EnableIT(SysTick_IRQn); // 开启SysTick中断 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值