Skip to content

STM32: Bad value returned by systick.get_time_since_boot().to_us() #924

@mihainicolae80

Description

@mihainicolae80

Hi,

Calling systick.get_time_since_boot().to_us() will occasionally return a bad value every 50s or so.

HW: STM32 F3 Discovery board
Using Microzig release 0.15.1
Compiling with zig 0.15.2

main.zig:

const std = @import("std");
const microzig = @import("microzig");
const hal = microzig.hal;
const board = microzig.board;
const log = std.log;

pub const microzig_options: microzig.Options = .{
    .logFn = microzig.board.uart_logger.log,
    .cpu = .{
        .ram_vector_table = true,
    },
    .hal = .{ .rcc_clock_config = board.rcc_medium_speed }
};

pub fn init() void
{
    hal.dma.DMA1_Channel4.enable_interrupt();
    board.init();
    board.init_log();

    hal.systick.init() catch {
        @panic("systick init fail");
    };
}

pub fn main() !void
{
    const systick = hal.systick_timer.clock_device() catch {
        @panic("systick_timer clock device");
    };

    var last_us: u64 = systick.get_time_since_boot().to_us();
    while (true)
    {
        const now_us = systick.get_time_since_boot().to_us();

        if (now_us > last_us + 20_000)
        {
            const now2_us = systick.get_time_since_boot().to_us();
            log.info("now_us jump={d}us last_us={d}us now_us={d}us now2_us={d}us", .{now_us - last_us, last_us, now_us, now2_us});
        }
        last_us = now_us;
    }
}

build.zig:

const std = @import("std");
const microzig = @import("microzig");

const MicroBuild = microzig.MicroBuild(.{
    .stm32 = true,
});

pub fn build(b: *std.Build) void {

    const mz_dep = b.dependency("microzig", .{});
    const mb = MicroBuild.init(b, mz_dep) orelse return;

    const firmware = mb.add_firmware(.{
        .name = "firmware",
        .target = mb.ports.stm32.boards.stm32f3discovery,
        .optimize = .Debug,
        .root_source_file = b.path("src/main.zig"),
    });

    mb.install_firmware(firmware, .{});
    mb.install_firmware(firmware, .{ .format = .elf });

    const flash_argv = [_][] const u8 {
        "arm-none-eabi-gdb.exe",
        "-iex",
        "set auto-load safe-path /",
        "--batch", 
        "--quiet",
        "--command=flash.gdb",
    };
    const flash_cmd_step = b.addSystemCommand(&flash_argv);
    flash_cmd_step.step.dependOn(b.getInstallStep());

    const flash_step = b.step("run", "Flash FW to board");
    flash_step.dependOn(&flash_cmd_step.step);
}

Output:

info: ================ STARTING NEW LOGGER ================

info: now_us jump=2785286us last_us=8355833us now_us=11141119us now2_us=8355846us
info: now_us jump=2785285us last_us=30638074us now_us=33423359us now2_us=30638087us
info: now_us jump=2785285us last_us=75202554us now_us=77987839us now2_us=75202567us
info: now_us jump=2785285us last_us=119767034us now_us=122552319us now2_us=119767047us
info: now_us jump=2785286us last_us=125337593us now_us=128122879us now2_us=125337606us
info: now_us jump=2785285us last_us=175472634us now_us=178257919us now2_us=175472647us
info: now_us jump=2785286us last_us=181043193us now_us=183828479us now2_us=181043206us
info: now_us jump=2785285us last_us=231178234us now_us=233963519us now2_us=231178247us
info: now_us jump=2785286us last_us=236748793us now_us=239534079us now2_us=236748806us
info: now_us jump=2785285us last_us=286883834us now_us=289669119us now2_us=286883847us
info: now_us jump=2785286us last_us=292454393us now_us=295239679us now2_us=292454406us
info: now_us jump=2785285us last_us=342589434us now_us=345374719us now2_us=342589447us
info: now_us jump=2785286us last_us=348159993us now_us=350945279us now2_us=348160006us
info: now_us jump=2785285us last_us=398295034us now_us=401080319us now2_us=398295047us
info: now_us jump=2785286us last_us=403865593us now_us=406650879us now2_us=403865606us
info: now_us jump=2785285us last_us=454000634us now_us=456785919us now2_us=454000647us
info: now_us jump=2785286us last_us=459571193us now_us=462356479us now2_us=459571206us

Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions