上一章节,学会通过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
为什么前面没有配置时钟,程序就可以执行,是因为瑞萨芯片即使没有配置时钟,芯片也会有个默认的时钟和时钟分频器,可以让芯片正常运行,但是由于没有配置时钟,系统的时钟频率和稳定性就没有那么可靠,进而影响程序的性能和稳定性。