← All posts tagged fail

не понимаю. В прошлый раз дергал 1 wire через usart и всё работало. Сейчас написал на управлении одним GPIO пином. Проверил, что напряжение, как положено, тянется вверх-вниз, проверил правильность настройки таймера (не до конца уверен). Теперь reset отрабатывает нормально, а команды вроде READ ROM 1wire устройства не понимают и ничего не отдают.

В общем не осилил перевести эту железяку в low power run mode. Фигачу такой код:

#include <libopencm3/stm32/rcc.h> 
#include <libopencm3/stm32/pwr.h> 
#include <libopencm3/stm32/flash.h> 

int main()
{
  clock_scale_t myclock_config = {
    .hpre = RCC_CFGR_HPRE_SYSCLK_DIV2,
    .ppre1 = RCC_CFGR_PPRE1_HCLK_NODIV,
    .ppre2 = RCC_CFGR_PPRE2_HCLK_NODIV,
    .voltage_scale = RANGE2, // Документация требует Range2 для low power run mode
    .flash_config = FLASH_ACR_LATENCY_0WS,
    .apb1_frequency = 65536,
    .apb2_frequency = 65536,
    .msi_range = RCC_ICSCR_MSIRANGE_65KHZ, // Для работы требуется MSIRANGE не больше первого. Ставим нулевой.
  };
  rcc_clock_setup_msi(&myclock_config);
  rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_PWREN);
  PWR_CR |= PWR_CR_LPSDSR;
  PWR_CR |= PWR_CR_LPRUN;
  while(1) {
      __asm__("nop");
    }
}

А в результате, хоть делай "PWR_CR |= PWR_CR_LPRUN;" хоть не делай -- жрёт оно под 1 милиампер, вместо ожидаемых 40 микроампер.