【CS+ for CC】基于瑞萨RH850的低电压复位LVI配置

前言:在 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++)
            ;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是星凡呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值