+#else
+
+static volatile uint32_t dma_buffer;
+
+static void ds18b20_reset(void)
+{
+ debug_puts("DS18B20: Reset\r\n");
+ LL_TIM_DisableCounter(TIM3);
+ LL_TIM_SetOnePulseMode(TIM3, LL_TIM_ONEPULSEMODE_SINGLE);
+ LL_TIM_CC_SetDMAReqTrigger(TIM3, LL_TIM_CCDMAREQUEST_CC);
+
+ dma_buffer = 0xdeadbeef;
+ LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t) &dma_buffer);
+ LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_4, (uint32_t) &THERMO_GPIO_Port->IDR);
+ LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_4, 1);
+ LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_4);
+
+ LL_TIM_OC_InitTypeDef oc;
+
+ LL_TIM_OC_StructInit(&oc);
+ oc.OCMode = LL_TIM_OCMODE_FROZEN;
+ oc.CompareValue = 560;
+ LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH1, &oc);
+ LL_TIM_EnableDMAReq_CC1(TIM3);
+
+ LL_TIM_OC_StructInit(&oc);
+ oc.OCMode = LL_TIM_OCMODE_FORCED_ACTIVE;
+ oc.OCState = LL_TIM_OCSTATE_ENABLE;
+ oc.CompareValue = 480;
+ oc.OCPolarity = LL_TIM_OCPOLARITY_LOW;
+ LL_TIM_OC_Init(TIM3, LL_TIM_CHANNEL_CH2, &oc);
+
+ LL_TIM_SetAutoReload(TIM3, 999);
+ LL_TIM_OC_SetMode(TIM3, LL_TIM_CHANNEL_CH2, LL_TIM_OCMODE_INACTIVE);
+
+ LL_TIM_EnableCounter(TIM3);
+
+ while (LL_TIM_IsEnabledCounter(TIM3))
+ ;
+ // Counter is automatically disabled at the end of cycle
+
+ LL_TIM_DisableDMAReq_CC1(TIM3);
+ LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_4);
+
+ debug_printf("DMA = %08x [%u] (%u remains)\r\n", dma_buffer, !!(dma_buffer & THERMO_Pin), LL_DMA_GetDataLength(DMA1, LL_DMA_CHANNEL_4));
+}
+
+static void ds18b20_send_byte(byte b)
+{
+ LL_TIM_SetAutoReload(TIM3, 99);
+ for (uint m=0x80; m; m >>= 1)
+ {
+ LL_TIM_OC_SetCompareCH2(TIM3, ((b & m) ? 1 : 89));
+ LL_TIM_OC_SetMode(TIM3, LL_TIM_CHANNEL_CH2, LL_TIM_OCMODE_FORCED_ACTIVE);
+ LL_TIM_OC_SetMode(TIM3, LL_TIM_CHANNEL_CH2, LL_TIM_OCMODE_INACTIVE);
+ LL_TIM_EnableCounter(TIM3);
+ while (LL_TIM_IsEnabledCounter(TIM3))
+ ;
+ }
+}
+
+void run_test(void)
+{
+ uint cnt = 0;
+
+ debug_puts("Init\r\n");
+ NVIC_DisableIRQ(TIM3_IRQn);
+
+#if 0
+ LL_GPIO_InitTypeDef GPIO_InitStruct;
+ GPIO_InitStruct.Pin = THERMO_Pin;
+ GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
+ GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
+ GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
+ GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
+ LL_GPIO_Init(THERMO_GPIO_Port, &GPIO_InitStruct);
+ LL_GPIO_SetOutputPin(THERMO_GPIO_Port, THERMO_Pin);
+#endif
+
+ ds18b20_reset();
+
+ for (;;)
+ {
+ LL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
+
+ debug_printf("Tick tock: %d\r\n", cnt);
+ // ds18b20_send_byte(0xcc);
+ ds18b20_reset();
+
+ LL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
+
+ LL_mDelay(100);
+ cnt++;
+ }
+}
+