Код программы:
#include "main.h"
#include "math.h"
uint16_t delay_count=0;
uint16_t data_adc=0;
uint16_t flag=0,i_1,i_2,i_3,i_4;
uint32_t count_tic=0;
uint32_t mod_1=0,m_1,m_2,mo_p;
uint32_t mod_2=0,mod_3=0;
uint32_t N=16,N1=4;
uint32_t sq,X,i=0,sum;
int32_t y1[40][20],y2[40][20];
int32_t a_1,a_2,m;
uint32_t k,s;
void SysTick_Handler(void) //1ms
{
if(delay_count>0){delay_count--;}
}
/*-*/
uint32_t usr_sqrt(uint32_t value)
{
uint32_t d, a;
__asm {
CLZ a, value
RSB a, a, #0x1F
};
d = 1 << ((a >> 1)+1);
a = (d + ( value >> a )) >> 1;
d = (a + value / a)>>1;
a = (d + value / d)>>1;
d = (a + value / a)>>1;
a = (d + value / d)>>1;
return a;
}
/*-*/
uint16_t get_adc_value()
{
ADC_SoftwareStartConv(ADC1);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
return ADC_GetConversionValue(ADC1);
}
/*-*/
void delay_ms(uint16_t delay_temp)
{
delay_count = delay_temp;
while(delay_count){}
}
/*-*/
int main(void)
{
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock/1000);
LED_ini();
DAC_ini();
ADC_R_ini();
#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004
#define DWT_CONTROL *(volatile unsigned long *)0xE0001000
#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC
while(1)
{
if(flag==0){i_1=get_adc_value();flag=1;}
if(flag==1){i_2=get_adc_value();flag=2;}
if(flag==2){i_3=get_adc_value();flag=3;}
if(flag==3){i_4=get_adc_value();flag=0;}
SCB_DEMCR |= 0x01000000;
DWT_CONTROL|= 1; //включение счетчика
DWT_CYCCNT = 0;
i++;
mod_1=i%2;
y1[mod_1][0]=i_1-i_3;
y2[mod_1][0]=i_2-i_4;
mo_p=1;
for(k=1;k<=N1-1;k++)
{
m=mo_p;
m_1=(i)%(m+1);
m_2=(i)%(2*m+1);
mod_2=(m_1+1)%(m+1);
y1[m_2][k]=y1[m_1][k-1]+y1[mod_2][k-1];
y2[m_2][k]=y2[m_1][k-1]+y2[mod_2][k-1];
mo_p=2*mo_p;
}
mod_3=(m_2+1)&(2*m+1);
a_1=y1[m_2][N1-1]+y1[mod_3][N1-1];
a_2=y2[m_2][N1-1]+y2[mod_3][N1-1];
a_1*=a_1;
a_2*=a_2;
sum=a_1+a_2;
sq=usr_sqrt(sum);
X=sq/(2*N);
DAC_SetChannel1Data(DAC_Align_12b_R,X*1.365);
count_tic = DWT_CYCCNT; //результат
}
}
Вот картинки иллюстрирующие разное количество тактов


