STM32系统定时器SysTick
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32系统定时器SysTick相关的知识,希望对你有一定的参考价值。
摘自:stm32 系统定时器 SysTick
作者:点灯小哥
发布时间: 2021-03-10 13:46:00
网址:https://blog.csdn.net/weixin_46016743/article/details/114633245
摘自:stm32之系统定时器
作者:打酱油的;
发布时间: 2021-04-13 20:11:32
网址:https://blog.csdn.net/weixin_46098612/article/details/115669473
系统定时器原理
系统定时器相关寄存器
系统定时器的时间计算
SysTick结构体
在core_cm3.h里面
SysTick固件库函数
在core_cm3.h最下面找
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); //判断reload的值是否大于最大值 2^24
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; //配置reload寄存器的初值
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //配置中断优先级 1<<4 -1 = 16-1=15 即中断优先级是15
//内核的中断优先级要高于外设的中断优先级 数字越小 优先级越高
SysTick->VAL = 0; //配置count的值
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | //配置system时钟为 72M
SysTick_CTRL_TICKINT_Msk | //使能中断
SysTick_CTRL_ENABLE_Msk; //使能systick
return (0);
}
SysTick中断优先级
SysTick应用
1.编写一个us延时的函数
2.编写一个ms延时的函数
SysTick.c
#include "stm32f10x.h" // Device header
#include "SysTick.h"
void ms_delay(uint32_t ms)//用系统定时器设计毫秒定时器
{
uint32_t i;//次数
SysTick_Config(72000);//SysTick固件库函数 前面有讲 本质就是给重装载 Reload寄存器赋值
//我理解的有点像多线程 上面线程独立于CPU资源不断重复进行重装载定时 下面是CPU资源处理的进程进行判断
for(i=0;i<ms;i++) //定时器(计数器)一个循环就是1ms 循环多少次就是多少毫秒
{
//系统定时器只能递减 判断是否减到0就可以了 一旦减到0则CTRL寄存器第16位为1 如下图所示:
while( !( (SysTick->CTRL) &(1<<16) ) );//
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//失能 置位回去
}
void us_delay(uint32_t us)//用系统定时器设计微秒定时器
{
uint32_t i;
SysTick_Config(72);
for(i=0;i<us;i++)
{
while( !( (SysTick->CTRL) &(1<<16) ) );
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
SysTick.h
#include "stm32f10x.h"
void ms_delay(uint32_t ms);
void us_delay(uint32_t us);
main.c
#include "stm32f10x.h" // Device header
#include "usart.h"
#include "led.h"
#include "tim.h"
#include "motor.h"
#include "SysTick.h"
void delay(uint16_t time)
{
uint16_t i = 0;
while(time--)
{
i=12000;
while(i--);
}
}
int main(void)
{
LED_Init();
GPIO_SetBits( GPIOC, GPIO_Pin_13);
while(1)
{
GPIO_ResetBits( GPIOC, GPIO_Pin_13);
ms_delay(500);
GPIO_SetBits( GPIOC, GPIO_Pin_13);
ms_delay(500);
}
}
以上是关于STM32系统定时器SysTick的主要内容,如果未能解决你的问题,请参考以下文章
STM32 的系统滴答定时器( Systick) 彻底研究解读