当前位置: 首页 > news >正文

STM32F1 SysTick介绍及应用

第四章 SysTick介绍及应用

1. SysTick简介

SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。

因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

2. SysTick应用示例

2.1 SysTick中断配置及服务函数

void SysTick_Init(void)
{NVIC_SetPriority(SysTick_IRQn, 0x00); // 设置延时级最高if(SysTick_Config(SystemCoreClock / 100000)) // 10us中断一次{while(1);}
}void SysTick_Handler(void)
{if(Delay_Time != 0){Delay_Time--; // 每次SysTick中断减1}
}

2.2 延时函数

void Delay_10us(__IO uint32_t nTime)
{Delay_Time = nTime;while(Delay_Time != 0);
}void Delay_us(__IO uint32_t us)
{Delay_10us(us / 10);
}void Delay_ms(__IO uint32_t ms)
{Delay_us(ms * 1000);
}

2.3 主函数测试

#include "stm32f10x.h"
#include "led.h"
#include "SysTick.h"int main()
{BSP_LED_Init();SysTick_Init();while(1){LED_ON(RED_LED_Pin);Delay_ms(1000);LED_OFF(RED_LED_Pin);Delay_ms(1000);LED_ON(GREEN_LED_Pin);Delay_ms(1000);LED_OFF(GREEN_LED_Pin);Delay_ms(1000);}
}

3. SysTick常见函数(STD库)

3.1 核心操作函数

3.1.1 初始化SysTick
uint32_t SysTick_Config(uint32_t ticks);
  • 功能:配置 SysTick 重装载值并启动定时器

  • 参数ticks - 两次中断之间的时钟周期数

  • 返回值

    • 0:成功

    • 1:参数无效(ticks > 0xFFFFFF)

  • 示例

// 系统时钟72MHz时,配置1ms中断
if (SysTick_Config(SystemCoreClock / 1000)) {// 初始化失败处理
}
3.1.2 关闭SysTick
void SysTick->CTRL = 0;  // 直接操作寄存器关闭

3.2 寄存器级操作

3.2.1 手动配置SysTick
// 设置重装载值(24位)
SysTick->LOAD = reload_value - 1;  // 注意:实际计数值=LOAD+1// 清除当前计数值
SysTick->VAL = 0;// 配置控制寄存器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |  // 选择时钟源(0=外部时钟,1=内核时钟)SysTick_CTRL_TICKINT_Msk   |  // 使能中断SysTick_CTRL_ENABLE_Msk;     // 启动定时器
3.2.2 状态检测
// 检查是否计数到0
if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) {// 计数到0时该标志位置1
}

3.3 常用时钟源配置

// 选择时钟源(在SysTick_Config之前调用)
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);     // 使用系统时钟(72MHz)
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); // 使用系统时钟/8(9MHz)

3.4 精确延时实现

3.4.1 阻塞式微秒延时
void delay_us(uint32_t us) {SysTick->LOAD = SystemCoreClock/8000000 * us - 1; // 以9MHz工作SysTick->VAL = 0;SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));SysTick->CTRL = 0;
}
3.4.2 阻塞式毫秒延时
void delay_ms(uint32_t ms) {while (ms--) {delay_us(1000);}
}

3.5 中断服务函数

volatile uint32_t sys_tick_count = 0;void SysTick_Handler(void) {sys_tick_count++;  // 每中断一次计数+1
}

文中工程下载:https://github.com/hazy1k/STM32F1-Quick-Start-Guide-STD/tree/master/2.code

http://www.dtcms.com/a/346932.html

相关文章:

  • Nacos-12--扩展:@RefreshScope和@ConfigurationProperties实现热更新的原理
  • PHP - 线程安全 - 疑问与答案
  • springboot 表现层消息一致性处理:前后端数据协议
  • SpringMVC相关自动配置
  • 第1篇:走进日志框架的世界 - 从HelloWorld到企业级应用
  • C++中, new对象时有哪几种情况会导致new失败
  • piclist+gitee操作指南
  • DeepSeek V3.1深度解析:一个模型两种思维,迈向Agent时代的第一步!
  • 屏幕类型与信号接口
  • 不用 if-else,Spring Boot 怎么知道 ?status=10 是哪个枚举?
  • 全面解析JVM预热:原理、价值与实践指南
  • Mybatis Plus - 代码生成器简单使用
  • SSE实时通信与前端联调实战
  • 内网穿透教程
  • 亚马逊布局墨西哥低价赛道:Amazon Bazaar的战略逻辑与卖家破局路径
  • STM32CubeIDE V1.9.0下载资源链接
  • 水体反光 + 遮挡难题破解!陌讯多模态融合算法在智慧水务的实测优化
  • RAG学习(六)——检索优化技术进阶
  • Sqlserver存储过程
  • 拼豆设计生成器(支持大写字母、数字,颜色自定义)
  • 力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流
  • 三、Bpmnjs 核心组件与架构介绍
  • 深入剖析结构体内存对齐
  • 达梦数据库巡检常用SQL(一)
  • Base64 编码优化 Web 图片加载:异步响应式架构(Java 后端 + 前端全流程实现)
  • Linux问答题:分析和存储日志
  • [特殊字符] 在 Windows 新电脑上配置 GitHub SSH 的完整记录(含坑点与解决方案)
  • JUC之AQS
  • csrf漏洞学习笔记
  • C++ 20: Concepts 与Requires