2025年5月

相当于手动更新CCR的值
特点:

  1. 定时器连续运行不中断,中间执行代码不影响计时精度
    流程:
  2. 重置CNT寄存器
  3. 启动定时器
  4. 设置输出高电平
  5. 计算CCR的值
  6. 等待CNT到达当前CCR计数器

    /*
    定时器频率 250Mhz,则TIMx->CNT每4ns就加一
    如果需要延迟0.4us则需要100个定时器时钟
    */
    #define WS2812_T0H    100
    #define WS2812_T1H    200
    #define WS2812_T0L    212
    #define WS2812_T1L    112
    #define WS2812_RESET  12500
    
    
    void Bsp_Ws2812Write(uint32_t* pdata, int length) {
     uint16_t count = 0;
     
     TIMx->CNT = 0;
     HAL_TIM_Base_Start(&htimx);
     PIN = 1;
     for (int i = 0; i < length; i++) {
         uint32_t data = *pdata++;
         for (int d = 0; d < 24; d++) {
             if (data & 0x800000) {
                 /* 发送1 */
                 count += WS2812_T1H;
                 while (TIMx->CNT - count > 0);
                 PIN = 0;
                 count += WS2812_T1L;
                 while (TIMx->CNT - count > 0);
                 PIN = 1;
             } else {
                 /* 发送0 */
                 count += WS2812_T0H;
                 while (TIMx->CNT - count > 0);
                 PIN = 0;
                 count += WS2812_T0L;
                 while (TIMx->CNT - count > 0);
                 PIN = 1;
             }
             data <<= 1;
         }
     }
     /* 复位 */
     PIN = 0;
     count += WS2812_RESET;
     while (TIMx->CNT - count > 0);
     HAL_TIM_Base_Stop(&htimx);
    }

模拟开关,兼容 1.8V 逻辑电平

供电

VDD 为正供电,VSS 为负供电,GND 为地
如果单电源供电,即 VSS = GND,则 VDD 的范围为 5-24V
如果为双电源供电,即 VSS < GND < VDD,则需满足 5V <= VDD - VSS <= 24V,且 VDD >= 5V

逻辑控制

EN#A0A1A2 为逻辑控制引脚,可接受电压范围 GND ~ VDD
兼容1.8V电平,即 <= 0.8V 认为是低电平,> 1.35V 认为是高电平 (赞!)

其他的4051的高电平电压很高,需要高达 VSS * 0.7,这不得不再加两个三极管产生这个高电平

模拟开关的电压范围

整个 VSS ~ VDD 范围可用,但是在 VSS + 4V ~ VDD - 4V 的范围内达到最佳性能(内阻最小,60Ω)
对电流方向无要求
2025-05-15T04:02:29.png