delay.rs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. use crate::register::mcycle;
  2. use embedded_hal::blocking::delay::{DelayMs, DelayUs};
  3. /// Machine mode cycle counter (`mcycle`) as a delay provider
  4. #[derive(Copy, Clone)]
  5. pub struct McycleDelay {
  6. ticks_second: u32,
  7. }
  8. impl McycleDelay {
  9. /// Constructs the delay provider.
  10. /// `ticks_second` should be the clock speed of the core, in Hertz
  11. #[inline(always)]
  12. pub fn new(ticks_second: u32) -> Self {
  13. Self { ticks_second }
  14. }
  15. }
  16. impl DelayUs<u64> for McycleDelay {
  17. #[inline]
  18. fn delay_us(&mut self, us: u64) {
  19. let t0 = mcycle::read64();
  20. let clock = (us * (self.ticks_second as u64)) / 1_000_000;
  21. while mcycle::read64().wrapping_sub(t0) <= clock {}
  22. }
  23. }
  24. impl DelayUs<u32> for McycleDelay {
  25. #[inline(always)]
  26. fn delay_us(&mut self, us: u32) {
  27. self.delay_us(us as u64)
  28. }
  29. }
  30. // Implemented for constructions like `delay.delay_us(50_000);`
  31. impl DelayUs<i32> for McycleDelay {
  32. #[inline(always)]
  33. fn delay_us(&mut self, us: i32) {
  34. assert!(us >= 0);
  35. self.delay_us(us as u32);
  36. }
  37. }
  38. impl DelayUs<u16> for McycleDelay {
  39. #[inline(always)]
  40. fn delay_us(&mut self, us: u16) {
  41. self.delay_us(us as u32)
  42. }
  43. }
  44. impl DelayUs<u8> for McycleDelay {
  45. #[inline(always)]
  46. fn delay_us(&mut self, us: u8) {
  47. self.delay_us(us as u32)
  48. }
  49. }
  50. impl DelayMs<u32> for McycleDelay {
  51. #[inline]
  52. fn delay_ms(&mut self, ms: u32) {
  53. self.delay_us((ms as u64) * 1000)
  54. }
  55. }
  56. // Implemented for constructions like `delay.delay_ms(50_000);`
  57. impl DelayMs<i32> for McycleDelay {
  58. #[inline(always)]
  59. fn delay_ms(&mut self, ms: i32) {
  60. assert!(ms >= 0);
  61. self.delay_ms(ms as u32);
  62. }
  63. }
  64. impl DelayMs<u16> for McycleDelay {
  65. #[inline(always)]
  66. fn delay_ms(&mut self, ms: u16) {
  67. self.delay_ms(ms as u32)
  68. }
  69. }
  70. impl DelayMs<u8> for McycleDelay {
  71. #[inline(always)]
  72. fn delay_ms(&mut self, ms: u8) {
  73. self.delay_ms(ms as u32)
  74. }
  75. }