Skip to content

Commit 74480e7

Browse files
committed
fix: continued attempts to fix ADC
1 parent f46252f commit 74480e7

File tree

1 file changed

+95
-19
lines changed

1 file changed

+95
-19
lines changed

port-stm32/src/tsp/naegi.rs

Lines changed: 95 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ use super::PlatformConfig;
22
use crate::roles::control;
33
use core::mem;
44
use core::mem::MaybeUninit;
5+
use core::sync::atomic::{AtomicU32, Ordering};
56
use cortex_m::prelude::_embedded_hal_Pwm;
6-
use defmt::{info, trace};
7+
use defmt::{debug, info, trace};
78
use drivers::mpu6500::{AccelRange, GyroRange, MPU6500Driver, Vector3};
89
use embassy_executor::Spawner;
910
use embassy_stm32::adc::{Adc, AdcChannel, Exten, InjectedAdc, SampleTime};
1011
use embassy_stm32::gpio::{Level, Output, OutputType, Speed};
11-
use embassy_stm32::interrupt::typelevel::{ADC, Interrupt, TIM8_UP_TIM13};
12+
use embassy_stm32::interrupt::typelevel::{ADC, Interrupt, TIM8_CC, TIM8_UP_TIM13};
1213
use embassy_stm32::interrupt::{InterruptExt, Priority};
1314
use embassy_stm32::mode::{Async, Blocking};
14-
use embassy_stm32::pac::timer::vals::Urs;
15+
use embassy_stm32::pac::timer::vals::{Ocm, Urs};
1516
use embassy_stm32::pac::{ADC1, ADC2, ADC3, GPIOB, TIM8};
1617
use embassy_stm32::peripherals::{self, TIM2, TIM3, TIM8};
1718
use embassy_stm32::rcc::{
@@ -103,6 +104,7 @@ pub struct Tsp<'a> {
103104
}
104105

105106
static mut TSP_PERIPH: MaybeUninit<Tsp<'static>> = MaybeUninit::uninit();
107+
static TIM8_CC4_COUNT: AtomicU32 = AtomicU32::new(0);
106108

107109
static DEFMT_SERIAL: StaticCell<embassy_stm32::usart::Uart<Blocking>> = StaticCell::new();
108110

@@ -193,6 +195,15 @@ pub async fn init<'a>(p: Peripherals, _spawner: &Spawner) {
193195
unsafe {
194196
TIM8_UP_TIM13::enable();
195197
}
198+
pac::TIM8.dier().modify(|w| w.set_ccie(3, true));
199+
TIM8_CC::unpend();
200+
unsafe {
201+
TIM8_CC::enable();
202+
}
203+
TIM8.ccmr_output(1).modify(|w| {
204+
w.set_ocm(1, Ocm::FROZEN);
205+
w.set_ocpe(1, false);
206+
});
196207
// mirrored from MESCfoc.c/calculateGains
197208
motor_tim.set_duty(Channel::Ch4, motor_tim.get_max_duty() - 5);
198209
trace!("Motor timer max duty: {}", motor_tim.get_max_duty());
@@ -224,7 +235,7 @@ pub async fn init<'a>(p: Peripherals, _spawner: &Spawner) {
224235
(core_temp, SampleTime::CYCLES112),
225236
],
226237
TIM8_CH4,
227-
Exten::RISING_EDGE,
238+
Exten::BOTH_EDGES,
228239
true,
229240
);
230241
let adc2 = adc2.setup_injected_conversions(
@@ -233,7 +244,7 @@ pub async fn init<'a>(p: Peripherals, _spawner: &Spawner) {
233244
(t_driver, SampleTime::CYCLES112),
234245
],
235246
TIM8_CH4,
236-
Exten::RISING_EDGE,
247+
Exten::BOTH_EDGES,
237248
true,
238249
);
239250
let adc3 = adc3.setup_injected_conversions(
@@ -242,7 +253,7 @@ pub async fn init<'a>(p: Peripherals, _spawner: &Spawner) {
242253
(v_battery, SampleTime::CYCLES112),
243254
],
244255
TIM8_CH4,
245-
Exten::RISING_EDGE,
256+
Exten::BOTH_EDGES,
246257
true,
247258
);
248259
unsafe {
@@ -255,15 +266,6 @@ pub async fn init<'a>(p: Peripherals, _spawner: &Spawner) {
255266
ADC1.cr2().read().adon(),
256267
ADC1.sr().read().jstrt()
257268
);
258-
ADC1.cr1().modify(|w| w.set_scan(true));
259-
ADC2.cr1().modify(|w| w.set_scan(true));
260-
ADC3.cr1().modify(|w| w.set_scan(true));
261-
trace!(
262-
"After manual: ADC1->CR1.SCAN: {}, CR2.ADON: {}, SR.JSTRT: {}",
263-
ADC1.cr1().read().scan(),
264-
ADC1.cr2().read().adon(),
265-
ADC1.sr().read().jstrt()
266-
);
267269

268270
let ws281x_tim = SimplePwm::new(
269271
p.TIM3,
@@ -380,19 +382,70 @@ impl PlatformConfig for Config {
380382
*/
381383

382384
#[interrupt]
383-
unsafe fn ADC() {
385+
fn ADC() {
384386
rtos_trace::trace::isr_enter();
385387

386388
trace!("ADC");
387389

388390
// if ADC1.sr().read().jeoc() && ADC2.sr().read().jeoc() && ADC3.sr().read().jeoc() {
389391
// Clear end of conversion flags
390-
ADC1.sr().modify(|w| w.set_jeoc(false));
391-
ADC2.sr().modify(|w| w.set_jeoc(false));
392-
ADC3.sr().modify(|w| w.set_jeoc(false));
392+
debug!(
393+
"ADC1->SR.JSTRT: {}, SR.JEOC: {}, CR2.JEXTEN: {}, CR2.JEXTSEL: {}",
394+
ADC1.sr().read().jstrt(),
395+
ADC1.sr().read().jeoc(),
396+
ADC1.cr2().read().jexten(),
397+
ADC1.cr2().read().jextsel()
398+
);
399+
debug!(
400+
"ADC2->SR.JSTRT: {}, SR.JEOC: {}, CR2.JEXTEN: {}, CR2.JEXTSEL: {}",
401+
ADC2.sr().read().jstrt(),
402+
ADC2.sr().read().jeoc(),
403+
ADC2.cr2().read().jexten(),
404+
ADC2.cr2().read().jextsel()
405+
);
406+
debug!(
407+
"ADC3->SR.JSTRT: {}, SR.JEOC: {}, CR2.JEXTEN: {}, CR2.JEXTSEL: {}",
408+
ADC3.sr().read().jstrt(),
409+
ADC3.sr().read().jeoc(),
410+
ADC3.cr2().read().jexten(),
411+
ADC3.cr2().read().jextsel()
412+
);
413+
ADC1.sr().modify(|w| {
414+
w.set_jeoc(false);
415+
w.set_jstrt(false);
416+
});
417+
ADC2.sr().modify(|w| {
418+
w.set_jeoc(false);
419+
w.set_jstrt(false);
420+
});
421+
ADC3.sr().modify(|w| {
422+
w.set_jeoc(false);
423+
w.set_jstrt(false);
424+
});
393425

394426
core_control::adc_isr(control::get_state());
395427
// }
428+
debug!(
429+
"After adc_isr: ADC1->SR.JSTRT: {}, SR.JEOC: {}, CR2.JEXTEN: {}, CR2.JEXTSEL: {}",
430+
ADC1.sr().read().jstrt(),
431+
ADC1.sr().read().jeoc(),
432+
ADC1.cr2().read().jexten(),
433+
ADC1.cr2().read().jextsel()
434+
);
435+
debug!(
436+
"After adc_isr: ADC2->SR.JSTRT: {}, SR.JEOC: {}, CR2.JEXTEN: {}, CR2.JEXTSEL: {}",
437+
ADC2.sr().read().jstrt(),
438+
ADC2.sr().read().jeoc(),
439+
ADC2.cr2().read().jexten(),
440+
ADC2.cr2().read().jextsel()
441+
);
442+
debug!(
443+
"After adc_isr: ADC3->SR.JSTRT: {}, SR.JEOC: {}, CR2.JEXTEN: {}, CR2.JEXTSEL: {}",
444+
ADC3.sr().read().jstrt(),
445+
ADC3.sr().read().jeoc(),
446+
ADC3.cr2().read().jexten(),
447+
ADC3.cr2().read().jextsel()
448+
);
396449

397450
rtos_trace::trace::isr_exit();
398451
}
@@ -409,6 +462,29 @@ fn TIM8_UP_TIM13() {
409462
rtos_trace::trace::isr_exit();
410463
}
411464

465+
#[interrupt]
466+
fn TIM8_CC() {
467+
rtos_trace::trace::isr_enter();
468+
469+
if pac::TIM8.sr().read().ccif(3) {
470+
pac::TIM8.sr().modify(|w| w.set_ccif(3, false));
471+
472+
let count = TIM8_CC4_COUNT.fetch_add(1, Ordering::Relaxed) + 1;
473+
if count <= 10 || count % 1000 == 0 {
474+
debug!(
475+
"TIM8_CC4 count={}, CNT={}, CCR4={}, CMS={}, DIR={}",
476+
count,
477+
pac::TIM8.cnt().read().cnt(),
478+
pac::TIM8.ccr(3).read(),
479+
pac::TIM8.cr1().read().cms(),
480+
pac::TIM8.cr1().read().dir()
481+
);
482+
}
483+
}
484+
485+
rtos_trace::trace::isr_exit();
486+
}
487+
412488
/// The balance loop interrupt
413489
#[allow(static_mut_refs)]
414490
#[interrupt]

0 commit comments

Comments
 (0)