// MCU: STM32F030R8, Cortex-M0
// Clock: 48MHz
// Cortex-M0'larda DWT Cycle Counter yok.
// DWT yerine SysTick timer ile süre ölçüyoruz. Hata ihmal edilebilir.
float pi = 3.141592654f;
float angle_f = 0.0f;
float angle_f_norm = 0.0f;
float sin_f = 0.0f;
int16_t angle_q15 = 0;
int32_t angle_q31 = 0;
int16_t sin_q15 = 0;
int32_t sin_q31 = 0;
uint32_t T1 = 0, T2 = 0, T_delta = 0;
float T_us = 0.0f;
float angle_q15_in_f = 0.0f;
float angle_q31_in_f = 0.0f;
while (1)
{
angle_f = pi * (30.0f/180.0f); // 30 dereceden radyana dönüşüm
angle_f_norm = angle_f * (1.0f / (2.0f * pi)); // Q1.15 ve Q1.31 format için normalizasyon
T1 = SysTick->VAL;
arm_float_to_q15(&angle_f_norm, &angle_q15, 1); // float(açı) -> Q1.15(açı)
T2 = SysTick->VAL;
T_delta = (T1-T2); // SysTick geriye sayıyıyor.O yüzden T2-T1 değil
T_us = (float)T_delta * (1.0f/48.0f); // mikro saniye cinsinden işlem süresi
__NOP(); // Breakpoint için boş saykıl
T1 = SysTick->VAL;
arm_float_to_q31(&angle_f_norm, &angle_q31, 1); // float(açı) -> Q1.31(açı)
T2 = SysTick->VAL;
T_delta = (T1-T2);
T_us = (float)T_delta * (1.0f/48.0f);
__NOP();
T1 = SysTick->VAL;
sin_f = arm_sin_f32(angle_f); // float ile çalışan sin() fonksiyonu
T2 = SysTick->VAL;
T_delta = (T1-T2);
T_us = (float)T_delta * (1.0f/48.0f);
__NOP();
T1 = SysTick->VAL;
sin_q15 = arm_sin_q15(angle_q15); // Q1.15 ile çalışan sin() fonksiyonu
T2 = SysTick->VAL;
T_delta = (T1-T2);
T_us = (float)T_delta * (1.0f/48.0f);
__NOP();
T1 = SysTick->VAL;
sin_q31 = arm_sin_q31(angle_q31); // Q1.31 ile çalışan sin() fonksiyonu
T2 = SysTick->VAL;
T_delta = (T1-T2);
T_us = (float)T_delta * (1.0f/48.0f);
__NOP();
T1 = SysTick->VAL;
arm_q15_to_float(&sin_q15, &angle_q15_in_f, 1); // Q1.15 -> float dönüşümü
T2 = SysTick->VAL;
T_delta = (T1-T2);
T_us = (float)T_delta * (1.0f/48.0f);
__NOP();
T1 = SysTick->VAL;
arm_q31_to_float(&sin_q31, &angle_q31_in_f, 1); // Q1.31 -> float dönüşümü
T2 = SysTick->VAL;
T_delta = (T1-T2);
T_us = (float)T_delta * (1.0f/48.0f);
__NOP();
}