You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于ADC数据每秒10段存储至SD卡的定时器配置与分段传输问题

Solution for Your ADC Data Batch-Writing to SD Card

Let's break down your two key problems and give practical, embedded-friendly solutions that fit with your existing zero-crossing detection code.

1. Configuring a Timer to Achieve 10 Segments Per Second

First, let's clarify the timing: 10 segments per second means we need to write one segment every 100ms (since 1000ms / 10 = 100ms). Here's how to implement this with a hardware timer (assuming you're using a microcontroller like STM32, Arduino, or similar):

  • Calculate Timer Parameters:
    For a typical 72MHz system clock (adjust based on your MCU):

    • Prescaler: Set to 7199 (divides 72MHz down to 10kHz)
    • Auto-reload value: 999 (10kHz * 100ms = 1000 ticks, so 0-999 gives 100ms per interrupt)
      Note: Tweak these numbers to match your MCU's actual clock frequency.
  • Set Up Timer Interrupt:
    Enable the timer's update interrupt. Don’t do the SD card write directly in the interrupt service routine (ISR)—SD operations are slow and will block critical timing. Instead:

    • Set a simple global flag (e.g., flag_write_segment = true)
    • Or push a "write request" to a lightweight queue (if you’re using an RTOS)
  • Link with Your Zero-Crossing Code:
    Every time your zero-crossing function identifies a new data segment, store that segment in a thread-safe buffer (like a circular buffer). This ensures you have segments ready to write when the timer triggers.

2. Pausing After 10 Segments, Then Resuming

You’ll need a counter to track batch progress, plus logic to pause and restart the timer:

  • Add a Segment Counter:
    Declare a global or static variable (e.g., uint8_t segment_count = 0). Every time you successfully write a segment to SD:

    segment_count++;
    if (segment_count >= 10) {
      // Trigger pause
      HAL_TIM_Base_Stop_IT(&htimX); // Stop the write timer (adjust for your SDK/HAL)
      segment_count = 0;
      flag_paused = true;
    }
    
  • Implement Pause Duration:
    Decide how long to pause (e.g., 1 second, or wait for an external trigger):

    • For a fixed pause: Use a second timer (or reuse the same timer in one-shot mode) to count the pause time. When it triggers:
      HAL_TIM_Base_Start_IT(&htimX); // Restart the write timer
      flag_paused = false;
      
    • For an external trigger (e.g., button press): Add a check in your main loop:
      while (flag_paused) {
        if (external_trigger_detected()) {
          HAL_TIM_Base_Start_IT(&htimX);
          flag_paused = false;
          break;
        }
        HAL_Delay(10); // Avoid busy-waiting
      }
      
  • Main Loop Logic (Critical!):
    Keep your main loop focused on handling write requests and pause logic so SD operations don’t block time-sensitive tasks:

    while (1) {
      if (flag_write_segment && !flag_paused && buffer_not_empty()) {
        // Pull the next segment from your buffer
        adc_segment_t next_segment = buffer_pop();
        // Write to SD using your existing function
        sd_write_segment(&next_segment);
        // Clear the write flag
        flag_write_segment = false;
      }
    
      // Handle external trigger pause here if needed
      if (flag_paused && external_trigger_detected()) {
        HAL_TIM_Base_Start_IT(&htimX);
        flag_paused = false;
      }
    }
    

Key Notes to Avoid Issues

  • Buffer Safety: Use a thread-safe circular buffer with atomic read/write pointers—your zero-crossing code and timer interrupt will access the buffer concurrently.
  • SD Latency: If SD writes take longer than 100ms, increase your buffer size or use DMA for SD operations if your MCU supports it to avoid dropping segments.
  • Timer Precision: Stick to hardware timers instead of software delays—software delays drift when other tasks run.

内容的提问来源于stack exchange,提问作者joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:41:34