From 40d0605218934759ee03c4db6264f5e646f89328 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Tue, 4 Aug 2026 19:35:32 +0300 Subject: [PATCH] . --- G4:G431/CORDIC/commproto.cpp | 4 ++-- G4:G431/CORDIC/cordic.bin | Bin 12792 -> 14936 bytes G4:G431/CORDIC/hardware.c | 18 +++++++++--------- G4:G431/CORDIC/main.c | 9 +++++++++ G4:G431/CORDIC/test.c | 16 +++++++++------- G4:G431/CORDIC/version.inc | 2 +- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/G4:G431/CORDIC/commproto.cpp b/G4:G431/CORDIC/commproto.cpp index 1337253..6d071fa 100644 --- a/G4:G431/CORDIC/commproto.cpp +++ b/G4:G431/CORDIC/commproto.cpp @@ -165,7 +165,7 @@ static errcodes_t cmd_testm(const char*, char *args){ ok = false; } if(!ok) return ERR_BADVAL; - SEND("TIME="); + SEND("TIMEus="); SEND(u2str(elapsed)); SEND("\n"); return ERR_AMOUNT; @@ -193,7 +193,7 @@ static errcodes_t cmd_testc(const char*, char *args){ ok = false; } if(!ok) return ERR_BADVAL; - SEND("TIME="); + SEND("TIMEus="); SEND(u2str(elapsed)); SEND("\n"); return ERR_AMOUNT; diff --git a/G4:G431/CORDIC/cordic.bin b/G4:G431/CORDIC/cordic.bin index 9f5d601d362b988c359275717bb6e259f9c225cb..eea0d9593609161a04084af87ced79b6215347d9 100755 GIT binary patch delta 8165 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 |= RCC_APB1ENR1_TIM2EN; + RCC->APB1ENR1 |= RCC_APB1ENR1_TIM3EN; __DSB(); - TIM2->PSC = 84; // 85 MHz / 85 = 1 MHz - TIM2->ARR = 0xFFFFFFFF; // 32-bit auto-reload (maximum) - TIM2->CR1 = 0; // disable counter + TIM3->CR1 = 0; // disable counter + TIM3->PSC = 84; // 85 MHz / 85 = 1 MHz + TIM3->ARR = 0xFFFFFFFF; // 32-bit auto-reload (maximum) } void timer_start(){ - TIM2->CNT = 0; - TIM2->CR1 |= TIM_CR1_CEN; + TIM3->CNT = 0; + TIM3->CR1 = TIM_CR1_CEN; } void timer_stop(){ - TIM2->CR1 = 0; + TIM3->CR1 = 0; } uint32_t timer_read(){ - return TIM2->CNT; + return TIM3->CNT; } void gpio_setup(){ @@ -62,7 +62,7 @@ void gpio_setup(){ // count milliseconds SysTick_Config(SysFreq / 1000); - // Setup TIM2 for microsecond counting + // Setup TIM3 for microsecond counting timer_setup(); } diff --git a/G4:G431/CORDIC/main.c b/G4:G431/CORDIC/main.c index 3fed459..9edc614 100644 --- a/G4:G431/CORDIC/main.c +++ b/G4:G431/CORDIC/main.c @@ -21,6 +21,7 @@ #include "commproto.h" #include "hardware.h" +#include "strfunc.h" #include "usart.h" // 40ms for debouncing @@ -33,6 +34,7 @@ int main(void){ usart_setup(115200); bool pressed = false; uint32_t Tblink = 0, Tkey = 0; // blink and key pressed time + uint32_t Tpressed = 0; while(1){ USART_flags_t f = usart_process(); if(f.rxovrfl) usart_sendstr("Rx buffer overflow!\n"); @@ -50,12 +52,19 @@ int main(void){ if(!pressed){ // new event pressed = true; usart_sendstr("Key pressed\n"); + timer_start(); + Tpressed = Tms; } Tkey = Tms; }else{ // key released if(pressed && (Tms - Tkey) > TDEBOUNCE){ // wait for debounce + timer_stop(); + uint32_t micros = timer_read(); + uint32_t millis = Tms - Tpressed; pressed = false; usart_sendstr("Key released\n"); + usart_sendstr("Tms="); usart_sendstr(u2str(millis)); + usart_sendstr("\nTus="); usart_sendstr(u2str(micros)); usart_sendstr("\n"); } } } diff --git a/G4:G431/CORDIC/test.c b/G4:G431/CORDIC/test.c index 59b1412..aae3602 100644 --- a/G4:G431/CORDIC/test.c +++ b/G4:G431/CORDIC/test.c @@ -27,6 +27,9 @@ // amount of iterations over test #define N_TESTS 1000 +static float arr[N_TESTS]; + + // RNG static uint32_t rand_state = 123456789; static uint32_t next_rand(void){ @@ -35,35 +38,34 @@ static uint32_t next_rand(void){ } // fill array with random angles -static void fill_random_sin_cos(float *arr){ +static void fill_random_sin_cos(){ for(int i = 0; i < N_TESTS; ++i){ // angle from -pi to +pi arr[i] = (float)(next_rand() % 62831853) / 10000000.0f - 3.14159265f; } } -static void fill_random_atan(float *arr){ +static void fill_random_atan(){ for(int i = 0; i < N_TESTS; ++i){ arr[i] = (float)(next_rand() % 2000000) / 1e6f - 1e6f; // [-1,1] } } -static void fill_random_sqrt(float *arr){ +static void fill_random_sqrt(){ for(int i = 0; i < N_TESTS; ++i){ arr[i] = (float)(next_rand() % 10000) / 100.0f; // [0,100] } } -static void fill_random_log(float *arr){ +static void fill_random_log(){ for(int i = 0; i < N_TESTS; ++i){ arr[i] = (float)(next_rand() % 10000 + 1) / 100.0f; // [0.01, 100] } } // main test template -static uint32_t run_test(void (*gen)(float*), float (*func)(float)){ - float arr[N_TESTS]; - gen(arr); +static uint32_t run_test(void (*gen)(), float (*func)(float)){ + gen(); volatile float result = 0.0f; // don't let gcc to optimize this cycle timer_start(); for(int i = 0; i < N_TESTS; ++i){ diff --git a/G4:G431/CORDIC/version.inc b/G4:G431/CORDIC/version.inc index 4841fb4..d8c9689 100644 --- a/G4:G431/CORDIC/version.inc +++ b/G4:G431/CORDIC/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "6" +#define BUILD_NUMBER "19" #define BUILD_DATE "2026-08-04"