RTT 官方瑞萨HMI开发板pwm驱动使用
  eOhAXuwlF7gu 2023年11月12日 25 0

GPT PWM 开发注意事项: 1 . 必须使用英文的开发环境,否则回编译报错 1.第一步建立一个不依赖RTT的项目

1.1GPT配置

RTT 官方瑞萨HMI开发板pwm驱动使用_#define

1.2gpt pwm 配置

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_02

1.3这是mdk使用gptc产生pwm信号的代码 在RASC配置完成以后,mdk需要的写的代码就很少

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_03

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 <rtthread.h>
//输出开关
#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工程即可。

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_04

2.2PWM驱动管理结构

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_05

2.3构建对象

RTT 官方瑞萨HMI开发板pwm驱动使用_应用层_06

利用宏构造对象

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_07

注册pwm设备

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_08

控制函数

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

RTT 官方瑞萨HMI开发板pwm驱动使用_应用层_09

pwm设置函数

RTT 官方瑞萨HMI开发板pwm驱动使用_自定义_10

pwm开关函数

RTT 官方瑞萨HMI开发板pwm驱动使用_应用层_11

添加自己需要的pwm

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

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

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_12

使能gpt

RTT 官方瑞萨HMI开发板pwm驱动使用_应用层_13

建立栈

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_14

配置g_timer pwm

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_15

复制文件base_addresses.h 到文件--版本兼容问题 第一次编译提示找不到base_addresses.h 头文件

RTT 官方瑞萨HMI开发板pwm驱动使用_应用层_16

修改renesas.h--版本兼容问题 第二次修改提示TCEN未定义

RTT 官方瑞萨HMI开发板pwm驱动使用_应用层_17

新增宏定义是打开pwm通道1 这里有2种方式 1 . 直接修改rtconfig.h 2 . 或者修改board文件夹下KConfig的文件,然后再env生成是能pwm1 3 . 直接修改rtconfig.h

#define BSP_USING_PWM1

RTT 官方瑞萨HMI开发板pwm驱动使用_自定义_18

1 . 或者修改board文件夹下的文件--但是修改了这里需要menuconfig配置生成工程

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_19

RTT 官方瑞萨HMI开发板pwm驱动使用_自定义_20

编译

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_21

lvgl使用pwm5 实例

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_22

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

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_23

//自定义应用层pwm使用实例

//自定义应用层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

RTT 官方瑞萨HMI开发板pwm驱动使用_#define_24


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  sLjOnCldvVSM   2023年11月12日   37   0   0 #include#definec++
  UYSNSBVoGd8R   2023年12月08日   22   0   0 引脚#include#define