瑞萨RA系列mcu学习笔记--RTT-pwm驱动

方案1:Studio 2.2.6和使用了RASC3.5下使用pwm驱动

开发环境必须说一下,本人在在开发环境的问题上栽了一个跟头,

  1. 使用最新版的RTT Studio 2.2.6和使用了RASC4.0的版本生成的公共编译ok,但是一下载到mcu就直接不能运行:最后使用的rasc3.5 + RTT Studio 2.2.6才解决问题
  2. 使用mdk +RASC4.0 +scons 开发就没有问题

简介

通用 PWM 定时器(GPT,General PWM Timer)是 RA MCU 的其中一种 32/16 位的定时器外设。 在 GPT 当中,可分为 GPT32 和 GPT16,它们最主要的区别是计数器的不同

定时器(Timer)最基本的功能就是定时,比如定时发送串口数据、定时采集 AD 数据、定时触 发中断处理其它事务等等。如果把定时器与 GPIO 引脚结合起来使用的话可以实现更加丰富的功 能,可以对输入信号进行计数,可以测量输入信号的脉冲宽度,可以输出单个脉冲、PWM 等波 形,等等

GPT 模块可用于计数事件、测量外部输入信号、作为通用计时器并产生周期性中断、以及输出周 期性或 PWM 信号到 GTIOC 引脚

1.安装最新板的开发包

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第1张图片

2.安装最新版Pyocd

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第2张图片

2.1不安装可能下载报错

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第3张图片

3.新建工程

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第4张图片

4.选择rasc的路径,注意选择到这个位置 版本必须是3.5的版本,我用的4.0 不可以

C:\Renesas\RA\sc_v2021-10_fsp_v3.5.0

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第5张图片

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第6张图片

5.配置gpt 定时器

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第7张图片

6.配置定时器位pwm输出方式

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第8张图片

6.1pwm输出配置方法

注意这里的名字必须是g_timer1(g_timerX)

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第9张图片

7.修改board文件夹下的KConfig 文件内容,下一步才会有pwm1的选择

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第10张图片
瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第11张图片

8.打开rtt的配置使能pwm选项和pwm1使能

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第12张图片

9.在hal_entery.c文件添加应用层使用函数

//自定义应用层pwm使用实例
void open_pwm_output(void)
{
#ifdef BSP_USING_PWM1
#define LCD_PWM_DEV_NAME    "pwm1"
#define LCD_PWM_DEV_CHANNEL 0

    struct rt_device_pwm *pwm_dev;

    /* turn on the LCD backlight */
    pwm_dev = (struct rt_device_pwm *)rt_device_find(LCD_PWM_DEV_NAME);
    /* pwm frequency:100K = 10000ns */
    rt_pwm_set(pwm_dev, LCD_PWM_DEV_CHANNEL, 10000, 5000);
    rt_pwm_enable(pwm_dev, LCD_PWM_DEV_CHANNEL);
#endif

}

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第13张图片

测试结果:

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第14张图片

方案2:GPT PWMmdk 的开发环境使用的说明

开发注意事项:

  1. 必须使用英文的开发环境,否则回编译报错
  2. 开发使用的是rasc4.4的开发环境+mdk的方式

1.第一步建立一个不依赖RTT的项目

1.1GPT配置

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第15张图片

1.2gpt pwm 配置

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第16张图片

1.3这是mdk使用gptc产生pwm信号的代码

在RASC配置完成以后,mdk需要的写的代码就很少

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第17张图片

2.接下来看看RTT的pwm驱动框架

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-05-07     aozima       the first version
 * 2022-09-24     yuqi         add phase and dead time configuration
 */

#ifndef __DRV_PWM_H_INCLUDE__
#define __DRV_PWM_H_INCLUDE__

#include 
//输出开关
#define PWM_CMD_ENABLE      (RT_DEVICE_CTRL_BASE(PWM) + 0)
#define PWM_CMD_DISABLE     (RT_DEVICE_CTRL_BASE(PWM) + 1)
//pwm输出占空比和设置获取
#define PWM_CMD_SET         (RT_DEVICE_CTRL_BASE(PWM) + 2)
#define PWM_CMD_GET         (RT_DEVICE_CTRL_BASE(PWM) + 3)
//互补输出开关
#define PWMN_CMD_ENABLE     (RT_DEVICE_CTRL_BASE(PWM) + 4)
#define PWMN_CMD_DISABLE    (RT_DEVICE_CTRL_BASE(PWM) + 5)
//设置定时器的重载值
#define PWM_CMD_SET_PERIOD  (RT_DEVICE_CTRL_BASE(PWM) + 6)
//设置比较值
#define PWM_CMD_SET_PULSE   (RT_DEVICE_CTRL_BASE(PWM) + 7)
//设置死区时间
#define PWM_CMD_SET_DEAD_TIME  (RT_DEVICE_CTRL_BASE(PWM) + 8)
//设置相位
#define PWM_CMD_SET_PHASE   (RT_DEVICE_CTRL_BASE(PWM) + 9)
//开关中断
#define PWM_CMD_ENABLE_IRQ  (RT_DEVICE_CTRL_BASE(PWM) + 10)
#define PWM_CMD_DISABLE_IRQ  (RT_DEVICE_CTRL_BASE(PWM) + 11)

struct rt_pwm_configuration
{
    rt_uint32_t channel; /* 0 ~ n or 0 ~ -n, which depends on specific MCU requirements */
    rt_uint32_t period;  /* unit:ns 1ns~4.29s:1Ghz~0.23hz */
    rt_uint32_t pulse;   /* unit:ns (pulse<=period) */
    rt_uint32_t dead_time;  /* unit:ns */
    rt_uint32_t phase;  /*unit: degree, 0~360, which is the phase of pwm output, */
    /*
     * RT_TRUE  : The channel of pwm is complememtary.
     * RT_FALSE : The channel of pwm is nomal.
    */
    rt_bool_t  complementary;
};

struct rt_device_pwm;
//pwm 控制函数,根据不同的命令分别执行不同的控制函数
struct rt_pwm_ops
{
    rt_err_t (*control)(struct rt_device_pwm *device, int cmd, void *arg);
};

//rtt pwm驱动框架的设备注册对象类型
struct rt_device_pwm
{
    struct rt_device parent;
    const struct rt_pwm_ops *ops;
};
//pwm 对象的设备注册函数
rt_err_t rt_device_pwm_register(struct rt_device_pwm *device, const char *name, const struct rt_pwm_ops *ops, const void *user_data);
/*设置pwm的使能和失能*/
rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel);
rt_err_t rt_pwm_disable(struct rt_device_pwm *device, int channel);

/*设置pwm的频率和占空比*/
rt_err_t rt_pwm_set(struct rt_device_pwm *device, int channel, rt_uint32_t period, rt_uint32_t pulse);
rt_err_t rt_pwm_set_period(struct rt_device_pwm *device, int channel, rt_uint32_t period);
rt_err_t rt_pwm_set_pulse(struct rt_device_pwm *device, int channel, rt_uint32_t pulse);

/*设置pwm的死区时间*/
rt_err_t rt_pwm_set_dead_time(struct rt_device_pwm *device, int channel, rt_uint32_t dead_time);
/*设置pwm的相位*/
rt_err_t rt_pwm_set_phase(struct rt_device_pwm *device, int channel, rt_uint32_t phase);

#endif /* __DRV_PWM_H_INCLUDE__ */

根据观察

  1. 官方提供的pwm设备驱动提供了 “rt_pwm_ops”对象,然后在驱动中根据命令的类型,实现各种pwm控制的功能
  2. 使用 “rt_device_pwm_register” 实现了pwm对象的注册

2.1驱动实现分析mdk工程即可

其实RTT官方已经提供了本次活动的驱动函数,我们只需要根据硬件情况使用RASC配置一下,然后配置修改KConfig文件,最后env生成mdk工程即可。

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第18张图片

2.2PWM驱动管理结构

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第19张图片

2.3构建对象

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第20张图片

利用宏构造对象

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第21张图片

注册pwm设备

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第22张图片

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第23张图片

控制函数

根据控制命令的类型调用不同的函数

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第24张图片

pwm设置函数

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第25张图片

pwm开关函数

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第26张图片

添加自己需要的pwm

  1. 配置修改之前先备用原来的工程,因为RASC 版本不兼容的问题导致 使用rasc4.4.0生成的代码编译不过,我的电脑只安装了4.4.0

  2. RTT官方原来使用的是RASC3.5.0

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第27张图片

使能gpt

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第28张图片

建立栈

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第29张图片

配置g_timer pwm

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第30张图片

复制文件base_addresses.h 到文件–版本兼容问题

第一次编译提示找不到base_addresses.h 头文件

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第31张图片

修改renesas.h–版本兼容问题

第二次修改提示TCEN未定义

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第32张图片

新增宏定义是打开pwm通道1

这里有2种方式

  1. 直接修改rtconfig.h

  2. 或者修改board文件夹下KConfig的文件,然后再env生成是能pwm1

  3. 直接修改rtconfig.h

#define BSP_USING_PWM1

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第33张图片

  1. 或者修改board文件夹下的文件–但是修改了这里需要menuconfig配置生成工程
    瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第34张图片

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第35张图片

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第36张图片

编译

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第37张图片

lvgl使用pwm5 实例

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第38张图片

自己使用自己的pwm通道输出

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第39张图片

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第40张图片

//自定义应用层pwm使用实例
void open_pwm_output(void)
{
#ifdef BSP_USING_PWM1
#define LCD_PWM_DEV_NAME    "pwm1"
#define LCD_PWM_DEV_CHANNEL 0

    struct rt_device_pwm *pwm_dev;

    /* turn on the LCD backlight */
    pwm_dev = (struct rt_device_pwm *)rt_device_find(LCD_PWM_DEV_NAME);
    /* pwm frequency:100K = 10000ns */
    rt_pwm_set(pwm_dev, LCD_PWM_DEV_CHANNEL, 10000, 7000);
    rt_pwm_enable(pwm_dev, LCD_PWM_DEV_CHANNEL);
#endif

}


测试结果:

测试结果:

检测P405 输出pwm

瑞萨RA系列mcu学习笔记--RTT-pwm驱动_第41张图片

你可能感兴趣的:(RTT,单片机,瑞萨,pwm,rtt)