@@ -2,16 +2,17 @@ use super::PlatformConfig;
22use crate :: roles:: control;
33use core:: mem;
44use core:: mem:: MaybeUninit ;
5+ use core:: sync:: atomic:: { AtomicU32 , Ordering } ;
56use cortex_m:: prelude:: _embedded_hal_Pwm;
6- use defmt:: { info, trace} ;
7+ use defmt:: { debug , info, trace} ;
78use drivers:: mpu6500:: { AccelRange , GyroRange , MPU6500Driver , Vector3 } ;
89use embassy_executor:: Spawner ;
910use embassy_stm32:: adc:: { Adc , AdcChannel , Exten , InjectedAdc , SampleTime } ;
1011use 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 } ;
1213use embassy_stm32:: interrupt:: { InterruptExt , Priority } ;
1314use embassy_stm32:: mode:: { Async , Blocking } ;
14- use embassy_stm32:: pac:: timer:: vals:: Urs ;
15+ use embassy_stm32:: pac:: timer:: vals:: { Ocm , Urs } ;
1516use embassy_stm32:: pac:: { ADC1 , ADC2 , ADC3 , GPIOB , TIM8 } ;
1617use embassy_stm32:: peripherals:: { self , TIM2 , TIM3 , TIM8 } ;
1718use embassy_stm32:: rcc:: {
@@ -103,6 +104,7 @@ pub struct Tsp<'a> {
103104}
104105
105106static mut TSP_PERIPH : MaybeUninit < Tsp < ' static > > = MaybeUninit :: uninit ( ) ;
107+ static TIM8_CC4_COUNT : AtomicU32 = AtomicU32 :: new ( 0 ) ;
106108
107109static 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