скрытое меню

DWT микросекундные паузы

DWT (Data Watchpoint and Trace unit) . Оказывается все просто - чтобы измерить на какой частоте выполняется ваш код можно сделать так :


  #define    DWT_CYCCNT    *(volatile uint32_t*)0xE0001004
  #define    DWT_CONTROL   *(volatile uint32_t*)0xE0001000
  #define    SCB_DEMCR     *(volatile uint32_t*)0xE000EDFC

  char str[16] = {0,};
  uint32_t count_tic = 0;

  SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; 
  // разрешаем использовать DWT
  DWT_CONTROL|= DWT_CTRL_CYCCNTENA_Msk; 
  // включаем счётчик
  DWT_CYCCNT = 0;
 // обнуляем счётчик

  HAL_Delay(1000);
  // здесь кусок измеряемого участка программы

  count_tic = DWT_CYCCNT; 
  // кол-во тактов
  printf("Takt %lu\n", count_tic);

Printf выводит : Takt 30029901. Смотрим на наш Clock Configuration в кубе и становится понятно , откуда берется это значение.

фотка 1

Это HCLK.

Почему 30029901 не равно строго 30000000? DWT_CYCCNT считает такты контроллера. 29901