用C生成纳秒的延迟上STM32(Generating nanosecond delay in C o

2019-07-03 19:52发布

我使用STM32F2控制器和我正在与一个接口ST7036经由8位并行接口的液晶显示屏。

数据表说,应该有地址保持和建立时间之间的20纳米秒的延迟。

如何生成在C 20纳秒的延迟?

Answer 1:

使用stopwatch_delay(ticks )下面来实现自己的延误。 它采用STM32的DWT_CYCCNT寄存器,它是专为实际计数时钟滴答,位于地址0xE0001004。

为了验证延时精度(见main ),你可以调用STOPWATCH_START ,运行stopwatch_delay(ticks) ,然后调用STOPWATCH_STOP与验证CalcNanosecondsFromStopwatch(m_nStart, m_nStop) 调整ticks需要。

uint32_t m_nStart;               //DEBUG Stopwatch start cycle counter value
uint32_t m_nStop;                //DEBUG Stopwatch stop cycle counter value

#define DEMCR_TRCENA    0x01000000

/* Core Debug registers */
#define DEMCR           (*((volatile uint32_t *)0xE000EDFC))
#define DWT_CTRL        (*(volatile uint32_t *)0xe0001000)
#define CYCCNTENA       (1<<0)
#define DWT_CYCCNT      ((volatile uint32_t *)0xE0001004)
#define CPU_CYCLES      *DWT_CYCCNT

#define STOPWATCH_START { m_nStart = *((volatile unsigned int *)0xE0001004);}
#define STOPWATCH_STOP  { m_nStop = *((volatile unsigned int *)0xE0001004);}


static inline void stopwatch_reset(void)
{
    /* Enable DWT */
    DEMCR |= DEMCR_TRCENA; 
    *DWT_CYCCNT = 0;             
    /* Enable CPU cycle counter */
    DWT_CTRL |= CYCCNTENA;
}

static inline uint32_t stopwatch_getticks()
{
    return CPU_CYCLES;
}

static inline void stopwatch_delay(uint32_t ticks)
{
    uint32_t end_ticks = ticks + stopwatch_getticks();
    while(1)
    {
            if (stopwatch_getticks() >= end_ticks)
                    break;
    }
}

uint32_t CalcNanosecondsFromStopwatch(uint32_t nStart, uint32_t nStop)
{
    uint32_t nDiffTicks;
    uint32_t nClkTicksPerMicrosec;

    nDiffTicks = nStop - nStart;
    nDiffTicks *= 1000;                               // Scale diff by 1000.
    nClkTicksPerMicrosec = SystemCoreClock / 1000000; // Convert (clkTicks/sec) to (clkTicks/microsec), SystemCoreClock = 168000000

    return nDiffTicks / nClkTicksPerMicrosec;         // nanosec = (ticks * 1000) / (clkTicks/microsec)
} 

void main(void)
{
    int timeDiff = 0;
    stopwatch_reset();

    STOPWATCH_START;
    run_my_function();
    STOPWATCH_STOP;

    timeDiff = CalcNanosecondsFromStopwatch(m_nStart, m_nStop);
    printf("My function took %d nanoseconds\n", timeDiff);
}


Answer 2:

我发现Stm32f2的第一规范假定120 MHz的时钟频率。 这是对每一个时钟周期为8ns。 您需要连续写或读/写操作之间大约三单周期指令。 在C中, a++; 可能会做(如果位于堆栈)。



Answer 3:

你应该看看FSMC外围提供的芯片。 虽然配置可能会非常复杂,特别是如果你不是在内存部分,它是专为下降,你可能会发现你的并行接口设备映射都有很好的存储器接口模式之一。

这些类型的外部存储控制器必须有一堆配置的时机选择,以支持不同的存储芯片的范围在那里,所以你能保证你的数据表所需的时序。

是能够做到这一点的漂亮的好处是那么你的LCD会看起来像任何旧内存映射的外围,抽象出低层接口的详细内容。



文章来源: Generating nanosecond delay in C on STM32
标签: c stm32 lcd