瑞萨单片机william hill官网
直播中

hehung

8年用户 659经验值
擅长:嵌入式技术
私信 关注
[经验]

【瑞萨RA4系列开发板体验】4. PWM驱动LED

之前发帖:
【瑞萨RA4系列开发板体验】1. 新建工程+按键控制LED
【瑞萨RA4系列开发板体验】2. KEIL环境搭建+STLINK调试+FreeRTOS使用
【瑞萨RA4系列开发板体验】3. KEIL下UART实现printf与scanf重定向

前言

本文将讲解如何使用RA4M2的PWM,板载的三个LED都连接到了GPT上,可以复用为PWM输出。
本文是在KEIL基础上开发的,E2开发方法类似。
本文重点如下:

  1. 使用RASC配置三个LED引脚为PWM输出模式;
  2. 驱动LED1PWM由暗到亮周期性闪烁。

硬件连接

查看原理图,LED连接情况如下:
LED1 - P415
LED2 - P404
LED3 - P4050.png

查看数据手册,了解P415,P404与P405的复用关系如下:
P415 - 复用为GPT0 A
P404 - 复用为GPT3 B
P405 - 复用为GPT1 A
该信息需要记住,配置时需要用到1.png

RASC配置

KEIL菜单 -> Tools -> RA Smart Configurator打开RASC配置工具。

配置引脚

之前将P404,P405,P415引脚配置为了普通IO口,需要先取消掉,选择Disable,否则不能配置为复用关系。2.png

配置GPT复用关系

选择GPT,配置GPT0,GPT1,GPT3,分别对应P415,P404与P405。
选择操作模式为GTIOCA or GTIOCB,因为不需要同时使用GTIOCA与GTIOCB,如果需要同时使用,选择GPTICA and GPIOCB。3.png

配置GPT

配置好了引脚复用关系之后,到Stacks配置窗口配置驱动,选择Timers -> Timer General PWM(r_gpt),使用普通PWM,如下图,需要选择三个,因为需要用到三路GPT。4.png

配置PWM

上一步骤配置了三个GPT,则这一步骤需要将三个GPT都配置为PWM模式并输出,无需设置中断,以下为GPT0的配置,GPT1与GPT3是一样的。

  1. 首先需要使能输出;
  2. 设置名字,为了在代码中调用使用;
  3. 设置Channel,使用那一路GPT,就设置Channel为几,P415为0,P404为3,P405为1;
  4. 设置模式为PWM;
  5. 使能输出设置GTIOCA或者GTIOCB,参考数据手册描述,见上文 硬件连接
    5.png

上述就是所有的配置,配置完成电击生成代码,然后关闭RASC,开始代码开发。

代码实现

因为只是作为测试,所以代码中只驱动了LED1,及使用了timer0,LED2与LED3可根据具体情况自行实现。

代码如下:

uint32_t aa = 0;
void hal_entry(void)
{
	/* Initialize the uart for implement the 'printf' and 'scanf' */
	Uart_Init();
	
	fsp_err_t err = FSP_SUCCESS;
	/* Initializes the module. */
	err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
	/* Handle any errors. This function should be defined by the user. */
	assert(FSP_SUCCESS == err);
	err = R_GPT_Open(&g_timer1_ctrl, &g_timer1_cfg);
	/* Handle any errors. This function should be defined by the user. */
	assert(FSP_SUCCESS == err);
	err = R_GPT_Open(&g_timer3_ctrl, &g_timer3_cfg);
	/* Handle any errors. This function should be defined by the user. */
	assert(FSP_SUCCESS == err);
	/* Start the timer. */
	(void) R_GPT_Start(&g_timer0_ctrl);

	/* Only driver P415 for Demo */
    err = R_GPT_PeriodSet(&g_timer0_ctrl, 10000);// frequency
    assert(FSP_SUCCESS == err);

	while (1) 
	{
        err = R_GPT_DutyCycleSet(&g_timer0_ctrl, aa, GPT_IO_PIN_GTIOCA);// duty cycle
        assert(FSP_SUCCESS == err);
        R_BSP_SoftwareDelay (10, BSP_DELAY_UNITS_MILLISECONDS);
		aa += 10;
		if (aa > 10000)
			aa = 0;
	}

#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

效果展示

见底部视频

PWM演示视频

更多回帖

发帖
×
20
完善资料,
赚取积分