PN学堂GD32教程第7篇——TIM
定时器的常规用途可以概括为三点:定时计数、输出比较(PWM)和输入捕获(红外遥控输入)。定时器资源概述如下,一共(0~13)14个定时器,从左到右功能性递减。预分频计数器、自动重装载计数器和时钟主频这老三样我们就不再罗嗦了。其中ON代表互补输出。
代码仓库:
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的周期和脉宽。
核心原理:
-
主从通道配合:
- CH0(主通道):通常配置为上升沿捕获,用于检测PWM周期的起点
- CH1(从通道):配置为下降沿捕获(如代码所示),用于检测高电平结束点
-
INDIRECTTI 的作用:
- TIMER_IC_SELECTION_INDIRECTTI 表示CH1不直接采集自己的引脚信号,而是交叉采集CH0对应的输入信号
- 这样CH0和CH1实际上监测的是同一个物理引脚上的PWM信号
-
测量过程:
- CH0捕获上升沿 → 记录时刻T1(周期起点)
- CH1捕获下降沿 → 记录时刻T2(高电平结束)
- CH0再次捕获上升沿 → 记录时刻T3(下一个周期起点)
- 脉宽 = T2 - T1
- 周期 = T3 - T1
为什么必须这样设置?
如果CH1使用 DIRECTTI(直接采集),它只能捕获自己引脚的信号,无法与CH0同步测量同一个PWM波形。使用 INDIRECTTI 才能让两个通道协同工作,通过硬件自动完成周期和脉宽的精确测量,无需软件干预时序。
GD官方提供了API捕获测量PWM,在AI时代要注意地方代码提示的幻觉避免使用错误函数。

更多推荐



所有评论(0)