瑞萨RH850 F1KM-S4 -LED闪烁

        上一章节,学会通过GPIO口控制LED灯的开和关,本节介绍如何实现LED灯的周期开和关,实现闪烁效果。    

        关于LED闪烁的实现方法,一般有以下几种,本章讲解第一种GPIO控制。

        1. 采用GPIO控制:将LED连接到MCU的GPIO口上,通过设置GPIO的电平状态来控制LED的亮灭。例如,可以将GPIO的输出状态设置为高电平,延时一段时间,再将GPIO的输出状态设置为低电平,延时一段时间,不断循环这个过程,就可以实现LED的闪烁。
        2. 采用定时器控制:使用MCU内部的定时器模块,设置定时器的计数值和计数方式,当定时器计数到指定值时,就产生一个定时器中断。在定时器中断服务函数中,可以控制LED的亮灭。例如,可以将LED的状态翻转(从亮到灭或从灭到亮),然后重新启动定时器,等待下一次定时器中断的触发。
        3. 采用PWM控制:使用MCU内部的PWM模块,将PWM输出端连接到LED上,通过改变PWM输出的占空比来控制LED的亮度。例如,可以设置PWM的占空比逐渐从0增加到100,然后再逐渐从100减小到0,不断循环这个过程,就可以实现LED的闪烁效果。

        GPIO控制主要是通过软件的延时来控制GPIO的输出状态,而RH850F1KM-S4提供了以下几种的实现方法:

       1. 软件延时:通过空指令循环、系统计数器等方式实现。
        2.定时器延时:使用内部或外部定时器进行延时控制。
        3.中断延时:通过定时器中断等方式实现延时。

一、软件延迟

        <空指令循环>

        空指令循环主要是通过延迟函数Delay()强制MCU空转次数来实现延迟,因为非常消耗MCU处理资源同时精度非常低,所以这种方法一般不会在项目上使用,仅适用于练手。

#include "iodefine.h"   
//-----------------------------------------IO 初始化----------------------------//

void Init_port()
{
		PORT.PM8&=~(3<<8);  /*配置P8.8、P8.9为输出模式*/
		PORT.P8|=(3<<8);    /*默认是低电平,P8.8和P8.9需要置1*/
}
//-----------------------------------------延时----------------------------//
void Delay()
{
	int i;
	for(i=0;i<2500000;i++){};  /*强制MCU在此处空转2500000次来达到延时效果*/
}
//-----------------------------------------main()----------------------------//
void main(void)
{
	Init_port();	
	while(1u)
	{
		PORT.P8&=~(1<<8);  	/*P8.8 设置为低电平*/
		Delay();
		PORT.P8|=(3<<8);        /*拉高电平*/
		Delay();
		PORT.P8&=~(1<<9);       /*P8.9 设置为低电平*/
		Delay();
		PORT.P8|=(3<<8);        /*拉高电平*/
	}
}

        <系统计数器>

        系统计数器通过读取系统计数器的计数值,计算延时时间,进而执行GPIO操作。这种方法相比空循环可以有效避免CPU的浪费。

        在软件设计方面,首先要确定主时钟频率和系统计数器的时钟源(系统计数器的时钟源可以是主时钟或者主时钟的分频时钟)。
       然后根据时钟源的不同,需要配置相应的系统计数器寄存器,比如 CTCOR(Count Control Register)寄存器,设置计数器的时钟源和计数器重载值等参数。
        最后通过读取系统计数器的计数值,计算延时时间,实现延时函数。

        这里我们引用的新的概念,时钟源概念,时钟源等同人体心脏的跳动,给整个系统提供节拍。瑞萨系列的时钟介绍,可以参考下述连接:https://blog.csdn.net/qq_27893147/article/details/114694799?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168224442216800211515243%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168224442216800211515243&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-114694799-null-null.142^v86^insert_down38v5,239^v2^insert_chatgpt&utm_term=%E7%91%9E%E8%90%A8%E6%97%B6%E9%92%9F%E6%BA%90&spm=1018.2226.3001.4187

        为什么前面没有配置时钟,程序就可以执行,是因为瑞萨芯片即使没有配置时钟,芯片也会有个默认的时钟和时钟分频器,可以让芯片正常运行,但是由于没有配置时钟,系统的时钟频率和稳定性就没有那么可靠,进而影响程序的性能和稳定性。

        

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是瑞萨RH850F1KM-S1微控制器的输入捕获PWM例程,用于计算周期和占空比: ```c #include "rh850f1km.h" volatile uint32_t capture_value = 0; volatile uint32_t period = 0; volatile uint32_t duty_cycle = 0; void input_capture_init() { // 选择输入捕获功能的引脚 // 例如,选择P0_0作为输入捕获引脚 MPC.P00PFS.BYTE = 0x09; // PFS0_9: INPFCAP0 // 配置输入捕获模式 ICU.ICCR[0].BIT.ICCS = 0x01; // 使用捕获计数器CH0 ICU.ICMR[0].BIT.ICPSEL = 0x01; // 选择输入捕获模式1 (上升沿触发) // 配置输入捕获时钟源 ICU.ICOCR[0].BIT.ICODIV = 0x00; // 不分频 ICU.ICOCR[0].BIT.ICOSEL = 0x00; // 选择内部高精度时钟源 // 启用输入捕获中断 ICU.IER[1].BIT.IEN_ICIE0 = 1; // CH0 捕获中断使能 // 清除输入捕获中断标志 ICU.IR[1].BIT.IR_ICIF0 = 0; // CH0 捕获中断标志 // 使能输入捕获功能 ICU.ICCR[0].BIT.ICEN = 1; // CH0 捕获功能使能 } // 输入捕获中断处理函数 void input_capture_isr() { capture_value = ICU.ICCPW[0].WORD; // 获取捕获计数器的值 period = capture_value * 2; // 计算周期(以捕获计数器的计数值为基准) duty_cycle = capture_value * 100 / period; // 计算占空比(以捕获计数器的计数值和周期为基准) // 在这里处理输入捕获事件 } int main() { input_capture_init(); while(1) { // 主循环中进行其他操作 } return 0; } ``` 以上代码是一个输入捕获PWM的例程,它使用RH850F1KM-S1的输入捕获功能来测量PWM信号的周期和占空比。在输入捕获中断处理函数中,通过获取捕获计数器的值,可以计算出周期和占空比。 请注意,以上代码只是一个示例,实际使用时需要根据具体的硬件和需求进行适当的配置和调整。确保查阅RH850F1KM-S1的技术手册和参考资料以获取更详细的信息和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值