软件部分
将先前的项目模板复制一份,重命名为01_PWM-lED
1 GPT-PWM配置
点击configuration.xml文件,
| 步骤 | 操作 |
|---|---|
| 1 | 在左侧项目资源管理器中,点击configuration.xml文件。 |
| 2 | 点击界面下方标签栏中的Pins标签,进入引脚配置界面。 |
| 3 | 在Pin Selection区域,展开Timers:GPT,选择GPT2。 |
| 4 | 在Pin Configuration区域,将Operation Mode设置为GTIOCA or GTIOCB。 |
| 5 | 在Pin Configuration区域,勾选GTIOCA下的P103引脚。 |

接着来到Stacks选项卡,
| 步骤 | 操作 |
|---|---|
| 1 | 在界面下方标签栏,点击Stacks标签,进入堆栈配置页面 |
| 2 | 在HAL/Common Stacks区域,点击New Stack按钮 |
| 3 | 在弹出菜单中,选择Timers选项 |
| 4 | 在Timers子菜单中,选择Timer, General PWM (r_gpt) |

| 序号 | 操作 |
|---|---|
| 1 | 在HAL/Common Stacks区域,点击选中g_timer2 Timer, General PWM (r_gpt)。 |
| 2 | 在下方属性设置区域,找到General部分,配置参数:Name为g_timer2,Channel为2,Mode为Periodic,Period为1,Period Unit为Kilohertz。 |
| 3 | 在Custom Waveform部分,设置Duty Cycle Percent (only applicable in PWM mode)为50,GTIOCA Output Enabled为True,GTIOCA Stop Level为Pin Level Low,GTIOCB Output Enabled为False,GTIOCB Stop Level为Pin Level Low。 |
| 4 | 在Pins部分,确认GTIOCA2A对应P103。 |

配置完成后,生成项目代码。
2 代码编写
2.1 PWM.c
新建一个源文件PWM.c,里面内容如下:
c
#include "hal_data.h"
// 设置占空比的函数
void GPT_PWM_SetDuty(uint8_t duty)
{
timer_info_t info;
/* 获得GPT的信息 */
R_GPT_InfoGet(&g_timer2_ctrl, &info);
/* 获得计时器一个周期需要的计数次数 */
uint32_t current_period_counts = info.period_counts;
/* 根据占空比和一个周期的计数次数计算GTCCR寄存器的值 */
uint32_t duty_cycle_counts = (uint32_t)(((uint64_t)current_period_counts * duty) / 100);
/* 最后调用FSP库函数设置占空比 */
R_GPT_DutyCycleSet(&g_timer2_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCA);
}2.2 PWM.h
新建一个头文件PWM.c,里面内容如下:
c
#ifndef PWM_H_
#define PWM_H_
void GPT_PWM_SetDuty(uint8_t duty);
#endif /* PWM_H_ */2.3 修改hal_entry.c
在包含头文件部分,添加:
c
#include "PWM.h"在hal_entry函数中,添加代码:
c
typedef enum
{
up = 0,
down
} Direction;
uint8_t dutyNum = 0; // 占空比[0,100]
Direction d = up;
Debug_UART9_Init(); // SCI9 UART 调试串口初始化
R_GPT_Open(&g_timer2_ctrl, &g_timer2_cfg); // 初始化定时器GPT2
R_GPT_Start(&g_timer2_ctrl); // 启动定时器GPT2
while (1)
{
if (d == up)
{
if (dutyNum == 100)
{
d = down;
}
dutyNum++;
}
else
{
if (dutyNum == 0)
{
d = up;
}
dutyNum--;
}
GPT_PWM_SetDuty(dutyNum);
R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MILLISECONDS);
}这段代码作用是,每隔10ms设置一次PWM占空比的值dutyNum。dutyNum是从0递增,若达到100,则转为递减,若降低到0,则转为递增,循环往复。