代码仓库:

git clone https://gitee.com/jumayusi/unit7-gd32-tim.git

7.1 基于定时器实现计时功能

ARM32位单片机定时器外设一览:

定时器的常规用途可以概括为三点:定时计数、输出比较(PWM)和输入捕获(红外遥控输入)。

定时器资源概述如下,一共(0~13)14个定时器,从左到右功能性递减。

预分频计数器、自动重装载计数器和时钟主频这老三样我们就不再罗嗦了。

定时器配置周期定时中断的一般方法:

7.2 基于PWM实现呼吸灯

GD32F303ZET6所有定时器对应的GPIO口:

其中ON代表互补输出。

CHxCV寄存器需要参与PWM方波的生成:

现成的prompt,看看吧:

PWM的有效电平

精准图例:

注意:

7.3 基于输入捕获测量PWM周期

本节课的目标是用PA0实现定时器输入捕获。

输入捕获模式可以用来测量信号周期频率或脉冲宽度。

输入捕获原理示意图:

配置流程:

7.4 红外遥控简介及应用层代码实现

本讲主要介绍的是NEC红外通信协议,它是一种调制载波信号,频率为38KHz。

发送端数据帧结构:

起始信号(引导码)和停止位之间存在32bit数据,用户码通常用来存储原厂信息,数据码存储具体的按键功能指令。

接收端数据帧介绍:

本节课需要操作定时器7的通道0:

7.5 红外遥控驱动层代码实现

以接收0x55为例:

代码实现:

#define TICK_HEAD_MAX 20000   //引导码最大值
#define TICK_HEAD_MIN 10000
#define TICK_0_MAX    1800
#define TICK_0_MIN    500
#define TICK_1_MAX    3000
#define TICK_1_MIN    1800

static uint8_t g_irCode[4];
static bool g_irCodeFlag = false;
static void ParseIrFrame(uint32_t tickNum)
{  
  static bool s_headFlag = false;
  static uint8_t s_Index = 0;

  if(tickNum > TICK_HEAD_MIN && tickNum < TICK_HEAD_MAX)
  {
    s_headFlag = true;
    return;
  }
  if(!s_headFlag)
  { 
    return;
  }
  if(tickNum > TICK_1_MIN && tickNum < TICK_1_MAX)
  {
     g_irCode[s_Index/8]>>=1;
     g_irCode[s_Index/8] |= 0x80;
     s_Index++;
  }
  if(tickNum > TICK_0_MIN && tickNum < TICK_0_MAX)
  {
     g_irCode[s_Index/8]>>=1;
     s_Index++;
  }

  if(s_Index==32)
  {
    if((g_irCode[2] & g_irCode[3])==0)  //反码判断
    {
       g_irCodeFlag=true;
    }
    else
    {
      g_irCodeFlag=false;
  
    }
    s_headFlag=false;
    s_Index=0;
  }
}

7.6 基于输入捕获测量PWM脉宽

示例代码:

这种配置是为了实现PWM输入模式(PWM Input Mode),利用定时器的两个捕获通道同时测量PWM的周期脉宽

核心原理:

  1. 主从通道配合

    • CH0(主通道):通常配置为上升沿捕获,用于检测PWM周期的起点
    • CH1(从通道):配置为下降沿捕获(如代码所示),用于检测高电平结束点
  2. INDIRECTTI 的作用

    • TIMER_IC_SELECTION_INDIRECTTI 表示CH1不直接采集自己的引脚信号,而是交叉采集CH0对应的输入信号
    • 这样CH0和CH1实际上监测的是同一个物理引脚上的PWM信号
  3. 测量过程

    • CH0捕获上升沿 → 记录时刻T1(周期起点)
    • CH1捕获下降沿 → 记录时刻T2(高电平结束)
    • CH0再次捕获上升沿 → 记录时刻T3(下一个周期起点)
    • 脉宽 = T2 - T1
    • 周期 = T3 - T1

为什么必须这样设置?

如果CH1使用 DIRECTTI(直接采集),它只能捕获自己引脚的信号,无法与CH0同步测量同一个PWM波形。使用 INDIRECTTI 才能让两个通道协同工作,通过硬件自动完成周期和脉宽的精确测量,无需软件干预时序。

GD官方提供了API捕获测量PWM,在AI时代要注意地方代码提示的幻觉避免使用错误函数。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐