前言:
选项字OPTION配置是RH850的一项重点,用户手册对选项字的配置介绍很少,这篇文章将主要针对选项字和看门狗的配置进行讲解。
一、选项字特性
闪存的选项字节是一个扩展区域,并保存用户为各种目的指定的数据。由选项字节指定的外围模块等的初始设置在从复位状态释放时生效。
二、选项字设置
在将程序写入闪存之前,请确保设置对应于下面列出的可选函数的选项字节区域。
三、选项字寄存器
3.1 OPBT0 — Option Byte 0
Bit position |
Bit Name |
Function |
30 - 29 |
OPJTAG |
这些位控制端口组JP0的功能。 00: JP0用于通用/替代功能端口 01: JP0用于LPD 4引脚模式 10: JP0用于LPD 1引脚模式 11: JP0用于Nexus I/F |
26 |
WDT1_3 |
指定WDTA1的激活码方法。 0:固定激活码 1:变量激活码 |
24 |
WDT1_1 |
指定WDTA1的启动方式。 0:软件触发启动 1:默认启动 |
23 |
WDT1_0 |
启用或禁用WDTA1。 0:关闭WDTA1 1:启用WDTA1 |
22 |
WDT0_3 |
指定WDTA0的激活码方法。 0:固定激活码 1:变量激活码 |
20 |
WDT0_1 |
指定WDTA0的启动方式。 0:软件触发启动 1:默认启动 |
19 |
WDT0_0 |
启用或禁用WDTA0。 0:关闭WDTA0 1:使能WDTA0 |
18 - 16 |
WDT_2-0 |
控制WDTA0和WDTA1的溢出间隔时间 这些位指定WDTAnMD.WDTAnOVF[2:0]的重置值。 |
10 |
CANFDCRC |
CAN FD CRC协议 0:原协议 1:新协议 |
9 |
RESET OUTEN |
复位控制 0:禁止复位功能 1:允许复位功能 |
5 |
CVM_H D_EN |
高电压监控使能 0:关闭高电压检测 1:开启高电压检测 |
4 |
CVM_L D_EN |
低电压监控使能 0:关闭低电压检测 1:开启低电压检测 |
3.2 OPBT1 — Option Byte 1
Bit position |
Bit Name |
Function |
31 - 10 |
无 |
写时,写“1”。 |
9 |
无 |
写时,写“0”。 |
8 - 0 |
无 |
写时,写“1”。 |
四、功能概述
(1)编程或擦除中断的读取区域
当对闪存区域的编程或擦除被中断时,存储在该区域中的数据将变为未定义。为了避免读取未定义的数据,这可能会导致故障,请注意不要从编程或擦除中断的区域获取指令或读取数据。
(2)读取已擦除但尚未编程的代码闪存
请注意,从已擦除但尚未再次编程的代码闪存中读取(即处于非编程状态)可能会导致检测到ECC错误并产生相应的异常。当需要确认某个区域处于非编程状态时,使用空白检查。
(3)禁止增写
向一个给定区域写入两次或两次以上是不可能的。当对闪存区域完成写入后覆盖该区域中的数据时,请先擦除该区域。
(4)在编程和擦除过程中重置
在编程和擦除过程中发生外部复位的情况下,在断言复位信号后,一旦工作电压在电气特性规定的范围内,至少等待复位输入低电平宽度的最小值,然后将设备从复位状态释放。
(5)在编程和擦除过程中为中断和其他异常分配向量
在编程或擦除过程中产生中断或其他异常可能导致从代码闪存中获取向量。如果这不满足使用后台操作的条件,将vector获取的地址设置为不在代码闪存中的地址。
(6)编程异常终止和擦除
即使由于reset引脚的复位断言而导致编程/擦除异常结束,具有未定义数据的闪存的编程/擦除状态也不能被验证或检查。对于编程/擦除异常结束的区域,空白检查功能无法判断该区域是否擦除成功。再次擦除该区域,以确保相应的区域使用前完全擦除。
如果编程和擦除代码闪存没有正常完成,目标区域的锁定位可能被启用(锁定)。在这种情况下,请在锁定位处于禁用状态(该区域未锁定)时擦除该块以清除锁定位。
(7)编程和擦除过程中禁止的项目
请勿在编程和擦除过程中执行以下操作。
•将电源的工作电压设置在允许的范围之外。
•修改外部时钟频率。
(8)清除配置前擦除所有闪存
在清除配置之前,请擦除代码flash的用户区域和数据flash的所有数据区域。
(9)使用HS IntOSC时串行编程的限制
不能使用1线/2线UART模式。
无法使用E1仿真器。
五、RH850_F1K选项字配置
六、WDTA - 窗口看门狗
本节包含窗口看门狗定时器(WDTA)的一般描述。
本节的第一部分描述了RH850/F1K的所有特定属性,例如单元数、寄存器基址等。本节的其余部分将描述WDTA的函数和寄存器。
6.1 单位和通道数量
这个微控制器有以下数量的WDTA单元。
6.2 寄存器基地址
基地址名称 |
基地址 |
WDTA0_base |
FFED 0000 |
WDTA1_base |
FFED 1000 |
6.3 时钟源选择
名称 |
时钟源名称 |
时钟源选择名称 |
介绍 |
WDTA0 |
WDTATCKI |
CKSCLK_AWDTA |
定时器计数时钟 |
注册访问时钟 |
CPUCLK2 |
总线时钟 |
|
WDTA1 |
WDTATCKI |
LS IntOSC |
定时器计数时钟 |
注册访问时钟 |
CPUCLK2 |
总线时钟 |
6.4 中断请求
下表列出了WDTAn中断请求。
6.5 复位源
下表列出了WDTAn复位源。WDTAn由这些重置源初始化。
名称 |
复位源 |
WDTA0 |
复位源AWORES |
WDTA1 |
所有复位源ISORES |
6.6 看门狗框图
6.7 寄存器
6.71 WDTAnWDTE -- 看门狗使能寄存器
Bit position |
Bit Name |
Function |
7 - 0 |
WDTAnRUN |
编写固定激活代码(ACH)生成WDTA触发器并启动/ 重新启动WDTAn计数器。写入ACH以外的值会产生错误。 WDTAn一旦启动就不能停止。 |
6.72 WDTAnEVAC -- 看门狗使能VAC寄存器
Bit position |
Bit Name |
Function |
7 - 0 |
WDTAnEVAC |
编写变量激活代码生成WDTA触发器并启动/重新启动WDTA计数器。编写不正确的激活代码将生成错误。WDTAn一旦启动就不能停止。 |
6.73 WDTAnREF -- 参考值寄存器
Bit position |
Bit Name |
Function |
7 - 0 |
WDTAnREF |
VAC功能的激活码计算参考值。 |
6.74 WDTAnMD -- 看门狗模式寄存器
Bit position |
Bit Name |
Function |
|||||
6 - 4 |
WDTAnOVF |
选择溢出间隔时间 |
|||||
WDTAnOVF2 |
WDTAnOVF1 |
WDTAnOVF0 |
溢出间隔时间 |
||||
0 |
0 |
0 |
2^9/WDTATCKI |
||||
0 |
0 |
1 |
2^10/WDTATCKI |
||||
0 |
1 |
0 |
2^11/WDTATCKI |
||||
0 |
1 |
1 |
2^12/WDTATCKI |
||||
1 |
0 |
0 |
2^13/WDTATCKI |
||||
1 |
0 |
1 |
2^14/WDTATCKI |
||||
1 |
1 |
0 |
2^15/WDTATCKI |
||||
1 |
1 |
1 |
2^16/WDTATCKI |
||||
3 |
WDTAnWIE |
启用/禁用75%中断请求INTWDTAn。 0:关闭INTWDTAn功能。 1:使能INTWDTAn。 |
|||||
2 |
WDTAnERM |
指定错误模式。 0: NMI请求模式 1:复位模式 |
|||||
1 - 0 |
WDTAnWS |
选择窗口打开周期。 |
|||||
WDTAnWS1 |
WDTAnWS0 |
窗口打开周期 |
|||||
0 |
0 |
25% |
|||||
0 |
1 |
50% |
|||||
1 |
0 |
75% |
|||||
1 |
1 |
100% |
七、看门狗例程
/**********************************************************************
* Description: Initializes and starts the Watch Dog for reset generation
* Parameters : None
* Returns : None
*********************************************************************/
void Init_WatchDog(void)
{
uint32_t reg32_value;
// Set interrupt flags
INTC2MKWDTA0 = 1U;
INTC2RFWDTA0 = 0U;
INTC2TBWDTA0 = 1U;
do
{
reg32_value = 0x00000001UL;
WPROTRPROTCMD0 = 0x000000A5UL; // Protection release the CKSC_AWDTAD_CTL register.
CLKCTLCKSC_AWDTAD_CTL = reg32_value;
CLKCTLCKSC_AWDTAD_CTL = ~reg32_value;
CLKCTLCKSC_AWDTAD_CTL = reg32_value;
} while ( PORTPPROTS0 != 0x00000000UL );
while ( CLKCTLCKSC_AWDTAD_ACT != reg32_value )
{
// Waiting for CKSC_AWDTAD_CTL to set.
}
WDTA0MD = 0x0FU;
INTC2MKWDTA0 = 0U; // INTWDTA0 (75% interrupt) enable
WDTA0WDTE = 0xAC;
Feed_Dog(); // feed both dogs to initialize
}
/**********************************************************************
* Description: Watchdog timer interval (75% of overflow time)
* Parameters : None
* Returns : None
*********************************************************************/
#pragma vector = INTWDTA0_vector
__interrupt void vWatchDogTimerINT(void)
{
/* make sure feed dog in 75% of overflow time,
so watchdog_count can identify the count of reset occur by watchdog overflow time */
static int watchdog_count;
INTC2RFWDTA0 = 0U; /* clear INTWDTI interrupt flag */
watchdog_count++;
}