afio.rs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //! # Alternate Function I/Os
  2. use crate::pac::{afio, AFIO};
  3. use crate::rcc::{Enable, Reset, APB2};
  4. use crate::gpio::{
  5. gpioa::PA15,
  6. gpiob::{PB3, PB4},
  7. Debugger, Floating, Input,
  8. };
  9. pub trait AfioExt {
  10. fn constrain(self, apb2: &mut APB2) -> Parts;
  11. }
  12. impl AfioExt for AFIO {
  13. fn constrain(self, apb2: &mut APB2) -> Parts {
  14. AFIO::enable(apb2);
  15. AFIO::reset(apb2);
  16. Parts {
  17. evcr: EVCR { _0: () },
  18. mapr: MAPR {
  19. _0: (),
  20. jtag_enabled: true,
  21. },
  22. exticr1: EXTICR1 { _0: () },
  23. exticr2: EXTICR2 { _0: () },
  24. exticr3: EXTICR3 { _0: () },
  25. exticr4: EXTICR4 { _0: () },
  26. mapr2: MAPR2 { _0: () },
  27. }
  28. }
  29. }
  30. pub struct Parts {
  31. pub evcr: EVCR,
  32. pub mapr: MAPR,
  33. pub exticr1: EXTICR1,
  34. pub exticr2: EXTICR2,
  35. pub exticr3: EXTICR3,
  36. pub exticr4: EXTICR4,
  37. pub mapr2: MAPR2,
  38. }
  39. pub struct EVCR {
  40. _0: (),
  41. }
  42. impl EVCR {
  43. pub fn evcr(&mut self) -> &afio::EVCR {
  44. unsafe { &(*AFIO::ptr()).evcr }
  45. }
  46. }
  47. pub struct MAPR {
  48. _0: (),
  49. jtag_enabled: bool,
  50. }
  51. impl MAPR {
  52. fn mapr(&mut self) -> &afio::MAPR {
  53. unsafe { &(*AFIO::ptr()).mapr }
  54. }
  55. pub fn modify_mapr<F>(&mut self, mod_fn: F)
  56. where
  57. F: for<'w> FnOnce(&afio::mapr::R, &'w mut afio::mapr::W) -> &'w mut afio::mapr::W,
  58. {
  59. let debug_bits = if self.jtag_enabled { 0b000 } else { 0b010 };
  60. self.mapr()
  61. .modify(unsafe { |r, w| mod_fn(r, w).swj_cfg().bits(debug_bits) });
  62. }
  63. /// Disables the JTAG to free up pa15, pb3 and pb4 for normal use
  64. pub fn disable_jtag(
  65. &mut self,
  66. pa15: PA15<Debugger>,
  67. pb3: PB3<Debugger>,
  68. pb4: PB4<Debugger>,
  69. ) -> (
  70. PA15<Input<Floating>>,
  71. PB3<Input<Floating>>,
  72. PB4<Input<Floating>>,
  73. ) {
  74. self.jtag_enabled = false;
  75. // Avoid duplicating swj_cfg write code
  76. self.modify_mapr(|_, w| w);
  77. // NOTE(unsafe) The pins are now in the good state.
  78. unsafe { (pa15.activate(), pb3.activate(), pb4.activate()) }
  79. }
  80. }
  81. pub struct EXTICR1 {
  82. _0: (),
  83. }
  84. impl EXTICR1 {
  85. pub fn exticr1(&mut self) -> &afio::EXTICR1 {
  86. unsafe { &(*AFIO::ptr()).exticr1 }
  87. }
  88. }
  89. pub struct EXTICR2 {
  90. _0: (),
  91. }
  92. impl EXTICR2 {
  93. pub fn exticr2(&mut self) -> &afio::EXTICR2 {
  94. unsafe { &(*AFIO::ptr()).exticr2 }
  95. }
  96. }
  97. pub struct EXTICR3 {
  98. _0: (),
  99. }
  100. impl EXTICR3 {
  101. pub fn exticr3(&mut self) -> &afio::EXTICR3 {
  102. unsafe { &(*AFIO::ptr()).exticr3 }
  103. }
  104. }
  105. pub struct EXTICR4 {
  106. _0: (),
  107. }
  108. impl EXTICR4 {
  109. pub fn exticr4(&mut self) -> &afio::EXTICR4 {
  110. unsafe { &(*AFIO::ptr()).exticr4 }
  111. }
  112. }
  113. pub struct MAPR2 {
  114. _0: (),
  115. }
  116. impl MAPR2 {
  117. pub fn mapr2(&mut self) -> &afio::MAPR2 {
  118. unsafe { &(*AFIO::ptr()).mapr2 }
  119. }
  120. }