前言:在 RH850/F1KM-S1 系列 MCU 中,LVI(Low Voltage Indicator) 是一个非常重要的系统监控模块。它用于检测电源电压是否低于设定阈值,进而保障 MCU 系统的稳定运行与安全防护,本文就介绍一下关于LVI的配置的方法。
一,新建工程
在CS+上面创建一个工程并保存到一个空文件夹里面


需要注意的是选择不同型号的MCU加载工程的时候,在CS+工程中会自动显示能使用的配置工具,比如有的是smart configutor,有的是Code generator,有的是两个都可以进行选择配置。

工程创建完成在通过smart configutor生成代码之后会发现编译不通过,这就需要替换一些文件并改一下配置:
1,替换文件
首先找到CS+安装目录下的对应信号的文件夹,并且注意下面的这个iodefine.h文件不能选择错误,要根据实际的芯片型号来进行选择


将上面圈住的四个文件复制到自己创建的工程文件夹里面,如下图所示

在工程中添加已经替换的这三个文件并将原来的三个文件从工程中移除

2,修改配置
将其中的一个块区域替换成如下的形式EIINTTBL.const,原来的是只有EIINTTBL

二,LVI移植
1,LVI简介
当 MCU 的供电电压较低时,如果此时 MCU 仍处于运行状态,有时候会碰到 各种异常问题,比如 EEPROM/Flash 数据被篡改,睡眠后无法唤醒等,为了避免 此种情况的发生,通常 MCU 会有低电压监测的功能,当电压低于一定值时,让 MCU 处于 Reset 状态,或者产生一个中断提醒用户进行相应的处理。
LVI 用来监控 REGVCC,对于 16843 来说,可以简单理解为监控的 5V 供 电的电压。
16843 共提供了三种参考电压,分别为 4.0V,3.7V,3.5 V,具体情况会有一定误差,误差大小可查看手册的 Electrial Characteristi cs。
LVI 配置为低电压复位,具体配置过程步骤如下: (1) 关闭 LVI 复位。 (2) 关闭 LVI 中断。 (3) 配置参考电压等级。 (4) 插入软件等待时间(具体时间参考 Electrial Characteristics) (5) 开启 LVI 复位。
配置过程的软件等待时间要保证大于 2ms。

2,代码详情
主要是将两个代码文件添加到工程里面就可以了




3,功能测试
使用可调节电源给开发板供电,当设置到上面的模式的时候基准电压是3.7V,调节到低于3.7V的电压就发现小灯不再亮(这个是在前面设置的在正常运行状态下小灯会常亮的情况下)
先检查下正常状态下电压高于基准电压下的寄存器的状态


再检查下调节电压低于基准电压之后再调高之后的寄存器的状态,发现已经复位


三,代码块
lvi.c
#include "r_cg_macrodriver.h"
#include "common.h"
#include "lvi.h"
void R_LVI_Reset_Enable(uint32_t LVI_Levle)
{
WPROTR.PROTCMD0 = _WRITE_PROTECT_COMMAND; // Write protected
SVM.LVICNT = _LVI_LVIRESMK_MASK; // Mask LVI Reset
SVM.LVICNT = (uint32_t) ~_LVI_LVIRESMK_MASK;
SVM.LVICNT = _LVI_LVIRESMK_MASK;
ECON_FEINT.FEINTFMSK |= _FEINT_LVIHFEIFMSK_MASK | _FEINT_LVILFEIFMSK_MASK; //Mask LVI interrupt.
WPROTR.PROTCMD0 = _WRITE_PROTECT_COMMAND; // Write protected
SVM.LVICNT = (uint32_t) ~(_LVI_LVIRESMK_MASK | LVI_Levle);
SVM.LVICNT = _LVI_LVIRESMK_MASK | LVI_Levle; // Set LVI Detection Level
SVM.LVICNT = _LVI_LVIRESMK_MASK | LVI_Levle;
Delay_ms(2);
WPROTR.PROTCMD0 = _WRITE_PROTECT_COMMAND; // Write protected
SVM.LVICNT = _LVI_LVIRESMK_UNMASK | LVI_Levle; // Unmask LVI Reset
SVM.LVICNT = (uint32_t) ~(_LVI_LVIRESMK_UNMASK | LVI_Levle);
SVM.LVICNT = _LVI_LVIRESMK_UNMASK | LVI_Levle;
}
lvi.h
#ifndef LVI_H
#define LVI_H
/***********************************************************************************************************************
Macro definitions (Register bit)
***********************************************************************************************************************/
#define _LVI_LVIRESMK_MASK (0x00000004UL) /* MASK LVIRESMK */
#define _LVI_LVIRESMK_UNMASK (0x00000000UL) /* UNMASK LVIRESMK */
#define _LVI_LVICNT_IGNORED (0x00000000UL) /* LVI is ignored */
#define _LVI_LVICNT_VLVI0 (0x00000001UL) /* 4.0+/-0.1 V (drop), 4.0+/-0.13 V (rise) */
#define _LVI_LVICNT_VLVI1 (0x00000002UL) /* 3.7+/-0.1 V (drop), 3.7+/-0.13 V (rise) */
#define _LVI_LVICNT_VLVI2 (0x00000003UL) /* 3.5+/-0.1 V (drop), 3.5+/-0.13 V (rise) */
#define _FEINT_LVIHFEIFMSK_MASK (0x00008000UL) /* MASK LVIHFEIFMSK*/
#define _FEINT_LVIHFEIFMSK_UNMASK (0x00000000UL) /* UNMASK LVIHFEIFMSK*/
#define _FEINT_LVILFEIFMSK_MASK (0x00000001UL) /* MASK LVILFEIFMSK*/
#define _FEINT_LVILFEIFMSK_UNMASK (0x00000000UL) /* UNMASK LVILFEIFMSK*/
#endif
common.c
#include "r_cg_macrodriver.h"
void Delay_ms(uint16_t time)
{
uint16_t i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 10000; j++)
;
}
3160

被折叠的 条评论
为什么被折叠?



