news 2026/9/26 3:35:29

STM32F407 SysTick 中断设计框架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F407 SysTick 中断设计框架

SysTick 是 Cortex-M 内核提供的24 位向下计数定时器。配置好计数周期后,硬件周期性请求中断,CPU 进入SysTick_Handler(),我们在其中实现软件计时。

1. 设计思路:先确定中断周期,再累计次数

以“LED 每隔 1 秒翻转一次”为例:

SysTick 每 1 ms 中断一次 ↓ 软件计数加 1 ↓ 主程序发现经过 1000 ms ↓ 翻转 LED

这样,中断只负责提供时间基准,主程序负责具体任务。

2. 如何计算中断周期?

选择 HCLK 作为 SysTick 时钟时:

ticks = HCLK频率 × 期望周期(秒) LOAD = ticks - 1 中断周期 = (LOAD + 1) / HCLK频率

假设 HCLK 为 168 MHz,需要每 1 ms 中断一次:

ticks = 168,000,000 × 0.001 = 168000 LOAD = 167999

使用库函数:

SysTick_Config(SystemCoreClock / 1000U);

常用配置:

配置参数中断周期
SystemCoreClock / 10001 ms
SystemCoreClock / 10000010 μs
SystemCoreClock / 10000001 μs

前提是SystemCoreClock与实际 HCLK 一致;不能整除时存在取整误差。

3. 初始化配置了什么?

SysTick_Config(ticks)主要完成以下操作:

SysTick->LOAD = ticks - 1U; // 设置计数周期 SysTick->VAL = 0U; // 清除当前计数值 // 设置中断优先级 NVIC_SetPriority(SysTick_IRQn, 15U); // 选择时钟、允许中断、启动计数器 SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;

CTRL的低三位分别控制:

位设置为 1 的作用
CLKSOURCE,第 2 位选择 HCLK
TICKINT,第 1 位允许计数到 0 时请求中断
ENABLE,第 0 位启动计数器

选择 HCLK 不会改变 HCLK 的频率,系统时钟需要提前配置。

4. 推荐框架:中断计时,主循环处理任务

下面以 STM32F407 为例。假设工程已经提供时钟配置、LED 初始化和翻转函数,并由本示例独立使用 SysTick。

#include "stm32f4xx.h" static volatile uint32_t system_ms = 0; // 初始化:每 1 ms 请求一次中断 void SysTick_Init(void) { if (SysTick_Config(SystemCoreClock / 1000U) != 0U) { while (1) { // 配置参数超出范围 } } } // 中断:只更新时间 void SysTick_Handler(void) { system_ms++; } int main(void) { SystemClock_Config(); LED_GPIO_Config(); SysTick_Init(); uint32_t last_ms = system_ms; while (1) { uint32_t now = system_ms; if ((uint32_t)(now - last_ms) >= 1000U) { last_ms = now; LED_Toggle(); // 使用工程实际的 LED 翻转函数 } // 这里可以继续处理其他任务 } }

这个框架没有空循环等待延时,主程序可以继续执行其他任务。LED 每秒翻转一次,完整亮灭周期约为 2 秒。

5. 必须记住的重点

  • 硬件计数和软件计数不同:LOAD决定一次中断隔多久,system_ms累计中断次数。
  • LOAD = ticks - 1:计算周期时使用LOAD + 1。
  • 共享计时变量使用volatile:保证主程序读取中断更新后的值。
  • 中断函数保持简短:更新时间或置标志,具体任务放在主循环。
  • 不要在中断里等待 SysTick 延时:如果 SysTick 无法抢占当前中断,可能一直等待。
  • 周期按需求选择:LED 等毫秒级任务使用 1 ms 节拍即可,过于频繁的中断会增加 CPU 开销。
  • 24 位限制:ticks最大为2²⁴;168 MHz 下最大单次周期约 99.86 ms,更长时间用软件累计。
  • HAL 工程注意已有 SysTick:通常已经用于 1 ms 系统节拍,应在现有框架中扩展,并保留HAL_IncTick()等必要处理。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 3:35:09

腾讯 WorkBuddy 配 TaoToken:settings.json 骨架与 AI 智能体场景落地验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 3:34:55

校园GPS北斗双模定位方案:从硬件选型到应用落地

现在的校园管理,十有八九的需求最后都会落到同一个问题上:人到底在哪。教学楼里找不到学生、宿舍查寝靠人工统计、家长在校门口等半天接不到孩子、大型活动清点人数靠吼——这些问题单靠传统的一卡通打卡根本解决不了。于是越来越多的学校开始把目光投向…

作者头像 李华
网站建设 2026/9/26 3:34:10

微信读书阅读数据的AI赋能:用MCP服务器打通Cursor知识管理链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/26 3:34:04

ECharts鼠标交互位置错位排查与修复:从容器尺寸到tooltip定位

1. 先分清两种错位:全局偏移与 tooltip 落点问题后台的折线图又出问题了:鼠标明明指着 11 月的点,点击后跳转的却是 12 月的详情;hover 时十字线和 tooltip 能出来,但那条虚线跟光标之间始终差着一截。这种 ECharts 鼠…

作者头像 李华