I use the crate stm32f3xx_hal in my embedded project. Now I have to add my own drivers for certain problems. For example I need the compare function of a timer. How do I do this?
My attempt to add a driver in my project failed, because many functions are crate-locally defined. Example:
pub fn new(tim: TIM2, resolution: u32, clocks: Clocks, apb: &mut APB1) -> CompareTimer {
apb.enr().modify(|_, w| w.tim2en().set_bit());
apb.rstr().modify(|_, w| w.tim2rst().set_bit());
apb.rstr().modify(|_, w| w.tim2rst().clear_bit());
let pclk1 = clocks.pclk1();
let timer_clock = pclk1.0 * if clocks.ppre1() == 1 { 1 } else { 2 }; // z.B. 8_000_000
let psc = (timer_clock / 1_000_000) * resolution - 1; // z.B. 1000µs => psc = 7999
tim.psc.write(|w| w.psc().bits(psc as u16));
// test ccr1
tim.ccr1.write(|w| w.ccr().bits(500)); // ccr to 500
// Trigger an update event to load the prescaler value to the clock
// NOTE(write): uses all bits in this register.
tim.egr.write(|w| w.ug().update());
let compare_timer = CompareTimer {clocks: clocks, tim: tim };
// The above line raises an update event which will indicate that the timer is already
// finished. Since this is not the case, it should be cleared
compare_timer.clear_interrupt_flag();
compare_timer.start();
compare_timer.listen();
compare_timer
}
For example the function apb.enr() is not accessible from outside. The only way I found to implement this is to integrate the sources of the crate stm32f3xx_hal into the project and patch them.
But I find this very unattractive, because I want to use this crate as it is provided by the community. Are there any alternatives to this?
Thank you