续前【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+独立看门狗定时器
RTC简介
RA6M5的RTC(Real Time Clock)外设,实质是一个深度软件待机模式时还继续运行的定时器。从定时器的角度来说,相对于GPT外设,要简单很多 ,只有计时和触发中断以及输入捕获的功能。但从深度软件待机模式还继续运行的角度来说,它却是一个具有如此强大功能的外设。 所以RTC外设的特别之处并不在于它的定时功能,而在于它深度软件待机模式时还继续运行的特性。
实时时钟(RTC)有两种计数模式,日历计数模式和二进制计数模式,通过切换寄存器设置使用。 对于日历计数模式,RTC具有从2000年到2099年的100年日历,并自动调整闰年的日期。 对于二进制计数模式,RTC计数秒,并保留信息作为串行值。 二进制计数模式可用于公历(西历)以外的日历。
子时钟振荡器或LOCO可以选择作为时间计数器的计数源。RTC使用128Hz的时钟,通过将计数源除以预分频器的值获得: 年、月、日、星期、上午/下午。 (12/24 小时模式)、时、分、秒或32位二进制按1/128秒计数。
RA4E2开发板 RTC 特性:
- 计数模式:日历计数模式和二进制计数模式。
- 时钟源:子时钟或LOCO。
- 日历计数模式:年,月,日,星期,小时,分钟,秒计数。
- 二进制计数模式:32位计二进制计数。
- 闹钟中断:在日历计数模式下,可以与年,月,日,星期,小时,分钟和秒进行比较。在二进制计数模式下则与32位2进制计数器进行对比。
- 周期性中断:可以选择2秒,1秒,1/2秒,1/4秒,1/8秒,1/16秒,1/32秒,1/64秒、1/128秒或1/256秒作为中断周期。
- 进位中断:当从64HZ计数器到二进制计数器的进位时和当改变64Hz计数器和R64同时读取CNT寄存器时进行中断。
- 输入捕获:当检测到捕获时间输入引脚的电平发生跳变时(上升沿或者下降沿时),可以进行输入捕获。 该输入捕获可以用日历计数或者二进制计数。电平跳变时可以产生中断。与GPT相同的是,该输入捕获也能使用噪声滤波器。
- 事件关联:周期性输出事件。
- TrustZone过滤器:可以设置安全属性。
RTC的结构框图

RTC最基础的功能便是日历计数,本次将使用RA4E2开发板 RTC的日历计数并在shell中设置、调整、使用日历时钟,将日历时钟按“年-月-日-时:分:秒 星期”的格式打印出来,深度软件待机模式和独立看门狗定时器复位后根据待机时长加载系统tick值。
rasc部分
打开【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+独立看门狗定时器配置的RA Smart Configurator.
RTC定时器配置
点击配置窗口底部的“Stack”,在Stacks项中 点击Stacks->timeS-> Realtime Clock (r_rtc) 。如图步骤加入RTC模块。

属性配置
在下面配置中:
Parameter Checking : Enabled
Set Source Clock in Open : Enabled
Clock Source : Sub-Clock
Name : g_rtc
NMI callback : rtc_callback
事件标志组
采用上次一样的配置,用其中一位代表 rtc起用标记。
点击Stacks选项卡--在左侧 Threads,
在Threads下方有一个Object区域,点击New Object--Event Flags  属性 Name: EventGroup
Symbol: EventGroup
完成后点击生成代码即可

rasc部分配置完。
keil编程部分
在已经产生文件目录: 
中打开lu.uvprojx

在lu\src会多出几个*Task_entry.c文件,这些文件是留给我们写线程具体功能的。
**‘在hal_entry.c不需要加入任何代码,所有与os有关代码由[瑞萨]在生成项目时完成了.’
相关rtc定时器 代码都放在printf_Task_Task.c 中:
#include "printf_Task.h"
#include <time.h>
#include "perf_counter.h"
#include "uart/uart.h"
#include "inc/nr_micro_shell.h"
#include "adc/adc.h"
extern volatile bool scan_0_3V3_flag;
#define R_STBRAM_BASE 0x28000000UL
volatile int *STBRAM_BASE_nmi_reg = (volatile int *)R_STBRAM_BASE;
__IO uint8_t OSStatRdy;
__IO uint32_t OSIdleCtr;
__IO float OSCPUUsage;
uint32_t OSIdleCtrMax;
uint32_t OSIdleCtrRun;
volatile bool IWDT_Feedf= 1;
volatile bool shell_Ff= false;
volatile bool scan_0_3V3_flag= false;
volatile bool Deep_sleep_Enable_flag=false;
extern volatile bool TBE ;
static TX_THREAD AppTaskIdleTCB;
static uint64_t AppTaskIdleStk[256/8];
static TX_THREAD AppTaskStatTCB;
static uint64_t AppTaskStatStk[512/8];
static TX_THREAD task_shellTCB;
static uint64_t task_shellStk[1024/8];
volatile _Bool key_flag = false;
time_t convert_to_timestamp(int year, int month, int day, int hour, int minute, int second)
{
struct tm timeinfo = {0};
timeinfo.tm_year = year ;
timeinfo.tm_mon = month ;
timeinfo.tm_mday = day;
timeinfo.tm_hour = hour;
timeinfo.tm_min = minute;
timeinfo.tm_sec = second;
timeinfo.tm_isdst = -1;
}
void IRQ_Init()
{
g_external_irq10.p_api->open(&g_external_irq10_ctrl, &g_external_irq10_cfg);
g_external_irq10.p_api->enable(&g_external_irq10_ctrl);
}
void key_irq_callback(external_irq_callback_args_t *p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
key_flag = true;
}
void IWDT_Init(void)
{
R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0;
R_IWDT_Open(&g_wdt0_ctrl, &g_wdt0_cfg);
}
void iwdt_callback (wdt_callback_args_t * p_args)
{
(void) p_args;
uint32_t iwdt_counter;
R_IWDT_CounterGet(&g_wdt0_ctrl, &iwdt_counter);
if ((iwdt_counter>2000)||(iwdt_counter==000))
{
if (((*STBRAM_BASE_nmi_reg )& 0x5a00)==0x5a00)
{if (((*STBRAM_BASE_nmi_reg )& 0xFF)==0xFF) *STBRAM_BASE_nmi_reg =((*STBRAM_BASE_nmi_reg )& 0xffff0000)+0x5afe;
*STBRAM_BASE_nmi_reg =((*STBRAM_BASE_nmi_reg )& 0xFF)+1+((*STBRAM_BASE_nmi_reg )& 0xffffff00);
}
else
{
*STBRAM_BASE_nmi_reg =((*STBRAM_BASE_nmi_reg )& 0xffff0000)+0x5a00;
}
if (((*(STBRAM_BASE_nmi_reg+4))& 0xFF)==0xaa) {
rtc_time_t get_time;
R_RTC_CalendarTimeGet(&g_rtc_ctrl, &get_time);
(*(STBRAM_BASE_nmi_reg+3 ))=convert_to_timestamp( get_time.tm_year, get_time.tm_mon, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec);
}
}
else
{
(*(STBRAM_BASE_nmi_reg+5 ))=iwdt_counter;
}tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
*STBRAM_BASE_nmi_reg=0x5a03;
__NVIC_SystemReset();
}
void OSStatInit (void)
{
OSStatRdy = 0;
tx_thread_sleep(2u);
OSIdleCtr = 0uL;
tx_thread_sleep(100);
OSIdleCtrMax = 832000;
if (OSIdleCtr > OSIdleCtrMax) OSIdleCtrMax = OSIdleCtr;
OSStatRdy = 1;
}
static void AppTaskStat(ULONG thread_input)
{
(void)thread_input;
IWDT_Init();
while (OSStatRdy == 0)
{
tx_thread_sleep(200);
}
OSIdleCtrMax /= 100uL;
if (OSIdleCtrMax == 0uL)
{
OSCPUUsage = 0u;
}
OSIdleCtr = OSIdleCtrMax * 100uL;
ULONG actual_events;
UINT status;
for (;;)
{
OSIdleCtr = 0uL;
tx_thread_sleep(100);
OSIdleCtrRun = OSIdleCtr;
OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
if(OSIdleCtrRun) {
status = tx_event_flags_get(&EventGroup,
8,
TX_AND_CLEAR ,
&actual_events,
TX_NO_WAIT);
if(status == TX_SUCCESS)
{IWDT_Feedf=!IWDT_Feedf ;
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("IWDT_Feed=%d\n",IWDT_Feedf);
tx_mutex_put(&AppPrintfSemp);
}
status = tx_event_flags_get(&EventGroup,
16,
TX_AND_CLEAR ,
&actual_events,
TX_NO_WAIT);
if(status == TX_SUCCESS)
{shell_Ff=!shell_Ff ;
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("shell_Ff=%d\n",shell_Ff);
tx_mutex_put(&AppPrintfSemp);
if (shell_Ff)
{tx_thread_resume(&task_shellTCB);
}
else
{tx_thread_suspend(&task_shellTCB);
}
}
status = tx_event_flags_get(&EventGroup,
7,
TX_AND_CLEAR ,
&actual_events,
TX_NO_WAIT);
if(status == TX_SUCCESS)
{
uint32_t iwdt_counter;
R_IWDT_CounterGet(&g_wdt0_ctrl, &iwdt_counter);
if (IWDT_Feedf) (void) R_IWDT_Refresh(&g_wdt0_ctrl);
}
}
}
static void AppTaskIDLE(ULONG thread_input)
{
TX_INTERRUPT_SAVE_AREA
(void)thread_input;
while(1)
{
TX_DISABLE
OSIdleCtr++;
TX_RESTORE
}
}
static void task_shell(ULONG thread_input)
{
TX_INTERRUPT_SAVE_AREA
(void)thread_input;
unsigned char ch;
shell_init();
uint32_t iwdt_counter;
R_IWDT_CounterGet(&g_wdt0_ctrl, &iwdt_counter);
(void) R_IWDT_Refresh(&g_wdt0_ctrl);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("iwdt_counter=%d\n",iwdt_counter);
tx_mutex_put(&AppPrintfSemp);
while (1) {
if (tx_queue_receive (&uart_queue, &ch, 0) == TX_SUCCESS )
{shell(ch);
Deep_sleep_Enable_flag=0;
}
tx_thread_sleep(3);
}
}
static void AppTaskCreate (void)
{
tx_thread_create(&task_shellTCB,
"shell",
task_shell,
0,
&task_shellStk[0],
1024,
28,
23,
TX_NO_TIME_SLICE,
TX_DONT_START);
tx_thread_create(&AppTaskStatTCB,
"App Task STAT",
AppTaskStat,
0,
&AppTaskStatStk[0],
512,
30,
30,
TX_NO_TIME_SLICE,
TX_AUTO_START);
tx_thread_create(&AppTaskIdleTCB,
"App Task IDLE",
AppTaskIDLE,
0,
&AppTaskIdleStk[0],
256,
31,
31,
TX_NO_TIME_SLICE,
TX_AUTO_START);
}
typedef struct
{
int code;
char *name;
} tx_thread_status_t;
tx_thread_status_t tx_thread_status[] =
{
{TX_READY, "READY"},
{TX_COMPLETED, "COMPLETED"},
{TX_TERMINATED, "TERMINATED"},
{TX_SUSPENDED, "SUSPENDED"},
{TX_SLEEP, "SLEEP"},
{TX_QUEUE_SUSP, "QUEUE_SUSP"},
{TX_SEMAPHORE_SUSP, "SEMAPHORE_SUSP"},
{TX_EVENT_FLAG, "EVENT_FLAG"},
{TX_BLOCK_MEMORY, "BLOCK_MEMORY"},
{TX_BYTE_MEMORY, "BYTE_MEMORY"},
{TX_IO_DRIVER, "IO_DRIVER"},
{TX_FILE, "FILE"},
{TX_TCP_IP, "TCP_IP"},
{TX_MUTEX_SUSP, "MUTEX_SUSP"},
{TX_PRIORITY_CHANGE, "PRIORITY_CHANGE"},
};
static void DispTaskInfo(void)
{
TX_THREAD *p_tcb;
p_tcb = &AppTaskStatTCB;
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("tick : %lu\r\n", _tx_time_get());
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("=================================================================================\r\n");
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("OS CPU Usage = %5.2f%% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax); \r\n", OSCPUUsage);
printf("OS CPU OSIdleCtrRun = %d\r\n", OSIdleCtrRun);
printf("OS CPU OSIdleCtrMax = %d\r\n", OSIdleCtrMax);
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("=================================================================================\r\n");
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС µ±Ç°Ê¹ÓÃÕ» ×î´óջʹÓà Ïß³Ì״̬ Ïß³ÌÔËÐдÎÊý ÈÎÎñÃû\r\n");
tx_mutex_put(&AppPrintfSemp);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" Prio StackSize CurStack MaxStack thread_state thread_count Taskname\r\n");
tx_mutex_put(&AppPrintfSemp);
while (p_tcb != (TX_THREAD *)0)
{
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" %2d %5d %5d %5d %s %5d %s\r\n",
p_tcb->tx_thread_priority,
p_tcb->tx_thread_stack_size,
(int)p_tcb->tx_thread_stack_end - (int)p_tcb->tx_thread_stack_ptr,
(int)p_tcb->tx_thread_stack_end - (int)p_tcb->tx_thread_stack_highest_ptr,
tx_thread_status[p_tcb->tx_thread_state].name,
p_tcb->tx_thread_run_count,
p_tcb->tx_thread_name);
tx_mutex_put(&AppPrintfSemp);
p_tcb = p_tcb->tx_thread_created_next;
if(p_tcb == &AppTaskStatTCB) break;
}
}
void printf_Task_entry(void)
{
uint8_t buffer[7];
double a0;
uint8_t * bufferQ=buffer;
uint32_t num = 0;
uint32_t adcValue = 0;
int64_t lCycleResult = 0;
static bool adc_task_active = true;
bool display_flag;
rtc_status_t R_RTCinformation=(rtc_status_t) R_RTC->RCR2_b.START;
uart_initialize();
R_BSP_PinAccessEnable ();
if (1U == R_SYSTEM->RSTSR0_b.PORF){ printf("MCU Power-On Reset \r\n"); (*(STBRAM_BASE_nmi_reg+4 ))=0; }
if((*(STBRAM_BASE_nmi_reg+4 ))==0xaa)
{
R_RTC_Open(&g_rtc_ctrl, &g_rtc_cfg);
R_RTC->RCR2_b.START = 1U;
printf("MCU Reset rtc_status R_RTC->RCR2_b.START is:%d\r\n",R_RTCinformation);
}
if (1U == R_SYSTEM->RSTSR1_b.SWRF)
{
printf("MCU Software Reset info.%x \r\n",*STBRAM_BASE_nmi_reg);
if (((*STBRAM_BASE_nmi_reg )& 0x5a00)==0x5a00){
printf("No.%d MCU nmi -Independent Watchdog Timer Reset \r\n",((*STBRAM_BASE_nmi_reg )& 0xff));
if((*(STBRAM_BASE_nmi_reg+4 ))==0xaa)
{
rtc_time_t get_time;
R_RTC_CalendarTimeGet(&g_rtc_ctrl, &get_time);
printf(" %d y %d m %d d %d h %d m %d s %d w\n",get_time.tm_year+1900,get_time.tm_mon+1,get_time.tm_mday,get_time.tm_hour,get_time.tm_min,get_time.tm_sec,get_time.tm_wday);
printf("before Reset Timestamp =%d \r\n",(*(STBRAM_BASE_nmi_reg+3 )));
printf("after Reset Timestamp =%d \r\n",convert_to_timestamp( get_time.tm_year, get_time.tm_mon, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec));
} }
}
if (1U == R_SYSTEM->RSTSR1_b.IWDTRF) printf("MCU Independent Watchdog Timer Reset \r\n");
if (1U == R_SYSTEM->RSTSR0_b.DPSRSTF)
{
R_SYSTEM->RSTSR0_b.DPSRSTF = 0;
if (R_SYSTEM->DPSIFR1 >> 1 & 0x01U)
{
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("MCU»½ÐÑԴΪIRQ-9\r\n");
tx_mutex_put(&AppPrintfSemp);
}
else if (R_SYSTEM->DPSIFR1 >> 2 & 0x01U)
{
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("MCU»½ÐÑԴΪIRQ-10\r\n");
printf("No.%d ´ÓÉî¶ÈÈí¼þ´ý»úģʽ»½ÐÑ \r\n",(((*STBRAM_BASE_nmi_reg )>>16 )& 0xff));
tx_mutex_put(&AppPrintfSemp);
if((*(STBRAM_BASE_nmi_reg+4 ))==0xaa)
{
rtc_time_t get_time;
R_RTC_CalendarTimeGet(&g_rtc_ctrl, &get_time);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" %d y %d m %d d %d h %d m %d s %d w\n",get_time.tm_year+1900,get_time.tm_mon+1,get_time.tm_mday,get_time.tm_hour,get_time.tm_min,get_time.tm_sec,get_time.tm_wday);
printf("before sleep Timestamp =%d \r\n",(*(STBRAM_BASE_nmi_reg+2 )));
printf("after sleep Timestamp =%d \r\n",convert_to_timestamp( get_time.tm_year, get_time.tm_mon, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec));
tx_mutex_put(&AppPrintfSemp);
} }
}
perfc_init(true);
if((*(STBRAM_BASE_nmi_reg+4 ))==0xaa)
{
rtc_time_t get_time;
R_RTC_CalendarTimeGet(&g_rtc_ctrl, &get_time);
_tx_time_set( (long) (convert_to_timestamp( get_time.tm_year, get_time.tm_mon, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec)-(*(STBRAM_BASE_nmi_reg+1 )))*1000) ;
}
IRQ_Init ();
AppTaskCreate();
tx_thread_sleep(10);
OSStatInit();
int i=0;
while(true)
{
i++;
if (tx_semaphore_get (&semphr_keyChanged, 0) == TX_NO_INSTANCE)
{
}
else
{scan_0_3V3_flag=!scan_0_3V3_flag;
}
tx_thread_sleep(10);
if (perfc_is_time_out_ms(60000)){
__cycleof__("DispTaskInfo",
{
lCycleResult = __cycle_count__;
}) {
DispTaskInfo();
}
__perf_counter_printf__("\r\n DispTaskInfo(); takes %lld cycles\r\n", lCycleResult);
if (scan_0_3V3_flag)
{Deep_sleep_Enable_flag=0;
}
else
{
if (Deep_sleep_Enable_flag)
{
Deep_sleep_Enable_flag=0;
if (0xa5000000==((*STBRAM_BASE_nmi_reg )& 0xff000000))
{
if (((*STBRAM_BASE_nmi_reg )& 0xFF0000)==0xFF0000) *STBRAM_BASE_nmi_reg =((*STBRAM_BASE_nmi_reg )& 0xa5feffff);
*STBRAM_BASE_nmi_reg =((*STBRAM_BASE_nmi_reg )& 0xFF0000)+0x10000+((*STBRAM_BASE_nmi_reg )& 0xff00ffff);
}
else
{
*STBRAM_BASE_nmi_reg =((*STBRAM_BASE_nmi_reg )& 0xffff)+0xa5000000;
}
printf("MCUÉî¶ÈÈí¼þ´ý»ú״̬info:%x\r\n",*STBRAM_BASE_nmi_reg);
if((*(STBRAM_BASE_nmi_reg+4 ))==0xaa)
{
rtc_time_t get_time;
R_RTC_CalendarTimeGet(&g_rtc_ctrl, &get_time);
(*(STBRAM_BASE_nmi_reg+2 ))=convert_to_timestamp( get_time.tm_year, get_time.tm_mon, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec);
}
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("MCU½øÈëÉî¶ÈÈí¼þ´ý»ú״̬\r\n");
tx_mutex_put(&AppPrintfSemp);
R_LPM_Open(&g_lpm0_ctrl, &g_lpm0_cfg);
R_LPM_LowPowerReconfigure(&g_lpm0_ctrl, &g_lpm0_cfg);
R_LPM_LowPowerModeEnter(&g_lpm0_ctrl);
printf("MCU±»»½ÐÑ£¨³öÏÖ±¾ÏûϢ˵Ã÷³ÌÐò³ö´í£©\r\n");
}
else
{Deep_sleep_Enable_flag=1;
}
}
i=0;
}
if (tx_queue_receive (&queue_adcValue, &num, 0) == TX_SUCCESS )
{
Deep_sleep_Enable_flag=0;
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("$%d %d;", num, 200);
tx_mutex_put(&AppPrintfSemp);
a0 = (double)(num*3.3/4095);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("ADC:%.3f V\r\n", a0);
tx_mutex_put(&AppPrintfSemp);
}
tx_event_flags_set(&EventGroup, 4, TX_OR);
}
}
static void shell_uptime_cmd(char argc, char *argv)
{
DispTaskInfo();
}
NR_SHELL_CMD_EXPORT(uptime, shell_uptime_cmd);
char timeL[3];
#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
int extractDateTime(const char* line, int date) {
int n=999;
if (IS_DIGIT(* (line+date))) timeL[0]=* (line+date);
if (IS_DIGIT(* (line+date+1))) timeL[1]=* (line+date+1);
timeL[2] = '\0';
n = atoi(timeL);
return n;
}
fsp_err_t err = FSP_SUCCESS;
void shell_rtcset_cmd(char argc, char *argv)
{
unsigned int i = 0;
rtc_time_t get_time;
if (argc > 2)
{
for (i = 1; i < argc; i++)
{
shell_printf("paras %d: %s\r\n", i, &(argv[argv[i]]));
}
if (!strcmp("-a", &argv[argv[1]]))
{
char *endptr;
long int num = strtol((&argv[argv[2]]), &endptr, 10);
R_RTC_CalendarTimeGet(&g_rtc_ctrl, &get_time);
ULONG Timestamp=(long)convert_to_timestamp( get_time.tm_year, get_time.tm_mon, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec)+num;
shell_printf("Timestamp %d\r\n", Timestamp);
get_time = *localtime(&Timestamp);
printf(" %d y %d m %d d %d h %d m %d s %d w\n",get_time.tm_year+1900,get_time.tm_mon+1,get_time.tm_mday,get_time.tm_hour,get_time.tm_min,get_time.tm_sec,get_time.tm_wday);
R_RTC_CalendarTimeSet(&g_rtc_ctrl, &get_time);
}
else
{
i = 1;
get_time.tm_year =extractDateTime(&(argv[argv[i]]), 0);
if((get_time.tm_year)>=25 && (get_time.tm_year)<= 99)get_time.tm_year =get_time.tm_year +100;
else{ shell_printf("rtcset 25/09/29 13:00:00\r\n");
shell_printf("rtcset error\r\n");
return;}
get_time.tm_mon =extractDateTime(&(argv[argv[i]]), 3);
if((get_time.tm_mon)>=1 && (get_time.tm_mon)<= 12)get_time.tm_mon =get_time.tm_mon -1;
else{ shell_printf("rtcset 25/09/29 13:00:00\r\n");
shell_printf("rtcset error\r\n");
return;}
get_time.tm_mday =extractDateTime(&(argv[argv[i]]), 6);
if((get_time.tm_mday)>=1 && (get_time.tm_mday)<= 31)get_time.tm_mday =get_time.tm_mday ;
else{ shell_printf("rtcset 25/09/29 13:00:00\r\n");
shell_printf("rtcset error\r\n");
return;}
i = 2;
get_time.tm_hour =extractDateTime(&(argv[argv[i]]), 0);
if((get_time.tm_hour)>=0 && (get_time.tm_hour)<= 23)get_time.tm_hour =get_time.tm_hour ;
else{ shell_printf("rtcset 25/09/29 13:00:00\r\n");
shell_printf("rtcset error\r\n");
return;}
get_time.tm_min =extractDateTime(&(argv[argv[i]]), 3);
if((get_time.tm_min)>=0 && (get_time.tm_min)<= 59)get_time.tm_min =get_time.tm_min ;
else{ shell_printf("rtcset 25/09/29 13:00:00\r\n");
shell_printf("rtcset error\r\n");
return;}
get_time.tm_sec =extractDateTime(&(argv[argv[i]]), 6);
if((get_time.tm_sec)>=0 && (get_time.tm_sec)<= 59)get_time.tm_sec =get_time.tm_sec ;
else{ shell_printf("rtcset 25/09/29 13:00:00\r\n");
shell_printf("rtcset error\r\n");
return;}
err = R_RTC_Open(&g_rtc_ctrl, &g_rtc_cfg);
assert(FSP_SUCCESS == err);
err = R_RTC_CalendarTimeSet(&g_rtc_ctrl, &get_time);
assert(FSP_SUCCESS == err);
ULONG get_txtime=_tx_time_get()/1000;
R_RTC_CalendarTimeGet(&g_rtc_ctrl, &get_time);
ULONG Timestamp=(long)convert_to_timestamp( get_time.tm_year, get_time.tm_mon, get_time.tm_mday, get_time.tm_hour, get_time.tm_min, get_time.tm_sec);
printf(" %d y %d m %d d %d h %d m %d s %d w\n",get_time.tm_year+1900,get_time.tm_mon+1,get_time.tm_mday,get_time.tm_hour,get_time.tm_min,get_time.tm_sec,get_time.tm_wday);
(*(STBRAM_BASE_nmi_reg+4 ))=0xaa;
printf("get_txtime: %lu s\r\n", get_txtime);
printf("Timestamp: %ld\n", (long)Timestamp);
(*(STBRAM_BASE_nmi_reg+1 ))=(Timestamp-get_txtime);
printf("start boot Timestamp: %ld\n", (long)(*(STBRAM_BASE_nmi_reg+1 )));
}
}
else
{
shell_printf("rtcset need more arguments!\r\n");
shell_printf("rtcset 25/09/29 13:00:00\r\n");
shell_printf("rtcset error\r\n");
}
}
NR_SHELL_CMD_EXPORT(rtcset, shell_rtcset_cmd);
void shell_STBRAMinfo_cmd(char argc, char *argv)
{
printf("STBRAM_BASE_nmi_reg info.%x \r\n",*STBRAM_BASE_nmi_reg);
printf("STBRAM_BASE_nmi_reg+1 info.%d \r\n",*(STBRAM_BASE_nmi_reg+1));
printf("STBRAM_BASE_nmi_reg+2 info.%d \r\n",*(STBRAM_BASE_nmi_reg+2));
printf("STBRAM_BASE_nmi_reg+3 info.%d \r\n",*(STBRAM_BASE_nmi_reg+3));
printf("STBRAM_BASE_nmi_reg+4 info.%x \r\n",*(STBRAM_BASE_nmi_reg+4));
printf("STBRAM_BASE_nmi_reg+5 info.%x \r\n",*(STBRAM_BASE_nmi_reg+5));
}
NR_SHELL_CMD_EXPORT(STBRAMinfo, shell_STBRAMinfo_cmd);
volatile uint8_t* reg_addr = (volatile uint8_t*)0x00;
void shell_readMinfo_cmd(char argc, char *argv)
{
char* str;
long int i = strtol((&argv[argv[1]]),&str, 16);
printf("%d\r\n", i);
uint8_t value = *reg_addr;
long int valuenum = strtol((&argv[argv[2]]),&str, 16);
printf("0x%x\r\n", valuenum);
for(int l=0;l<i;l++)
{
printf("reg %x info:%x \r\n",valuenum+l,*(reg_addr+valuenum+l));
if(0==(i%10))R_IWDT_Refresh(&g_wdt0_ctrl);
}
}
NR_SHELL_CMD_EXPORT(readMinfo, shell_readMinfo_cmd);
void shell_aDCreado_cmd(char argc, char *argv)
{ uint16_t value;
char* str;
long int i = strtol((&argv[argv[1]]),&str, 16);
printf("%d\r\n", i);
double a0;
for(int l=0;l<i;l++)
{
if(0==(i%10))R_IWDT_Refresh(&g_wdt0_ctrl);
value = Read_ADC_Voltage_Value();
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("$%d %d;", value, 200);
tx_mutex_put(&AppPrintfSemp);
a0 = (double)(value*3.3/4095);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("ADC:%.3f V\r\n", a0);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
}
}
NR_SHELL_CMD_EXPORT(aDCreado, shell_aDCreado_cmd);
volatile bool rtc_flag = 0;
volatile bool rtc_alarm_flag = 0;
void rtc_callback(rtc_callback_args_t* p_args)
{
if(p_args->event == RTC_EVENT_PERIODIC_IRQ)
rtc_flag = 1;
else if(p_args->event == RTC_EVENT_ALARM_IRQ)
rtc_alarm_flag = 1;
}
**‘在hal_entry.c不需要加入任何代码,所有与os有关代码由[瑞萨]在生成项目时完成了.’**这次编译没有出错:
73 warnings generated.
compiling printf_Task_entry.c...
linking...
Program Size: Code=30976 RO-data=2616 RW-data=2768 ZI-data=13744
FromELF: creating hex file...
After Build - User command #1: cmd /c ""E:\lst\ra4l1\ra4-e2-64\FSP_Project\rasc_launcher.bat" "E:\lst\ra4l1\ra4-e2-64\FSP_Project\rasc_version.txt" -nosplash --launcher.suppressErrors --gensmartbundle --compiler ARMv6 --devicefamily ra "E:\lst\ra4l1\ra4-e2-64\FSP_Project\configuration.xml" "E:\lst\ra4l1\ra4-e2-64\FSP_Project\Objects\FSP_Project.axf" 2> "%TEMP%\rasc_stderr.out""
[INFO] Input file "E:\lst\ra4l1\ra4-e2-64\FSP_Project\Objects\FSP_Project.axf" is newer than output file "E:\lst\ra4l1\ra4-e2-64\FSP_Project\Objects\FSP_Project.sbd". Proceeding with RASC invocation...
Generating Smart Bundle..
".\Objects\FSP_Project.axf" - 0 Error(s), 103 Warning(s).
Build Time Elapsed: 00:00:25
rfp-cli.exe命令行烧录部分 :* MODE CONFIG**
配置成sci boot模式* 连接带自己USB-com接口tx,rx到usb
*
*找到编译后hex文件\FSP_Project\Objects\FSP_Project.hex并copy到Renesas Flash软件安后目录用type-c usb 连接线连接开发板和电脑,在设备管理器找到com口号为com5在Renesas Flash软件安后目录打开命令窗口,每次发送命令前最好按一下复位。运行各命令。命令rfp-cli -d RA -lp 查看可以用com口```
rfp-cli.exe命令行烧录部分 :
- MODE CONFIG**
配置成sci boot模式
- 连接带自己USB-com接口tx,rx到usb


*找到编译后hex文件\FSP_Project\Objects\FSP_Project.hex并copy到Renesas Flash软件安后目录
用type-c usb 连接线连接开发板和电脑,在设备管理器找到com口号为com5
在Renesas Flash软件安后目录打开命令窗口,每次发送命令前最好按一下复位。运行各命令。
命令rfp-cli -d RA -lp 查看可以用com口
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
[Port]
COM5
COM6
COM7
命令 rfp-cli -d RA -port COM5 -ls查看可以用速度
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Disconnecting the tool[Speed]
9600
115200
命令 rfp-cli -d RA -port COM5 -sig查看目标信息
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Speed: 115,200 bps
Connected to R7FA4E2B93CFM
Signature:
Device: R7FA4E2B93CFM
Boot Firmware Version: V7.0.0
Device Unique ID: 4E4B2D5C5B634B533539393742037771
Device Code: 05
Memory Info:
00000000 - 0000FFFF: Code Flash 1 (Block Size: 8 KB)
00010000 - 0001FFFF: Code Flash 1 (Block Size: 32 KB)
08000000 - 08000FFF: Data Flash 1 (Block Size: 64)
0100A100 - 0100A2FF: Config Area 1 (Block Size: 512)
Disconnecting the tool
Operation successful
命令rfp-cli -d RA -port COM5 -file lu.hex -p 烧录
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Load: "E:\\\\Renesas Electronics\\\\Programming Tools\\\\Renesas Flash Programmer V3.19\\\\FSP_Project.hex" (Size=42459, CRC=68D14AFE)
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Speed: 115,200 bps
Connected to R7FA4E2B93CFM
Erasing the target device
[Code Flash 1] 00000000 - 00003FFF
Writing data to the target device
[Code Flash 1] 00000000 - 0000397F
[Config Area 1] 0100A100 - 0100A17F
[Config Area 1] 0100A200 - 0100A2FF
Disconnecting the tool
Operation successful

命令rfp-cli -d RA -port COM5 -rv 0 10 读取目标地址 数量数据
Renesas Flash Programmer CLI V1.12
Module Version: V3.19.00.000
Connecting the tool (COM port)
Tool: COM5
Interface: 2 wire UART
Connecting the target device
Speed: 115,200 bps
Connected to R7FA4E2B93CFM
Reading data from the device
[Code Flash 1] 00000000 - 00000009
Address | 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
---------+------------------------------------------------
00000000 | 40 60 00 20 91 0C 00 00 85 03
Disconnecting the tool
Operation successful
- 文件前16字节:40600020910C000085030000B3020000

*烧录数据正确,成功
MODE CONFIG* *
配置成flash模式,运行成功,
com显示:
l_key 3
shell_Ff=1
Welcome to the micro_shell v0.01! Build time Sep 28 2025 08:45:43
cmd@lustao:iwdt_counter=1942
cmd@lustaortcset 25/09/28 08:45:43
paras 1: 25/09/28
paras 2: 08:45:43
2025 y 9 m 28 d 20 h 24 m 24 s 0 w
get_txtime: 175 s
Timestamp: 1759091064
start boot Timestamp: 1759090889
cmd@lustao:tick : 180142
=================================================================================
OS CPU Usage = 4.42% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
OS CPU OSIdleCtrRun = 795204
OS CPU OSIdleCtrMax = 8320
=================================================================================
ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС µ±Ç°Ê¹ÓÃÕ» ×î´óջʹÓà Ïß³Ì״̬ Ïß³ÌÔËÐдÎÊý ÈÎÎñÃû
Prio StackSize CurStack MaxStack thread_state thread_count Taskname
30 512 259 536874895 READY 1378 App Task STAT
31 256 83 536874207 READY 49781 App Task IDLE
2 256 107 536872655 READY 4589 KeySwitch
2 1024 115 536872399 READY 1378 ADC_Voltage
1 1024 371 536873679 READY 13751 printF
28 1024 115 536877591 READY 37123 shell
cmd@lustao:readMinfo 11 0x28000000
17
0x28000000
reg 28000000 info:0
reg 28000001 info:5a
reg 28000002 info:d3
reg 28000003 info:e5
reg 28000004 info:c9
reg 28000005 info:98
reg 28000006 info:d9
reg 28000007 info:68
reg 28000008 info:20
reg 28000009 info:2d
reg 2800000a info:da
reg 2800000b info:3e
reg 2800000c info:69
reg 2800000d info:9e
reg 2800000e info:90
reg 2800000f info:d
reg 28000010 info:aa
S_key 1
$1581 200;ADC:1.274 V
$1892 200;ADC:1.525 V
$1929 200;ADC:1.555 V
$1848 200;ADC:1.489 V
S_key 1
cmd@lustao:
aDCreado 22
34
$400 200;ADC:0.322 V
$1828 200;ADC:1.473 V
$3324 200;ADC:2.679 V
$3599 200;ADC:2.900 V
$2799 200;ADC:2.256 V
$1211 200;ADC:0.976 V
$304 200;ADC:0.245 V
$187 200;ADC:0.151 V
$520 200;ADC:0.419 V
cmd@lustao:MCU Reset rtc_status R_RTC->RCR2_b.START is:1
MCU Software Reset info.a5005a01
No.1 MCU nmi -Independent Watchdog Timer Reset
2025 y 9 m 28 d 20 h 28 m 0 s 0 w
before Reset Timestamp =1759091280
after Reset Timestamp =1759091280

在串口调试助手中看见rtc信息,唤醒成信息包括系统tick 复位状态信息。
达到预期状态。