Skip to content

TPIU: set_swo_baud_rate silently integer divisions, does not verify prescaler  #388

Open
@tmplt

Description

/// Sets the prescaler value for a wanted baud rate of the Serial
/// Wire Output (SWO) in relation to a given asynchronous refernce
/// clock rate.
#[inline]
pub fn set_swo_baud_rate(&mut self, ref_clk_rate: u32, baud_rate: u32) {
unsafe {
self.acpr.write((ref_clk_rate / baud_rate) - 1);
}
}

Experimentally, tpiu.set_swo_baud_rate(16_000_000, 115_200) works for me on an stm32, but instead of writing the expected (but invalid) 137.88, 137 is written. I theorize I just happen to be within a margin of error to kinda work, which would explain the invalid packets I get in rtic-scope/cargo-rtic-scope#18.

On another device, an atsame51n, tpiu.set_swo_baud_rate(120_000_000, 115_200) writes 1040 instead of 1040.66, and no trace output is seen on the SWO. Whether an invalid prescaler is the cause of this or just incorrect device setup remains to be seen.

In any case, the input arguments should yield an integer after division or otherwise fail. Preferably the function should also check what the largest implented prescaler value is.

Relevant section from ARMv7-M documentation attached below.

2022-01-10T18:10:04+01:00

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