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

news2024/11/18 3:21:31

方案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.安装最新板的开发包

在这里插入图片描述

2.安装最新版Pyocd

在这里插入图片描述

2.1不安装可能下载报错

在这里插入图片描述

3.新建工程

在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

5.配置gpt 定时器

在这里插入图片描述

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

在这里插入图片描述

6.1pwm输出配置方法

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sF3OuK48-1686920139902)(picture/image-20230616195644959.png)]

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

}

在这里插入图片描述

测试结果:

在这里插入图片描述

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

开发注意事项:

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

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

1.1GPT配置

在这里插入图片描述

1.2gpt pwm 配置

在这里插入图片描述

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

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

在这里插入图片描述

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工程即可。

在这里插入图片描述

2.2PWM驱动管理结构

在这里插入图片描述

2.3构建对象

在这里插入图片描述

利用宏构造对象

在这里插入图片描述

注册pwm设备

在这里插入图片描述

在这里插入图片描述

控制函数

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

在这里插入图片描述

pwm设置函数

在这里插入图片描述

pwm开关函数

在这里插入图片描述

添加自己需要的pwm

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

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

在这里插入图片描述

使能gpt

在这里插入图片描述

建立栈

在这里插入图片描述

配置g_timer pwm

在这里插入图片描述

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

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

在这里插入图片描述

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

第二次修改提示TCEN未定义

在这里插入图片描述

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

这里有2种方式

  1. 直接修改rtconfig.h

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

  3. 直接修改rtconfig.h

#define BSP_USING_PWM1

在这里插入图片描述

  1. 或者修改board文件夹下的文件–但是修改了这里需要menuconfig配置生成工程
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

编译

在这里插入图片描述

lvgl使用pwm5 实例

在这里插入图片描述

自己使用自己的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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/654169.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈Java的IO与Netty

一、Java的IO((Input/Output))模型 传统IO和Java NIO最大的区别是传统的IO是面向流&#xff0c;NIO是面向Buffer Socket之间建立链接及通信的过程&#xff01;实际上就是对TCP/IP连接与通信过程的抽象: 1.服务端Socket会bind到指定的端口上&#xff0c;Listen客户端的”插入”…

如何迁移现有应用和数据到阿里云服务器?有哪些迁移工具和方法?

如何迁移现有应用和数据到阿里云服务器&#xff1f;有哪些迁移工具和方法&#xff1f;   随着云计算技术的不断发展&#xff0c;越来越多的企业和个人开始将应用和数据迁移到云服务器上。阿里云作为国内领先的云服务提供商&#xff0c;为用户提供了一系列方便可靠的应用和数据…

2023开放原子全球开源峰会参会感受:英特尔开源技术合作与产品创新

2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新 文章目录 2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新一. 引言二. 6.11参会感受2.1 英特尔基础软件开放生态合作2.2 Celadon加速安卓在英特尔架构上的产品创新2.3 面…

ASEMI代理光宝高速光耦LTV-5341参数,LTV-5341应用

编辑-Z LTV-5341参数描述&#xff1a; 型号&#xff1a;LTV-5341 储存温度Tstg&#xff1a;-55~125℃ 工作温度Topr&#xff1a;-40~110℃ 总输出电源电压(VCC –VEE)&#xff1a;35V 平均正向输入电流IF&#xff1a;20mA 峰值瞬态输入电流IF(TRAN)&#xff1a;1A 输入…

【面试中的网络知识】DNS原理-如何实现域名和IP地址的查询转换

接上一篇&#xff0c;理解 浏览器是如何生成HTTP消息的 &#xff0c;最好是按照顺序来读。  从上一篇博客我们得知浏览器是如何生成了HTTP消息了&#xff0c;但是浏览器作为应用程序&#xff0c;是不具备向网络中发送请求的能力&#xff0c;而是需要委托给操作系统的内核协议栈…

淘宝详情页分发推荐算法总结:用户即时兴趣强化

转子&#xff1a;https://juejin.cn/post/6992169847207493639 商品详情页是手淘内流量最大的模块之一&#xff0c;它加载了数十亿级商品的详细信息&#xff0c;是用户整个决策过程必不可少的一环。这个区块不仅要承接用户对当前商品充分感知的诉求&#xff0c;同时也要能肩负起…

必学KVM技术详解包括所有技能

KVM虚拟化进阶学习 一&#xff0c;KVM命令行安装 图形化安装教程&#xff1a;https://blog.csdn.net/weixin_53678904/article/details/125950867?spm1001.2014.3001.5501 1.存储池管理 ​ KVM必须要配置⼀个⽬录当作他存储磁盘镜像(存储卷)的⽬录&#xff0c;我们称这个⽬…

通达信筹码单峰密集选股公式,突破筹码密集区发出信号

筹码密集是相对筹码发散而言的&#xff0c;筹码分布在宽广的价格区间&#xff0c;这种状态就是筹码发散&#xff08;如下图&#xff09;&#xff0c;而且筹码峰像群山一样&#xff0c;有多个高峰&#xff0c;属于多峰形态。 与之相对的&#xff0c;筹码分布在比较窄的价格区间&…

Armbian安装1panel教程

文章目录 一 1panel简介二 检测是否安装1Panel三 环境要求四 安装操作指导4.1 确定系统类型4.2 执行安装命令4.3 访问1panel面板4.4 设置1panel访问配置4.5 查看访问1panel面板入口 五 常用命令总结 一 1panel简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 二…

New Bing使用教程

New Bing使用教程 New Bing简介前提条件使用技巧 New Bing简介 New Bing是微软推出的一款基于GPT4模型的智能搜索引擎&#xff0c;它不仅可以提供高质量的搜索结果&#xff0c;还可以与用户进行自然语言交互。 用户只需安装Edge浏览器即可使用&#xff0c;但现实使用中会出现…

驱动操作 驱动移植试验和Source Insight添加项目

目录 驱动移植 》1.需要有一个驱动对应的 .c代码 》2.将.c文件放入到对应的文件夹内 》3.修改Makefile文件 》4.修改Kconfig菜单 》5.到顶层目录配置自己驱动 》6.编译成模块 》7.此时用的开发板上内核的编译器&#xff0c;安装得到开发板上进行安装 》8.在开发板上进…

标准IO和文件IO分别实现cp功能(嵌入式学习)

标准IO和文件IO分别实现cp功能 标准IO实现cp功能标准IO概念代码实现 文件IO实现cp功能文件IO概念代码实现 标准IO实现cp功能 标准IO概念 想了解标准IO的概念&#xff0c;请点击这里——》IO进程——标准IO&#xff08;嵌入式学习&#xff09; IO进程——标准IO&#xff08;嵌…

【C语言】三子棋详解(包教包会的那种)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 三子棋及五子棋详解 前言三子棋的实现1. 打印菜单2.初始化并打印棋盘棋盘初始化函数功能的实现打印棋盘 3.玩家下棋与模拟电脑下棋玩家下棋电脑下棋随机数的生成 4.判断输赢我们的game函数 源码game.hgame.ctest.c 总结 …

PMP课堂模拟题目及解析(第18期)

171. 一个项目已经结束&#xff0c;然而&#xff0c;项目经理和项目团队成员仍然被要求解决技术问题&#xff0c;进行一些变更&#xff0c;并评估新的需求。若要保证项目开发的产品或服务现在具有运营支持&#xff0c;项目经理应该执行下列哪些工作&#xff1f; &#xff08;选…

Nacos配置中心交互模型是push还是pull?

对于Nacos大家应该都不太陌生&#xff0c;出身阿里名声在外&#xff0c;能做动态服务发现、配置管理&#xff0c;非常好用的一个工具。然而这样的技术用的人越多面试被问的概率也就越大&#xff0c;如果只停留在使用层面&#xff0c;那面试可能要吃大亏。 比如我们今天要讨论的…

44从零开始学Java之详解容易让初学者懵圈的abstract抽象类、抽象方法

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 经过前面几篇文章的讲解&#xff0c;我们现在已经对面向对象有了基本的认知&#xff0c;掌握了面向对…

基于Java员工信息管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

2.04_基于矩阵分解的协同过滤推荐

矩阵分解发展史 Traditional SVD: 通常SVD矩阵分解指的是SVD(奇异值)分解技术,在这我们姑且将其命名为Traditional SVD(传统并经典着)其公式如下: Traditional SVD分解的形式为3个矩阵相乘,中间矩阵为奇异值矩阵。如果想运用SVD分解的话,有一个前提是要求矩阵是稠密…

AAC ADTS格式分析

标题 1.AAC简介2. AAC ADTS格式分析2.1 adts_fixed_header详细介绍2.2 adts_variable_header详细介绍 1.AAC简介 AAC音频格式:Advanced Audio Coding(⾼级⾳频解码)&#xff0c;是⼀种由MPEG-4标准定义的有损⾳频压缩格式&#xff0c;由Fraunhofer发展&#xff0c;Dolby, Sony…

[CISCN 2023 初赛]puzzle 解析

打开文件包给了一堆拼图碎片&#xff0c;由于文件数量高达2880张&#xff0c;这里不考虑gaps的方式进行修正拼图 &#xff08;因为跑了也只会把gaps跑冒烟&#xff09; tmp类型的拼图&#xff0c;因为tmp文件特性在文件头的位置会有其在原图片上的位置坐标 于是&#xff0c;我…