Skip to content

概念先知道

  • MTimer(机器定时器):系统级“心跳”,提供周期中断、微秒时间戳和延时,是所有例程的计时基础。
  • tick:定时器每触发一次就叫一个 tick,例程每秒打印一次 tick:N
  • 与 TIMER 的区别:MTimer 是系统机器定时器;TIMER 是通用定时器(多通道比较/捕获),见 TIMER 定时器

例程功能简介

本页对应博流官方 SDK 的 mtimer 例程(examples/peripherals/mtimer),演示**机器定时器(MTimer)**的中断周期:

  • bflb_mtimer_config(1000000, systick_isr) 把周期设为 1,000,000 微秒(1 秒)并注册回调;
  • 定时器每 1 秒触发一次中断,回调中计数器自增并打印 tick:N
  • MTimer 是系统级定时器,常用于 OS tick、延时与性能统计的时基。

操作步骤

1
进入例程目录

本页不需要额外接线。在终端进入 SDK 的 MTimer 例程目录(前提:已按快速开始(Linux)Windows搭建好环境):

cd examples/peripherals/mtimer
2
编译工程

执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:

make CHIP=bl616 BOARD=bl616dk
3
烧录固件

用 USB 线连接开发板,按住 BOOT 键(Ai-M61-32S-Kit 为 IO2)不放、短按 EN/RST 进入下载模式,然后执行烧录(把串口号换成实际值):

make flash CHIP=bl616 COMX=/dev/ttyUSB0
4
运行验证

打开串口助手(波特率 2000000)。例程配置 MTimer 周期为 1 秒,中断回调里每触发一次打印一行 tick:1tick:2……即每秒递增一次。

代码执行流程

例程从启动到运行的完整流程如下(图中的循环箭头表示反复执行):

例程调用的 API 介绍

bflb_mtimer_config(period_us, isr)

配置机器定时器周期并注册中断回调。周期单位为微秒,例程 1000000 即 1 秒。

参数

  • period_us:周期(微秒)
  • isr:回调函数,形如 void isr(void)

返回值:成功返回 0;失败返回负值错误码

其他能力

MTimer 还提供 bflb_mtimer_delay_ms(毫秒延时)与 bflb_mtimer_get_time_us(微秒时间戳),大量例程都在使用;本例程只演示周期中断。

完整代码

以下为 mtimer/main.c 完整源码,与官方示例(examples/peripherals/mtimer)一致;点灯引脚已适配 Ai-M61/62-32S-Kit 板载 RGB 灯,默认折叠,点击展开:

📜 点击展开 mtimer/main.c 完整代码
c
#include "bflb_mtimer.h"
#include "board.h"

void systick_isr()
{
    static uint32_t tick = 0;
    tick++;
    printf("tick:%d\r\n", tick);
}

int main(void)
{
    board_init();
    bflb_mtimer_config(1000000, systick_isr);
    while (1) {
    }
}

FAQ

tick 打印间隔不是 1 秒

bflb_mtimer_config 周期以微秒为单位;把 1000000 改成其他值即可改变周期。若打印频率异常,检查是否有其他代码频繁关闭全局中断。

中断回调里能做耗时操作吗

回调运行在中断上下文,应保持简短(例程只做计数+打印);耗时操作请放到主循环或任务中,通过标志位通知。

MTimer 和 TIMER 有什么区别

MTimer 是系统机器定时器(周期中断/时间戳),TIMER 是通用定时器(多通道比较/捕获,见 TIMER 定时器)。

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

Released under the MIT License. Build Time 2026-09-11 14:52:23