Skip to content

软件部分

1 新建工程

将先前创建的04_SPI_TFT文件夹复制一份,并将文件夹重命名为06_PWM_Dimming。TFT文件的前去论坛该帖子中的末尾附件处下载。

在e2s里面,选择菜单栏的文件--导入--常规--现有项目到工作空间中--选择根目录"浏览"--完成。

2 配置工程

2.1 配置GPT5

GPT即General PWM Timer,是 RA MCU 的其中一种 32/16 位的定时器外设。

如下图所示找到GPT5,并把通道B配置为P206。

alt text

2.2 新建并设置模块属性

点击Stacks,New Stack--Timers--Timer General PWM(r_gpt)。点击刚生成的模块-属性,我们只需要改动下图所示的地方。

alt text

2.3 生成代码

保存配置文件,并点击Generate Project Content让其自动为我们生成代码。

3 编写代码

修改hal_entry.c文件,在hal_entry函数之前,添加如下内容:

c
void GPT_PWM_SetDuty(uint8_t duty);
void GPT_PWM_SetDuty(uint8_t duty)
{
    timer_info_t info;
    uint32_t current_period_counts;
    uint32_t duty_cycle_counts;

    if (duty > 100)
        duty = 100; //限制占空比范围:0~100

    /* 获得GPT的信息 */
    R_GPT_InfoGet(&g_timer5_ctrl, &info);

    /* 获得计时器一个周期需要的计数次数 */
    current_period_counts = info.period_counts;

    /* 根据占空比和一个周期的计数次数计算GTCCR寄存器的值 */
    duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);

    /* 最后调用FSP库函数设置占空比 */
    R_GPT_DutyCycleSet(&g_timer5_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB);
}

上面是加了个设置PWM占空比的函数

hal_entry函数内让用户编写的部分改为如下内容

c
uint8_t brightness = 100;
fsp_err_t err = R_SPI_Open(&g_spi1_ctrl, &g_spi1_cfg);
assert(FSP_SUCCESS == err);
R_IOPORT_PinWrite(&g_ioport_ctrl, RST, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, RST, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(150, BSP_DELAY_UNITS_MILLISECONDS);
LCD_Init();
LED_ON();

R_GPT_Open(&g_timer5_ctrl, &g_timer5_cfg);
R_GPT_Start(&g_timer5_ctrl);
GPT_PWM_SetDuty(brightness);

LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
LCD_ShowString(32,20,(uint8_t *)"RA4E2",RED,BLACK,24,0);
LCD_ShowString(8,50,(uint8_t *)"SPI-LCD",BLUE,BLACK,32,0);
LCD_ShowString(4,80,(uint8_t *)"brightness",GREEN,BLACK,24,0);
while(1){
    GPT_PWM_SetDuty(brightness);
    LCD_ShowIntNum(48,110,brightness,2,GREEN,BLACK,32);
    brightness--;
    if(brightness <1)
        brightness = 100;
    R_BSP_SoftwareDelay(50, BSP_DELAY_UNITS_MILLISECONDS);
}

这段内容是每隔50ms就降低1%的占空比,从0~100循环,并把占空比实时显示在屏幕上。