aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Viktor Sonesten <v@tmplt.dev> 2021-11-21 01:20:57 +0100
committerGravatar Viktor Sonesten <v@tmplt.dev> 2021-11-21 01:34:39 +0100
commit0e647743de4a87b4a04fb02178d3a76ef053fb42 (patch)
treebb50820ff70f555daaa100b31f7acb059f906d3e
parent021420b11fa7f51b5daae46fbfbcd19a370bc75d (diff)
downloadcortex-m-0e647743de4a87b4a04fb02178d3a76ef053fb42.tar.gz
cortex-m-0e647743de4a87b4a04fb02178d3a76ef053fb42.tar.zst
cortex-m-0e647743de4a87b4a04fb02178d3a76ef053fb42.zip
dwt: refactor out unnecessary explicit panic
-rw-r--r--src/peripheral/dwt.rs52
1 files changed, 24 insertions, 28 deletions
diff --git a/src/peripheral/dwt.rs b/src/peripheral/dwt.rs
index 8bb063f..0b0d774 100644
--- a/src/peripheral/dwt.rs
+++ b/src/peripheral/dwt.rs
@@ -364,12 +364,32 @@ impl Comparator {
pub fn configure(&self, settings: ComparatorFunction) -> Result<(), DwtError> {
match settings {
ComparatorFunction::Address(settings) => unsafe {
- if settings.emit == EmitOption::PC && settings.access_type != AccessType::ReadWrite
- {
- return Err(DWTError::InvalidFunction);
- }
+ // FUNCTION, EMITRANGE
+ // See Table C1-14
+ let (function, emit_range) = match (&settings.access_type, &settings.emit) {
+ (AccessType::ReadOnly, EmitOption::Data) => (0b1100, false),
+ (AccessType::ReadOnly, EmitOption::Address) => (0b1100, true),
+ (AccessType::ReadOnly, EmitOption::AddressData) => (0b1110, true),
+ (AccessType::ReadOnly, EmitOption::PCData) => (0b1110, false),
+
+ (AccessType::WriteOnly, EmitOption::Data) => (0b1101, false),
+ (AccessType::WriteOnly, EmitOption::Address) => (0b1101, true),
+ (AccessType::WriteOnly, EmitOption::AddressData) => (0b1111, true),
+ (AccessType::WriteOnly, EmitOption::PCData) => (0b1111, false),
+
+ (AccessType::ReadWrite, EmitOption::Data) => (0b0010, false),
+ (AccessType::ReadWrite, EmitOption::Address) => (0b0001, true),
+ (AccessType::ReadWrite, EmitOption::AddressData) => (0b0010, true),
+ (AccessType::ReadWrite, EmitOption::PCData) => (0b0011, false),
+
+ (AccessType::ReadWrite, EmitOption::PC) => (0b0001, false),
+ (_, EmitOption::PC) => return Err(DWTError::InvalidFunction),
+ };
self.function.modify(|mut r| {
+ r.set_function(function);
+ r.set_emitrange(emit_range);
+
// don't compare data value
r.set_datavmatch(false);
@@ -377,30 +397,6 @@ impl Comparator {
// NOTE: only needed for comparator 0, but is SBZP.
r.set_cycmatch(false);
- // FUNCTION, EMITRANGE
- // See Table C1-14
- let (function, emit_range) = match (&settings.access_type, &settings.emit) {
- (AccessType::ReadOnly, EmitOption::Data) => (0b1100, false),
- (AccessType::ReadOnly, EmitOption::Address) => (0b1100, true),
- (AccessType::ReadOnly, EmitOption::AddressData) => (0b1110, true),
- (AccessType::ReadOnly, EmitOption::PCData) => (0b1110, false),
-
- (AccessType::WriteOnly, EmitOption::Data) => (0b1101, false),
- (AccessType::WriteOnly, EmitOption::Address) => (0b1101, true),
- (AccessType::WriteOnly, EmitOption::AddressData) => (0b1111, true),
- (AccessType::WriteOnly, EmitOption::PCData) => (0b1111, false),
-
- (AccessType::ReadWrite, EmitOption::Data) => (0b0010, false),
- (AccessType::ReadWrite, EmitOption::Address) => (0b0001, true),
- (AccessType::ReadWrite, EmitOption::AddressData) => (0b0010, true),
- (AccessType::ReadWrite, EmitOption::PCData) => (0b0011, false),
-
- (AccessType::ReadWrite, EmitOption::PC) => (0b0001, false),
- (_, EmitOption::PC) => unreachable!(), // cannot return Err here; handled above
- };
- r.set_function(function);
- r.set_emitrange(emit_range);
-
r
});