【致敬未来的攻城狮计划】— 连续打卡第十八天:FSP固件库开发GPT — PWM输出波形 — LED呼吸灯

news2024/12/23 17:22:50

系列文章目录

1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下

2.开发环境的选择和调试(从零开始,加油)

3.欲速则不达,今天是对RA2E1 基础知识的补充学习。

4.e2 studio 使用教程

5.Keil配置使用(使用 RASC 生成 Keil 工程)

6.Keil配置使用(使用 RASC 生成 Keil 工程)

7.(电脑重装系统)学习RA产品家族选型手册

8.问题解决、学习RA寄存器、用寄存器的方式点亮第一个LED灯。

9.继续学习RA寄存器

10.FSP固件库开发及FSP配置详解。

11.FSP固件库开发点亮第一个灯。

12.FSP固件库开发按键输入检测控制LED灯闪烁

13.FSP固件库开发启动文件详解

14.FSP固件库开发延时函数(时钟详解)

15.FSP固件库外部中断处理编程(外部中断检测按键控制LED闪烁)

16.FSP固件库系统定时器(滴答定时器SysTick)每2秒LED闪烁一次

17.FSP固件库开发GPT — PWM通用定时器 定时2s LED 闪烁


文章目录

系列文章目录

前言

一、PWM是什么?

二、FSP固件库开发(PWM输出波形 — LED呼吸灯)

1.新建工程

2.FSP配置

3.代码

总结

不摔的惨烈,如何享受涅磐重生的快乐。


前言

        继前一篇文章 17.FSP固件库开发GPT — PWM通用定时器 定时2s LED 闪烁 我们具体讲解了定时如何使用,如何定时定多长时间,什么计算,FSP库如何开发,不过只是做了一个开发的讲解,并没有探讨到更深沉的地方,写文章的效果一个是想让大家扫盲,对RA2E1进行一个整体的理解扫盲,更深沉的理解将会在后续具体的项目运营中讲述,

        上次的文章讲的是   PWM作为定时器使用,这次我们讲一下PWM作为输出使用,输出波形,但是由于身边没有示波器,所以这次没有视频效果。

        具体的大家也可以关注  我的公众号:嵌入式up(提供我自己写的例程  和  技术支持探讨)


一、PWM是什么?

        下面这么文章也讲解到了PWM是什么。大家可以移步前往。

                   17. FSP固件库开发GPT — PWM通用定时器 定时2s LED 闪烁

 学过单片机的大家伙,对pwm这个肯定不陌生,所以这里不再赘述,大家也可以翻阅上篇文章,上篇文章详细介绍到了。

二、FSP固件库开发(PWM输出波形 — LED呼吸灯

1.新建工程

硬件图:


2.FSP配置

如果常 P501 报红色   是因为  引脚之前被配置好了    需要取消之前的配置

这样就可以了。

按顺序依次选择,生成PWM模块。双击属性,最大化配置框。依次配置General,Output,Pins。实现1秒一个周期,占空比50%,在P501输出。 


 点击此按钮可查询新建的端口可以使用的所有函数: 

  • Pin Output Support:这一项配置允许输出 PWM 信号到引脚,我们改为使能引脚输出。

  • Name 和 Channel:这两项分别设置 GPT 模块名字为 “g_timer_gpt5” 和选择第 5 个 GPT 定时器(第6个通道)。

  • Mode:配置 GPT 的工作模式为 PWM 输出模式。

  • Period 和 Period Unit:我们将PWM频率设为 20 KHz, 因此“Period”设置为 20,单位“Period Unit”设置为 Kilohertz,即千赫兹(KHz)。

  • GTIOCB Output Enabled:使能 GTIOCB 输出。

  • GTIOCB Stop Level:设置定时器停止时 GTIOCB 输出的电平为低电平。

  • GTIOC6B:选择连接到 P600 引脚,这个软件会自动设置的,我们只要确认了就好。


3.代码

#include "hal_data.h"
#include "r_gpt.h"


FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


typedef enum
{
    SYS_DELAY_UNITS_SECONDS      = 200000000, ///< Requested delay amount is in seconds
    SYS_DELAY_UNITS_MILLISECONDS = 200000,    ///< Requested delay amount is in milliseconds
    SYS_DELAY_UNITS_MICROSECONDS = 200        ///< Requested delay amount is in microseconds
} sys_delay_units_t;


/* 定义变量 */
uint32_t IT_Period;
uint32_t IT_nums;

/**
* @brief  延时程序
* @param  delay: 延时的单位时间
* @param  unit: 延时的单位
* @retval 无
*/

void SysTick_Delay(uint32_t delay, sys_delay_units_t unit)
{
    uint32_t SumTime = delay * unit; //计算总延时时间(单位为时钟节拍数)
    IT_nums = SumTime/IT_Period;
    while (IT_nums != 0);
}


/**
* @brief  SysTick的中断服务函数
* @param  无
* @retval 无
*/
extern void SysTick_Handler(void); //需要先extern声明一下避免编译器警告
void SysTick_Handler(void)
{
	IT_nums++;
    if (IT_nums == 2000)
    {
		 IT_nums = 0;
	     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH); //LED1亮
    }
	else
	{
		 R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
		
	}
}

 /**
  * @brief  启动系统滴答计时器 SysTick
  * @param  IT_frequency: 滴答计时器每秒的中断次数
  * @retval 无
  */
 void SysTick_Init(uint32_t IT_frequency)
 {
     /* SystemCoreClock在这里默认为200M
      * SystemCoreClock / 1000    1ms中断一次
      * SystemCoreClock / 100000  10us中断一次
      * SystemCoreClock / 1000000 1us中断一次
      */
     IT_Period = SystemCoreClock / IT_frequency;
     uint32_t err = SysTick_Config (IT_Period);
     assert(err==0); //capture error
 }

 

/** 自定义函数:设置PWM占空比
    @param duty 占空比范围:0~100 %
*/
void GPT_PWM_SetDuty(uint8_t duty)
{
    timer_info_t info;
    uint32_t current_period_counts;
    uint32_t duty_cycle_counts;

    if (duty > 100)
        duty = 100; //限制占空比范围:0~100

    /* 获得GPT的信息 */
    R_GPT_InfoGet(&g_timer_gpt5_ctrl, &info);

    /* 获得计时器一个周期需要的计数次数 */
    current_period_counts = info.period_counts;

    /* 根据占空比和一个周期的计数次数计算GTCCR寄存器的值 */
    duty_cycle_counts = (uint32_t)(((uint64_t) current_period_counts * duty) / 100);

    /* 最后调用FSP库函数设置占空比 */
    R_GPT_DutyCycleSet(&g_timer_gpt5_ctrl, duty_cycle_counts, GPT_IO_PIN_GTIOCB);
}

void GPT_PWM_Init(void)
{
    /* 初始化 GPT 模块 */
    R_GPT_Open(&g_timer_gpt5_ctrl, &g_timer_gpt5_cfg);

    /* 启动 GPT 定时器 */
    R_GPT_Start(&g_timer_gpt5_ctrl);


}

void breathing_LED(void)
{
    uint8_t duty = 0;
    uint8_t step = 5;
	
	GPT_PWM_Init();
    while(1)
    {
        if(duty == 100)
            step = 0;
        else if(duty == 0)
            step = 10;
        duty += step;
        GPT_PWM_SetDuty(duty);
        R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MICROSECONDS);
    }
}

/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)   //相当于主函数  函数最终执行的地方
{
	R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); //LED1亮
	R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW); //LED1亮
	
    R_BSP_PinAccessEnable ();  //启用对PFS寄存器的访问,因为后面写IO口都用BSP内联函数
	
	fsp_err_t err = FSP_SUCCESS;
	uint8_t ndt = 30;
	uint8_t step = 10;
	
	/* PWM On*/
    /* 初始化 GPT 模块 */
    err = R_GPT_Open(&g_timer_gpt5_ctrl, &g_timer_gpt5_cfg); 
	assert(err == FSP_SUCCESS);
	R_GPT_Start(&g_timer_gpt5_ctrl);

	R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);
	
	err = R_GPT_PeriodSet(&g_timer_gpt5_ctrl,2000);
	assert(err == FSP_SUCCESS);
	R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);
	
    /* 最后调用FSP库函数设置占空比 */
    R_GPT_DutyCycleSet(&g_timer_gpt5_ctrl, 20*(100-ndt), GPT_IO_PIN_GTIOCB);
	
	assert(err == FSP_SUCCESS);
	R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);

	err = R_GPT_Reset(&g_timer_gpt5_ctrl);
	assert(err == FSP_SUCCESS);
	R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);	
	while(1){

		R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS);	
		
		R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH);
		
		R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS);	
		
		R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW);
		
		err = R_GPT_DutyCycleSet(&g_timer_gpt5_ctrl, 20*(100-ndt), GPT_IO_PIN_GTIOCB);
		assert(err == FSP_SUCCESS);
		R_BSP_SoftwareDelay(20, BSP_DELAY_UNITS_MILLISECONDS);	
		
		ndt += step;
		if(ndt >= 100 || ndt <= 0)
			step = -step;
//	    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH); 
//        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);
//        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW); 
//        R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);

	}
	

视频效果:

RA2E1开发板 呼吸灯成就


总结

        pwm呼吸灯成就达成,继续努力!


不摔的惨烈,如何享受涅磐重生的快乐。

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

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

相关文章

Rust开发环境搭建到运行第一个程序HelloRust

一、Rust语言 1.1 Rust语言介绍 Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率&#xff0c;它的执行效率也是令人称赞的&#xff0c;是一种少有的兼顾开发效率和执行效率的语言。 Rust 语言由 Mozilla 开发&#xff0c;最早发布于2014年 9月。Rust 的编…

《ADC和DAC的基本架构》----学习记录(二)

2 模数转换器 2.1 ADC架构I&#xff1a;Flash转换器 2.1.1 比较器&#xff1a;1位ADC 转换开关是 1 位 DAC&#xff0c;而比较器是 1 位 ADC&#xff0c;如图所示。如果输入超过阈值&#xff0c;输出即会具有一个逻辑值&#xff0c;而输入低于阈值时输出又会有另一个值。此外…

寻找2020+跳蚱蜢(蓝桥杯JAVA解法)

目录 寻找2020&#xff1a;用户登录 题目描述 运行限制 跳蚱蜢&#xff1a;用户登录 题目描述 运行限制 寻找2020&#xff1a;用户登录 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一个数字矩阵&a…

使用ChatGPT生成了十种排序算法

前言 当前ChatGPT非常火爆&#xff0c;对于程序员来说&#xff0c;ChatGPT可以帮助编写很多有用的代码。比如&#xff1a;在算法的实现上&#xff0c;就可以替我们省很多事。所以&#xff0c;小试牛刀一下&#xff0c;看看ChatGPT生成了排序算法怎么样&#xff1f; 简介 排序…

网站搭建之配置tomcat

【 本次配置架构】 【安全配置】 1.删除后台登录 在tomcat安装目录下的/conf文件下编辑tomcat-users.xml,删除里面带有标签的内容块&#xff0c;默认这部分是被注释了的。注释了任然会显示后台登录&#xff0c;需要彻底删除。 进入末行模式&#xff0c;也就是使用vim进去后&…

Flask开发之环境搭建

目录 1、安装flask 2、创建Flask工程 ​编辑 3、初始化效果 4、运行效果 5、设置Debug模式 6、设置Host 7、设置Port 8、在app.config中添加配置 1、安装flask 如果电脑上从没有安装过flask&#xff0c;则在命令行界面输入以下命令&#xff1a; pip install flask 如果电…

【MFAC】基于偏格式动态线性化的无模型自适应控制(Matlab代码)

例题来源&#xff1a;侯忠生教授的《无模型自适应控制&#xff1a;理论与应用》&#xff08;2013年科学出版社&#xff09;。 &#x1f449;对应书本 4.3 单输入单输出系统(SISO)偏格式动态线性化(PFDL)的无模型自适应控制(MFAC) 上一篇博客介绍了基于紧格式动态线性化的无模型…

C++每日一练:打家劫室(详解动态规划法)

文章目录 前言一、题目二、分析三、代码总结 前言 这题目出得很有意思哈&#xff0c;打劫也是很有技术含量滴&#xff01;不会点算法打劫这么粗暴的工作都干不好。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 题目名称&#xff1a; 打家…

实现Newton方法的最小化函数(pytorch)

首先&#xff0c;我们要明确需求 def newton(theta, f, tol 1e-8, fscale1.0, maxit 100, max_half 20) ● theta是优化参数的初始值的一个向量。 ● f是要最小化的目标函数。该函数应将PyTorch张量作为输入&#xff0c;并返回一个张量。 ● tol是收敛容忍度。 ● fscale 粗…

【Leetcode -328.奇偶链表 - 725.分隔链表】

Leetcode Leetcode -328.奇偶链表Leetcode - 725.分隔链表 Leetcode -328.奇偶链表 题目&#xff1a;给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &am…

苏州百特电器有限公司网站设计

苏州百特电器有限公司网站设计 五一假期作业企业门户网站布局设计 基于 <div> 的企业门户网站设计 by 小喾苦 我这里仅仅是使用 html css 来实现这个网站的效果&#xff0c;并不是宣传这个网站(现在这个网站已经过时并且无法进入) 实现效果 https://xkk1.github.io/…

出差在外,远程访问企业局域网象过河ERP系统「内网穿透」

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 转载自远程穿透文章&#xff1a;公网远程访问公司内网象过河ERP系统「内网穿透」 概述 ERP系统对于企业来说重要性不言而喻&am…

初识中央处理器CPU

目录 一、CPU功能 1.控制器功能 2.运算器功能 3.功能执行顺序 4.其他功能 二、CPU结构图 1.CPU与系统总线 2.CPU内部结构 3.运算器中的寄存器组 4.控制器中的寄存器组 三、执行指令的过程 1.指令周期的基本概念 2.完整的指令周期流程 3.数据通路 4.指令周期的数据…

React超级简单易懂全面的有关问题回答(面试)

目录 React事件机制&#xff1a; 2、React的事件和普通的HTML有什么不同&#xff1a; - 事件命名的规则不同&#xff0c;原生事件采用全小写&#xff0c;react事件采用小驼峰 3、React组件中怎么做事件代理&#xff1f;他的原理是什么&#xff1f; 4、React高阶组件、Rend…

【SpringBoot】 整合RabbitMQ 保证消息可靠性传递

生产者端 目录结构 导入依赖 修改yml 业务逻辑 测试结果 生产者端 目录结构 导入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>&…

无人机集群路径规划:淘金优化算法(Gold rush optimizer,GRO)提供MATLAB代码

一、淘金优化算法GRO 淘金优化算法&#xff08;Gold rush optimizer&#xff0c;GRO&#xff09;由Kamran Zolf于2023年提出&#xff0c;其灵感来自淘金热&#xff0c;模拟淘金者进行黄金勘探行为。 参考文献&#xff1a; K. Zolfi. Gold rush optimizer: A new population-ba…

Python小姿势 - #### Python技术博客:Python多线程编程

Python技术博客&#xff1a;Python多线程编程 你好&#xff0c;这里是自媒体技术博主Aurora&#xff0c;今天我想分享一下Python多线程编程。 首先&#xff0c;什么是多线程编程&#xff1f;多线程编程是一种让多个线程同时执行的编程方式&#xff0c;它可以让程序的执行更加高…

2023年华中杯C题计算结果

经过一晚上代码的编写&#xff0c;论文的写作&#xff0c;C题完整版论文已经发布&#xff0c; 注&#xff1a;蓝色字体为说明备注解释字体&#xff0c;不能出现在大家的论文里。黑色字体为论文部分&#xff0c;大家可以根据红色字体的注记进行摘抄。对应的详细的写作视频教程&…

推荐一款网站内链爬取python脚本

目标 使用 web-tools 提供的webSpider来爬取网站内链&#xff0c;并且将其导出。 webSpider介绍&#xff1a; 官网链接&#xff1a;https://web-tools.cn/web-spider 仓库地址&#xff1a;https://github.com/duerhong/web-spider Web Spider 专门用于爬取网站内链&#xf…

C++ srand()和rand()用法

参考C rand 与 srand 的用法 计算机的随机数都是由伪随机数&#xff0c;即是由小M多项式序列生成的&#xff0c;其中产生每个小序列都有一个初始值&#xff0c;即随机种子。&#xff08;注意&#xff1a; 小M多项式序列的周期是65535&#xff0c;即每次利用一个随机种子生成的随…