文章目录[隐藏]
SysTick-系统定时器
一、 外设的原理及功能介绍
1.1 特性介绍
- SysTick系统定时器是属于Cortex-M内核中的一个外设,内嵌在NVIC中。
- SysTick系统定时器含有一个计数宽度为24Bit(0xFFFFFF,0~1677216)的向下递减(工作模式)的自动重装载计数器,计数器每计数一次的时间为1/CLKSource(工作周期,F103为72Mhz,就是1/72Mhz)。一般我们设置CLKSource为系统时钟。以F103为例,CLKSource可以配置为72Mhz。
- 当重装载值寄存器的值递减到0的时候,SysTick系统定时器可以配置产生一次中断,以此循环往复。
- SysTick系统定时器是属于Cortex-M内核的外设,所以一般基于Cortex-M内核的单片机都具有这个系统定时器。这使得软件在Cortex-M单片机中可以很容易得移植。
1.2 SysTick定时器的功能
- SysTick系统定时器可以用于操作系统,用于产生时基,维持操作系统的心跳。一般操作系统都需要一个时基,进行任务的调度、同步等功能实现。
- SysTick系统定时器最常用的功能,还是计数。比如用来进行微妙、毫秒延时,以此产生特定时序。
1.3 SysTick定时器寄存介绍
二、代码实现延时函数
2.1 在我们定义文件中
static __IO uint32_t TimingDelay;
/**
* @brief 启动系统滴答定时器 SysTick
* @param 无
* @retval 无
*/
void SysTick_Init()
{
/* SystemFrequency/1000 1ms中断一次
* SystemFrequency/100000 10us中断一次
* SystemFrequency/1000000 1us中断一次
*/
if(HAL_SYSTICK_Config(SystemCoreClock/100000))
{
while(1);
}
}
/**
* @brief us延时程序,10us作为一个单位
* @param
* @arg nTime:Delay_us(1) 则实现的延时为1*10us=10us
* @retval 无
*/
void Delay_us(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
/**
* @brief 获取节拍程序
* @param 无
* @retval 无
* @attention 在 SysTick 中断函数 SysTick_Handler()调用
*/
void TimingDelay_Decrment()
{
if(TimingDelay != 0x00)
{
TimingDelay--;
}
}
我们在stm32f1xx_it.c中,把文件TimingDelay_Decrment();函数放到滴答定时器中断中。
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
TimingDelay_Decrment();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
版权声明:本文为CSDN博主「丶Syllable」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45683123/article/details/121954601
暂无评论