cortex_m/peripheral/
dwt.rs1#[cfg(not(armv6m))]
4use volatile_register::WO;
5use volatile_register::{RO, RW};
6
7use crate::peripheral::DWT;
8
9#[repr(C)]
11pub struct RegisterBlock {
12 pub ctrl: RW<u32>,
14 #[cfg(not(armv6m))]
16 pub cyccnt: RW<u32>,
17 #[cfg(not(armv6m))]
19 pub cpicnt: RW<u32>,
20 #[cfg(not(armv6m))]
22 pub exccnt: RW<u32>,
23 #[cfg(not(armv6m))]
25 pub sleepcnt: RW<u32>,
26 #[cfg(not(armv6m))]
28 pub lsucnt: RW<u32>,
29 #[cfg(not(armv6m))]
31 pub foldcnt: RW<u32>,
32 #[cfg(armv6m)]
34 reserved: [u32; 6],
35 pub pcsr: RO<u32>,
37 #[cfg(armv6m)]
39 pub c: [Comparator; 2],
40 #[cfg(not(armv6m))]
41 pub c: [Comparator; 16],
43 #[cfg(not(armv6m))]
44 reserved: [u32; 932],
45 #[cfg(not(armv6m))]
47 pub lar: WO<u32>,
48 #[cfg(not(armv6m))]
50 pub lsr: RO<u32>,
51}
52
53#[repr(C)]
55pub struct Comparator {
56 pub comp: RW<u32>,
58 pub mask: RW<u32>,
60 pub function: RW<u32>,
62 reserved: u32,
63}
64
65const NUMCOMP_OFFSET: u32 = 28;
67#[cfg(not(armv6m))]
68const NOTRCPKT: u32 = 1 << 27;
69#[cfg(not(armv6m))]
70const NOEXTTRIG: u32 = 1 << 26;
71#[cfg(not(armv6m))]
72const NOCYCCNT: u32 = 1 << 25;
73#[cfg(not(armv6m))]
74const NOPRFCNT: u32 = 1 << 24;
75#[cfg(not(armv6m))]
76const CYCCNTENA: u32 = 1 << 0;
77
78impl DWT {
79 #[inline]
83 pub fn num_comp() -> u8 {
84 unsafe { ((*Self::PTR).ctrl.read() >> NUMCOMP_OFFSET) as u8 }
86 }
87
88 #[cfg(not(armv6m))]
90 #[inline]
91 pub fn has_exception_trace() -> bool {
92 unsafe { (*Self::PTR).ctrl.read() & NOTRCPKT == 0 }
94 }
95
96 #[cfg(not(armv6m))]
98 #[inline]
99 pub fn has_external_match() -> bool {
100 unsafe { (*Self::PTR).ctrl.read() & NOEXTTRIG == 0 }
102 }
103
104 #[cfg(not(armv6m))]
106 #[inline]
107 pub fn has_cycle_counter() -> bool {
108 unsafe { (*Self::PTR).ctrl.read() & NOCYCCNT == 0 }
110 }
111
112 #[cfg(not(armv6m))]
114 #[inline]
115 pub fn has_profiling_counter() -> bool {
116 unsafe { (*Self::PTR).ctrl.read() & NOPRFCNT == 0 }
118 }
119
120 #[cfg(not(armv6m))]
129 #[inline]
130 pub fn enable_cycle_counter(&mut self) {
131 unsafe { self.ctrl.modify(|r| r | CYCCNTENA) }
132 }
133
134 #[cfg(not(armv6m))]
136 #[inline]
137 pub fn disable_cycle_counter(&mut self) {
138 unsafe { self.ctrl.modify(|r| r & !CYCCNTENA) }
139 }
140
141 #[cfg(not(armv6m))]
143 #[inline]
144 pub fn cycle_counter_enabled() -> bool {
145 unsafe { (*Self::PTR).ctrl.read() & CYCCNTENA != 0 }
147 }
148
149 #[cfg(not(armv6m))]
151 #[inline]
152 #[deprecated(
153 since = "0.7.4",
154 note = "Use `cycle_count` which follows the C-GETTER convention"
155 )]
156 pub fn get_cycle_count() -> u32 {
157 Self::cycle_count()
158 }
159
160 #[cfg(not(armv6m))]
162 #[inline]
163 pub fn cycle_count() -> u32 {
164 unsafe { (*Self::PTR).cyccnt.read() }
166 }
167
168 #[cfg(not(armv6m))]
170 #[inline]
171 pub fn set_cycle_count(&mut self, count: u32) {
172 unsafe { self.cyccnt.write(count) }
173 }
174
175 #[cfg(not(armv6m))]
179 #[inline]
180 pub fn unlock() {
181 unsafe { (*Self::PTR).lar.write(0xC5AC_CE55) }
183 }
184
185 #[cfg(not(armv6m))]
193 #[inline]
194 pub fn cpi_count() -> u8 {
195 unsafe { (*Self::PTR).cpicnt.read() as u8 }
197 }
198
199 #[cfg(not(armv6m))]
201 #[inline]
202 pub fn set_cpi_count(&mut self, count: u8) {
203 unsafe { self.cpicnt.write(count as u32) }
204 }
205
206 #[cfg(not(armv6m))]
208 #[inline]
209 pub fn exception_count() -> u8 {
210 unsafe { (*Self::PTR).exccnt.read() as u8 }
212 }
213
214 #[cfg(not(armv6m))]
216 #[inline]
217 pub fn set_exception_count(&mut self, count: u8) {
218 unsafe { self.exccnt.write(count as u32) }
219 }
220
221 #[cfg(not(armv6m))]
229 #[inline]
230 pub fn sleep_count() -> u8 {
231 unsafe { (*Self::PTR).sleepcnt.read() as u8 }
233 }
234
235 #[cfg(not(armv6m))]
237 #[inline]
238 pub fn set_sleep_count(&mut self, count: u8) {
239 unsafe { self.sleepcnt.write(count as u32) }
240 }
241
242 #[cfg(not(armv6m))]
244 #[inline]
245 pub fn lsu_count() -> u8 {
246 unsafe { (*Self::PTR).lsucnt.read() as u8 }
248 }
249
250 #[cfg(not(armv6m))]
252 #[inline]
253 pub fn set_lsu_count(&mut self, count: u8) {
254 unsafe { self.lsucnt.write(count as u32) }
255 }
256
257 #[cfg(not(armv6m))]
261 #[inline]
262 pub fn fold_count() -> u8 {
263 unsafe { (*Self::PTR).foldcnt.read() as u8 }
265 }
266
267 #[cfg(not(armv6m))]
269 #[inline]
270 pub fn set_fold_count(&mut self, count: u8) {
271 unsafe { self.foldcnt.write(count as u32) }
272 }
273}