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

news/2024/5/20 1:09:42/文章来源:https://blog.csdn.net/u010261063/article/details/131253548

方案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 0struct 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 0struct 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.luyixian.cn/news_show_506535.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一下RocketMQ中遇见的 连环大坑!!!差点没把我摔死

目录 环境&#xff1a;Win10 &#xff0c; 不是 linux 首先我遇见的第一个问题是&#xff1a; No route info of this topic 问题原因&#xff1a; PS&#xff1a; 64位系统环境下&#xff0c;如果软件在安装时安装路径默认c:\progarmfiles即为64位&#xff0c;默认c:\pr…

【备战秋招】每日一题:5月13日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第三题-火车调度 在线评测链接:P1288 题目描述 塔子哥是一位火车车厢调度员。 这一天&#xff0c;一列带有 n 个编号车厢的列车进站了&#xff0c;编号为 1\rightarrow …

kafka 报错 - Cannot assign requested address

背景 在华为云服务器上跑了 zookeeper 和 kafka 的 broker&#xff0c;想内外网分流&#xff0c;重点就是做不到从外网去消费&#xff0c;比如用自己的 windows 笔记本去消费。 配置 server.properties 的 listener 为 broker 所在机子的的内网 IP 后&#xff0c;终于能 star…

ECC算法学习(一)算法公式

ECC 一、ECC简介优缺点运用 二、算法理论基础1. 椭圆曲线的加法2. 椭圆曲线的二倍运算3. 同余运算4. 有限域5. 乘法逆元 三、算法公式1、有限域的负元2、有限域的加法&#xff0c; P Q P Q PQ3. 斜率计算&#xff08;PQ即要计算P点切线&#xff0c;需要求导&#xff09;4. 椭…

【位图布隆过滤器海量数据面试题】

文章目录 1 位图2 布隆过滤器 1 位图 首先我们来看看一个腾讯的面试题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 分析&#xff1a; 40亿个不重复整形数据&#xff0c;大概有160亿字节…

Axios和Spring MVC[前端和后端的请求和响应处理]

在前后端交互中&#xff0c;Axios和Spring MVC扮演着不同的角色&#xff0c;分别负责前端和后端的请求和响应处理。它们之间的作用如下&#xff1a; Axios&#xff08;前端&#xff09;&#xff1a; 发送HTTP请求&#xff1a;前端使用Axios库发送HTTP请求到后端。可以使用Axi…

机器学习实践(1.1)XGBoost分类任务

前言 XGBoost属于Boosting集成学习模型&#xff0c;由华盛顿大学陈天齐博士提出&#xff0c;因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络&#xff0c;XGBoost能更好的处理表格数据&#xff0c;并具有更强的可解释性&#xff0c;还具有易于调参…

hard fault on thread: mqtt0解决办法

rt thread版本4.1.0 使用paho mqtt软件包 运行一段时间后出现 psr: 0x21000000 r00: 0x5036fc8f r01: 0x5036fc88 r02: 0x00000000 r03: 0x5036fc8f r04: 0x00000007 r05: 0x00000063 r06: 0x00005f70 r07: 0x2001f1d8 r08: 0xdeadbeef r09: 0xdeadbeef r10: 0xdeadbeef r11…

关于Java SSM框架的面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a;1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;se…

28.vite

目录 1 一些概念 1.1 单页面应用程序SPA 1.2 vite 2 初始化vite项目 3 项目中的文件 1 一些概念 1.1 单页面应用程序SPA 单页面应用程序是只有一个页面的前端&#xff0c;切换页面通过前端路由来切换 特点如下 实现了前后端分离&#xff0c;后端仅出接口&#…

动态规划III (买股票-121、122、123、188、309)

CP121 买股票的最佳时机 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利…

YOLOv5-7.0添加解耦头

Decoupled Head Decoupled Head是由YOLOX提出的用来替代YOLO Head&#xff0c;可以用来提升目标检测的精度。那么为什么解耦头可以提升检测效果呢&#xff1f; 在阅读YOLOX论文时&#xff0c;找到了两篇引用的论文&#xff0c;并加以阅读。 第一篇文献是Song等人在CVPR2020发表…

【59天|503.下一个更大元素II ● 42. 接雨水】

503.下一个更大元素II class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;int n nums.size();vector<int> res (n, -1);for(int i0; i<2*n;i){while(!st.empty()&&nums[i%n]>nums[st.t…

随机的乐趣和游戏

1、猜数字游戏 #GuessingGame.py import random the_number random.randint(1, 10) print("计算机已经在1到10之间随机生成了一个数字&#xff0c;") guess int(input("请你猜猜是哪一个数字: ")) while guess ! the_number:if guess > the_number:p…

PHP设计模式21-工厂模式的讲解及应用

文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP快速入门与实战 学会好设计模式&#xff0c;能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…

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

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

Spark大数据处理学习笔记1.5 掌握Scala内建控制结构

文章目录 一、学习目标二、条件表达式&#xff08;一&#xff09;语法格式&#xff08;二&#xff09;执行情况&#xff08;三&#xff09;案例演示任务1、根据输入值的不同进行判断任务2、编写Scala程序&#xff0c;判断奇偶性 三、块表达式&#xff08;一&#xff09;语法格式…

Redis入门 - Lua脚本

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - Lua脚本 | CoderMast编程桅杆https://www.codermast.com/database/redis/redis-scription.html Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。 …

不要把异常当做业务逻辑,这性能可能你无法承受

一&#xff1a;背景 1. 讲故事 在项目中摸爬滚打几年&#xff0c;应该或多或少的见过有人把异常当做业务逻辑处理的情况(┬&#xff3f;┬)&#xff0c;比如说判断一个数字是否为整数,就想当然的用try catch包起来&#xff0c;再进行 int.Parse&#xff0c;如果抛异常就说明不…

Unity入门8——音效系统

一、音频文件参数面板 Force To Mono&#xff1a;多声道转单声道 Normalize&#xff1a;强制为单声道时&#xff0c;混合过程中被标准化 Load In Background&#xff1a;后台加载&#xff0c;不阻塞主线程&#xff0c;适合大音效 Ambisonic&#xff1a;立体混响声 非常适合 36…