LINUX.ORG.RU

История изменений

Исправление shkolnick-kun, (текущая версия) :

Потому, что надо было делать как минимум вот так:

void delay(unsigned long p)
{
    unsigned long i;
    for (i = 0; i < p; i++)
    {
        __asm__ __volatile__ ("nop":::);
    }
}

а лучше - вот так:

#define TMR_CLEAR(a) (a = DWT->CYCCNT)

#define TMR_USEC(a) ((DWT->CYCCNT - a)/(SystemCoreClock/1000000u))

void delay(uint32_t thr)
{
    uint32_t t;
    TMR_CLEAR(t);
    while (TMR_USEC(t) < thr)
    {
        __asm__ __volatile__ ("nop":::);
    }
}

/* И в начале main: */
    /* Enable cycle counter */
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT = 0;
    DWT->CTRL |= 1;

Исправление shkolnick-kun, :

Потому, что надо было делать как минимум вот так:

void delay(unsigned long p)
{
    unsigned long i;
    for(i = 0; i < p ; i++)
    {
        __asm__ __volatile__ ("nop":::);
    }
}

а лучше - вот так:

#define TMR_CLEAR(a) (a = DWT->CYCCNT)

#define TMR_USEC(a) ((DWT->CYCCNT - a)/(SystemCoreClock/1000000u))

void delay(uint32_t thr)
{
    uint32_t t;
    TMR_CLEAR(t);
    while(TMR_USEC(t) < thr)
    {
        __asm__ __volatile__ ("nop":::);
    }
}

/* И в начале main: */
    /* Enable cycle counter */
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT = 0;
    DWT->CTRL |= 1;

Исходная версия shkolnick-kun, :

Потому, что надо было делать как минимум вот так:

void delay(unsigned long p)
{
    unsigned long i;
    for(i = 0; i < p ; i++)
    {
        __asm__ __volatile__ ("nop":::);
    }
}

а лучше - вот так:



#define TMR_CLEAR(a) (a = DWT->CYCCNT)

#define TMR_USEC(a) ((DWT->CYCCNT - a)/(SystemCoreClock/1000000u))

void delay(uint32_t thr)
{
    uint32_t t;
    TMR_CLEAR(t);
    while(TMR_USEC(t) < thr)
    {
        __asm__ __volatile__ ("nop":::);
    }
}

/*И в начале main:*/
    /*Enable cycle counter*/
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CYCCNT = 0;
    DWT->CTRL |= 1;