续前【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+深度软件待机模式
独立看门狗定时器:
由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,简单来说,看门狗就是在不停地对我们正在运行的程序进行监视,我们必须在规定的时间的有效的时间内去进行“喂狗”操作,这样看门狗就知道我们的程序正在正常的运行,如果我们程序由于外界原因跑飞了,那么就无法进行喂狗操作,那么看门狗由于饥饿难耐,他就会使我们的单片机进行复位,以便让程序重新开始运行。
瑞萨IWDT——独立看门狗定时器是一种独立看门狗定时器,用于MCU的故障恢复。它使用自带的时钟源,具有14位计数器,可设置超时时间和安全属性。IWDT功能包括自动启动模式、NMI或复位输出,并可通过配置选择不同的工作模式和中断请求。
事件标志组用作看门狗来监督任务执行。
事件标志组:
事件标志组是实现多任务同步的有效机制之一。也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单,其实不然。在裸机编程时,使用全局变量的确比较方便,但是在加上RTOS后就是另一种情况了。使用全局变量相比事件标志组主要有如下2个问题:
- 使用事件标志组可以让RTOS内核有效的管理任务,全局变量是无法做到的,任务的超时等机制需要用户自己去实现。
- 使用了全局变量就要防止多任务的访问冲突,使用事件标志组已经处理好了这个问题。用户无需担心。
任务分为不同的优先级,通过等待多个内核对象实现并发执行。看门狗任务确保所有被监控任务在设定的时间内至少运行一次,防止系统挂起。
本次项目准备采用事件标志组和独立看门狗定时器保证程序运行。
rasc部分
打开【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+深度软件待机模式配置的RA Smart Configurator.
独立看门狗定时器配置
在Stacks项中 点击Stacks->New Stack->Monitoring -> Independent Watchdog(r_iwdt)。
独立看门狗定时器 IWDT属性配置
在下面配置中:
Name : g_wdt0
NMI callback : iwdt_callback

然后点击 BSP 的属性settings界面,找到 OFS0 register settings-> Independent WDT 去设置 IWDT 的属性。
Start Mode: IWDT is automatically activated after a reset (Autostart mode)
Timeout Period: 2048 cycles
Dedicated Clock Frequency Divisor: 16
Reset Interrupt Request Select: NMI request or interrupt request is enabled
独立看门狗超时时间计算:
首先,独立看门狗的输入时钟频率为 15000hz
时钟分频比等于 16
将循环周期设为 2048 cycles
那么,可以得到独立看门狗的时钟频率 15000Hz / 16 = 937.5hz
周期时间等于 1/937.5hz = 1 ms
最终计算出设置的超时时间 = 1 ms x 2048 cycles = 2 秒左右
Tips: cycles :配置的循环周期次数,此数值越大,超时时间越长。

事件标志组
点击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有关代码由[瑞萨]在生成项目时完成了.’
相关独立看门狗定时器 代码都放在printf_Task_Task.c 中:
#include "printf_Task.h"
#include "uart/uart.h"
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);
}
volatile _Bool key_flag = false; //ÉèÖñê־λ
/*°´¼ü1Öжϻص÷£¬ÓÃÓÚ½øÈëÉî¶È˯Ãß»ò»½ÐÑ*/
void key_irq_callback(external_irq_callback_args_t *p_args)
{
/*·ÀÖ¹±àÒëÆ÷²úÉúûÓÐʹÓÃÐβεľ¯¸æ*/
FSP_PARAMETER_NOT_USED(p_args);
key_flag = true;
}
/*³õʼ»¯¿´ÃŹ·²¢Æô¶¯¼ÆÊýÆ÷*/
void IWDT_Init(void)
{
//Èç¹ûʹÓÃJ-Linkµ÷ÊÔÆ÷½øÐе÷ÊԵϰÐèÒª¼ÓÉÏÕâÒ»¾ä»°
R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0;
//³õʼ»¯¿´ÃŹ·£¨WDT£©Ä£¿é
R_IWDT_Open(&g_iwdt0_ctrl, &g_iwdt0_cfg);
}
/*ι¹·*/
void IWDT_Feed(void)
{
/*ι¹·£¬Ë¢Ðµݼõ¼ÆÊýÆ÷µÄÖµ*/
R_IWDT_Refresh(&g_iwdt0_ctrl);
}/* µ±¿´ÃŹ·NMI·¢ÉúʱÖжϻص÷ */
void iwdt_callback (wdt_callback_args_t * p_args)
{
/*·ÀÖ¹±àÒëÆ÷²úÉú¹ØÓÚº¯ÊýÖÐûÓÐʹÓÃÐβεľ¯¸æ*/
(void) p_args;
/*À¶É«LEDÁÁ£¬Çë×¢Ò⣬ÔÚÕâÀïLEDµÆº¯ÊýΪ´úÖ¸£¬
*ʵ¼ÊÓ¦ÓÃÖУ¬ÕâÀïÓ¦¸Ã·Å×îÖØÒªµÄº¯Êý£¬±ÈÈç±£´æÖØÒªÊý¾ÝµÈ*/
LED1_OFF;
LED2_ON;
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);
/* ͨ¹ýÈí¼þ¸´Î»MCU*/
__NVIC_SystemReset();
}
/*
*******************************************************************************************************
* ±äÁ¿
*******************************************************************************************************
*/
static TX_MUTEX AppPrintfSemp; /* ÓÃÓÚprintf»¥³â */
//extern void SysTick_ISR(void);
//#define bsp_ProPer1ms SysTick_ISR
/* ͳ¼ÆÈÎÎñʹÓà */
__IO uint8_t OSStatRdy; /* ͳ¼ÆÈÎÎñ¾ÍÐ÷±êÖ¾ */
__IO uint32_t OSIdleCtr; /* ¿ÕÏÐÈÎÎñ¼ÆÊý */
__IO float OSCPUUsage; /* CPU°Ù·Ö±È */
uint32_t OSIdleCtrMax; /* 1ÃëÄÚ×î´óµÄ¿ÕÏмÆÊý OS CPU OSIdleCtrMax = 8224 250906 OS CPU OSIdleCtrMax = 8320 250907 */
uint32_t OSIdleCtrRun; /* 1ÃëÄÚ¿ÕÏÐÈÎÎñµ±Ç°¼ÆÊý */
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 AppTaskStartTCB;
//static uint64_t AppTaskStartStk[1024/8];
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskStart
* ¹¦ÄÜ˵Ã÷: Æô¶¯ÈÎÎñ¡£
* ÐÎ ²Î: thread_input ÊÇÔÚ´´½¨¸ÃÈÎÎñʱ´«µÝµÄÐβÎ
* ·µ »Ø Öµ: ÎÞ
ÓÅ ÏÈ ¼¶: 2
*********************************************************************************************************
*/
//static void AppTaskStart (ULONG thread_input)
//{
// (void)thread_input;
// tx_thread_sleep(1000);
// while (1)
// {
// /* ÐèÒªÖÜÆÚÐÔ´¦ÀíµÄ³ÌÐò£¬¶ÔÓ¦Âã»ú¹¤³Ìµ÷ÓõÄSysTick_ISR */
//// bsp_ProPer1ms();
// tx_thread_sleep(1);
// }
//}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskStatistic
* ¹¦ÄÜ˵Ã÷: ͳ¼ÆÈÎÎñ£¬ÓÃÓÚʵÏÖCPUÀûÓÃÂʵÄͳ¼Æ¡£ÎªÁ˲âÊÔ¸ü¼Ó׼ȷ£¬¿ÉÒÔ¿ªÆô×¢Ê͵÷ÓõÄÈ«¾ÖÖжϿª¹Ø
* ÐÎ ²Î: thread_input ´´½¨¸ÃÈÎÎñʱ´«µÝµÄÐβÎ
* ·µ »Ø Öµ: ÎÞ
* ÓÅ ÏÈ ¼¶: 30
*********************************************************************************************************
*/
void OSStatInit (void)
{
OSStatRdy = 0;
tx_thread_sleep(2u); /* ʱÖÓͬ²½ */
//__disable_irq();
OSIdleCtr = 0uL; /* Çå¿ÕÏмÆÊý */
//__enable_irq();
tx_thread_sleep(100); /* ͳ¼Æ100msÄÚ£¬×î´ó¿ÕÏмÆÊý */
//__disable_irq();
OSIdleCtrMax = 832000;
if (OSIdleCtr > OSIdleCtrMax) OSIdleCtrMax = OSIdleCtr; /* ±£´æ×î´ó¿ÕÏмÆÊý */
OSStatRdy = 1;
//__enable_irq();
}
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;
}
//__disable_irq();
OSIdleCtr = OSIdleCtrMax * 100uL; /* ÉèÖóõʼCPUÀûÓÃÂÊ 0% */
//__enable_irq();
ULONG actual_events;
UINT status;
for (;;)
{
// __disable_irq();
OSIdleCtr = 0uL; /* ¸´Î»¿ÕÏмÆÊý */
tx_thread_sleep(100); /* ÿ100msͳ¼ÆÒ»´Î */
OSIdleCtrRun = OSIdleCtr; /* »ñµÃ100msÄÚ¿ÕÏмÆÊý */
// __enable_irq(); /* ¼ÆËã100msÄÚµÄCPUÀûÓÃÂÊ */
OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
if(OSIdleCtrRun) {
status = tx_event_flags_get(&EventGroup, /* ʼþ±êÖ¾¿ØÖÆ¿é */
7, /* µÈ´ý±êÖ¾ */
TX_AND_CLEAR , /* µÈ´ýËùÓÐ bit Âú×ã¼´¿É ,Ö®ºóÏàÓ¦µÄ bit ½«±»ÇåÁã*/
&actual_events, /* »ñȡʵ¼ÊÖµ */
TX_NO_WAIT);/* ±íʾ²»¹ÜÊÇ·ñÂú×ãµÈ´ýÌõ¼þ£¬Á¢¼´·µ»Ø */
if(status == TX_SUCCESS)
{
uint32_t iwdt_counter;
err = R_IWDT_CounterGet(&g_iwdt0_ctrl, &iwdt_counter);
/* Refresh before the counter underflows to prevent reset or NMI. */
(void) R_IWDT_Refresh(&g_iwdt0_ctrl);
assert(FSP_SUCCESS == err);
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf("iwdt_counter=%d\\\\n",iwdt_counter);
tx_mutex_put(&AppPrintfSemp);
// ι¹·
// IWDT_Feed();
}
// Çå³ýËùÓÐʼþ±ê־λ
// status = tx_event_flags_clear(&my_events, TX_ALL);
// ÉèÖÃʼþ±ê־룬ÉèÖõڶþ¸öºÍµÚËĸö±ê־λ
// UINT status = tx_event_flags_set(&my_events, 0x0C, TX_OR);
// tx_event_flags_set(&EventGroup, BIT_0, TX_OR);
// tx_event_flags_set(&EventGroup, BIT_1, TX_OR);
//#define BIT_0 (1 << 0)
//#define BIT_1 (1 << 1)
//#define BIT_ALL (BIT_0 | BIT_1)
}
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskIDLE
* ¹¦ÄÜ˵Ã÷: ¿ÕÏÐÈÎÎñ
* ÐÎ ²Î: thread_input ´´½¨¸ÃÈÎÎñʱ´«µÝµÄÐβÎ
* ·µ »Ø Öµ: ÎÞ
ÓÅ ÏÈ ¼¶: 31
*********************************************************************************************************
*/
static void AppTaskIDLE(ULONG thread_input)
{
TX_INTERRUPT_SAVE_AREA
(void)thread_input;
while(1)
{
TX_DISABLE
OSIdleCtr++;
TX_RESTORE
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppTaskCreate
* ¹¦ÄÜ˵Ã÷: ´´½¨Ó¦ÓÃÈÎÎñ
* ÐÎ ²Î: ÎÞ
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
/*
Èç¹ûʵÏÖÈÎÎñCPUÀûÓÃÂÊͳ¼ÆµÄ»°£¬´Ëº¯Êý½öÓÃÓÚʵÏÖÆô¶¯ÈÎÎñ£¬Í³¼ÆÈÎÎñºÍ¿ÕÏÐÈÎÎñ£¬ÆäËüÈÎÎñÔÚº¯Êý
AppTaskCreateÀïÃæ´´½¨¡£
*/
/**************´´½¨Æô¶¯ÈÎÎñ*********************/
// tx_thread_create(&AppTaskStartTCB, /* ÈÎÎñ¿ØÖÆ¿éµØÖ· */
// "App Task Start", /* ÈÎÎñÃû */
// AppTaskStart, /* Æô¶¯ÈÎÎñº¯ÊýµØÖ· */
// 0, /* ´«µÝ¸øÈÎÎñµÄ²ÎÊý */
// &AppTaskStartStk[0], /* ¶ÑÕ»»ùµØÖ· */
// 1024, /* ¶ÑÕ»¿Õ¼ä´óС */
// 2, /* ÈÎÎñÓÅÏȼ¶*/
// 2, /* ÈÎÎñÇÀÕ¼·§Öµ */
// TX_NO_TIME_SLICE, /* ²»¿ªÆôʱ¼äƬ */
// TX_AUTO_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); /* ´´½¨ºóÁ¢¼´Æô¶¯ */
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AppObjCreate
* ¹¦ÄÜ˵Ã÷: ´´½¨ÈÎÎñͨѶ
* ÐÎ ²Î: ÎÞ
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
static void AppObjCreate (void)
{
/* ´´½¨»¥³âÐźÅÁ¿ */
tx_mutex_create(&AppPrintfSemp,"AppPrintfSemp",TX_NO_INHERIT);
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: DispTaskInfo
* ¹¦ÄÜ˵Ã÷: ½«ThreadXÈÎÎñÐÅϢͨ¹ý´®¿Ú´òÓ¡³öÀ´
* ÐÎ ²Î£ºÎÞ
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
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 Taskname thread_state thread_count\\\\r\\\\n");
tx_mutex_put(&AppPrintfSemp);
// App_Printf("===============================================================\\\\r\\\\n");
// App_Printf("OS CPU Usage = %5.2f%%\\\\r\\\\n", OSCPUUsage);
// App_Printf("===============================================================\\\\r\\\\n");
// App_Printf(" ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС µ±Ç°Ê¹ÓÃÕ» ×î´óջʹÓà ÈÎÎñÃû Ïß³Ì״̬ Ïß³ÌÔËÐдÎÊý\\\\r\\\\n");
// App_Printf(" Prio StackSize CurStack MaxStack Taskname thread_state thread_count\\\\r\\\\n");
//thread->tx_thread_state
/* typedef struct
{
u8 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"},
}; */
// thread->tx_thread_run_count Ïß³ÌÔËÐдÎÊý
/* ±éÀúÈÎÎñ¿ØÖÆÁбíTCB list)£¬´òÓ¡ËùÓеÄÈÎÎñµÄÓÅÏȼ¶ºÍÃû³Æ */
while (p_tcb != (TX_THREAD *)0)
{
tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
printf(" %2d %5d %5d %5d %s %2d %5d\\\\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,
p_tcb->tx_thread_name,
p_tcb->tx_thread_state,
p_tcb->tx_thread_run_count);
printf(" %5d \\\\r\\\\n", (int)p_tcb->tx_thread_stack_highest_ptr);
tx_mutex_put(&AppPrintfSemp);
p_tcb = p_tcb->tx_thread_created_next;
if(p_tcb == &AppTaskStatTCB) break;
}
}
/* printF entry function */
void printf_Task_entry(void)
{
/* Äں˿ªÆôºó£¬»Ö¸´HALÀïµÄʱ¼ä»ù×¼ */
// HAL_ResumeTick();
/* TODO: add your own code here */
uint8_t buffer[7];
double a0;
uint8_t * bufferQ=buffer;
uint32_t num = 0;
uint32_t adcValue = 0;
static bool adc_task_active = true;
bool display_flag;
/* Initializing UART */
uart_initialize();
IRQ_Init (); //°´¼üÖжϳõʼ»¯
R_BSP_PinAccessEnable (); //ÆôÓöÔPFS¼Ä´æÆ÷µÄ·ÃÎÊ,ÒòΪºóÃæÐ´IO¿Ú¶¼ÓÃBSPÄÚÁªº¯Êý
/*ÅжÏÊÇ·ñÔÚÉî¶ÈÈí¼þ´ý»úģʽϱ»»½ÐÑ*/
if (1U == R_SYSTEM->RSTSR0_b.DPSRSTF)
{
/*´ÓÉî¶ÈÈí¼þ´ý»úģʽ»½ÐѺóÇå³ýIOkeep룬ÒÔÔÊÐíʹÓÃIO¶Ë¿Ú*/
R_LPM_IoKeepClear (NULL);
/*Çå³ý»½Ðѱê־λ*/
R_SYSTEM->RSTSR0_b.DPSRSTF = 0;
/*Åжϻ½ÐÑÔ´ÊÇIRQ-9»¹ÊÇIRQ-10£¬²¢½«ÅжϽá¹û´òÓ¡³öÀ´*/
if (R_SYSTEM->DPSIFR1 >> 1 & 0x01U)
{
printf("MCU»½ÐÑԴΪIRQ-9\\\\r\\\\n");
}
else if (R_SYSTEM->DPSIFR1 >> 2 & 0x01U)
{
printf("MCU»½ÐÑԴΪIRQ-10\\\\r\\\\n");
}
}
/* ´´½¨ÈÎÎñ */
AppTaskCreate();
/* ´´½¨ÈÎÎñ¼äͨÐÅ»úÖÆ */
AppObjCreate();
/* ÓÅÏÈÖ´ÐÐÈÎÎñͳ¼Æ */
tx_thread_sleep(10);
OSStatInit();
int i=0;
while(true)
{
i++;
//TX_NO_INSTANCEÊÇThreadX¶¨ÒåµÄ³£Á¿£¬±íʾÐźÅÁ¿ÊµÀý²»´æÔÚ
//µ±º¯Êý·µ»ØTX_NO_INSTANCEʱ£¬±íʾϵͳÎÞ·¨ÕÒµ½ÃûΪsemphr_keyChangedµÄÐźÅÁ¿ÊµÀý¡£Õâͨ³£Òâζ×Å£º
//ÐźÅÁ¿ÉÐδ±»´´½¨
//ÐźÅÁ¿Ãû³ÆÆ´Ð´´íÎó
//ÐźÅÁ¿Òѱ»É¾³ý
//ÕâÖÖ¼ì²éÔÚÐèҪȷ±£ÐźÅÁ¿´æÔÚºó²ÅÄܰ²È«Ê¹Óõij¡¾°Öкܳ£¼û¡£
if (tx_semaphore_get (&semphr_keyChanged, 0) == TX_NO_INSTANCE)
{
}
else
{scan_0_3V3_flag=!scan_0_3V3_flag;
// printf("!scan_0_3V3_flag;S_key 1 \\\\r\\\\n");
}
tx_thread_sleep(10);
if(i==5990){
DispTaskInfo();
if (scan_0_3V3_flag)
{Deep_sleep_Enable_flag=0;
}
else
{if (Deep_sleep_Enable_flag)
{
Deep_sleep_Enable_flag=0;
/*½øÈëµÍ¹¦ºÄģʽǰ´òÓ¡*/
printf("MCU½øÈëÉî¶ÈÈí¼þ´ý»ú״̬\\\\r\\\\n");
/*´ò¿ªLPM,½øÈëÉî¶ÈÈí¼þ´ý»ú״̬*/
R_LPM_Open(&g_lpm0_ctrl, &g_lpm0_cfg);
// R_LPM_Open (snooze.p_ctrl, deep_sw_standby.p_cfg);
R_LPM_LowPowerReconfigure(&g_lpm0_ctrl, &g_lpm0_cfg);
R_LPM_LowPowerModeEnter(&g_lpm0_ctrl);
// R_LPM_LowPowerModeEnter (deep_sw_standby.p_ctrl);
/*»½ÐѺó´òÓ¡£¬µ«ÊÇÔÚ½øÈëÉî¶ÈÈí¼þ´ý»úģʽºó²»Äܱ£´æÉÏÏÂÎÄ£¬
¹ÊÕâÀïÕý³£À´ËµÎÞ·¨±»Ö´ÐÐ,Èç¹ûÖ´ÐÐÁËÔò˵Ã÷½øÈëµÄÊÇ˯Ãßģʽ£¬
Ò²¾ÍÊdzÌÐò³öÏÖÁËÎÊÌ⣬һ°ã¸ÕÉÕд³ÌÐò»áµ¼ÖÂÕâ¸öÎÊÌâ£¬ÖØÐÂÉϵ缴¿É»Ö¸´Õý³£*/
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;
// printf("ADC:%d\\\\r\\\\n", num);
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);
// buffer[3]=(uint8_t *)(num>8);
// buffer[4]=(uint8_t *)(num&0xff);
// buffer[0]=0xff;
// buffer[1]=0xfe;
// buffer[2]=0x01;
// buffer[5]=0x0;
// TBE = false;
// R_SCI_UART_Write(&g_uart0_ctrl, bufferQ, 6);
// while(TBE == false);
// TBE = false;
}
tx_event_flags_set(&EventGroup, 4, TX_OR);
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: App_Printf
* ¹¦ÄÜ˵Ã÷: Ḭ̈߳²È«µÄprintf·½Ê½
* ÐÎ ²Î: ͬprintfµÄ²ÎÊý¡£
* ÔÚCÖУ¬µ±ÎÞ·¨Áгö´«µÝº¯ÊýµÄËùÓÐʵ²ÎµÄÀàÐͺÍÊýĿʱ,¿ÉÒÔÓÃÊ¡ÂÔºÅÖ¸¶¨²ÎÊý±í
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
//static void App_Printf(const char *fmt, ...)
//{
// char buf_str[200 + 1]; /* ÌØ±ð×¢Ò⣬Èç¹ûprintfµÄ±äÁ¿½Ï¶à£¬×¢Òâ´Ë¾Ö²¿±äÁ¿µÄ´óСÊÇ·ñ¹»Óà */
// va_list v_args;
// va_start(v_args, fmt);
// (void)vsnprintf((char *)&buf_str[0],
// (size_t ) sizeof(buf_str),
// (char const *) fmt,
// v_args);
// va_end(v_args);
// /* »¥³â²Ù×÷ */
// tx_mutex_get(&AppPrintfSemp, TX_WAIT_FOREVER);
// printf("%s", buf_str);
// tx_mutex_put(&AppPrintfSemp);
//}
其中 void printf_Task_entry(void)的while中增加:
tx_event_flags_set(&EventGroup, 4, TX_OR);
其中 void Key_Switch_Task_entry(void)的while中增加:
tx_event_flags_set(&EventGroup, 2, TX_OR);
其中 void ADC_Task_entry(void)的while中增加:
tx_event_flags_set(&EventGroup, 1, TX_OR);```
**‘在hal_entry.c不需要加入任何代码,所有与os有关代码由[瑞萨]在生成项目时完成了.’**这次编译没有出错:
2 warnings generated.
compiling r_iwdt.c...
linking...
Program Size: Code=20620 RO-data=1264 RW-data=2320 ZI-data=12248
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..
After Build - User command #2: keil-builder-viewer.exe
".\\\\Objects\\\\FSP_Project.axf" - 0 Error(s), 488 Warning(s).
Build Time Elapsed: 00:02:44
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显示:
iwdt_counter=1725
iwdt_counter=1950
iwdt_counter=1949
S_key 1
$2905 200;ADC:2.341 V
iwdt_counter=1950
$3347 200;ADC:2.697 V
tick : 60569
===============================================================
OS CPU Usage = 3.45% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
OS CPU OSIdleCtrRun = 803275
OS CPU OSIdleCtrMax = 8320
===============================================================
????????? ???????С ??????? ??????? ?????? ????? ??????д???
Prio StackSize CurStack MaxStack Taskname thread_state thread_count
30 512 259 536874407 App Task STAT 4 683
0
31 256 83 536873719 App Task IDLE 0 8575
0
2 256 107 536872207 KeySwitch 0 2016
0
2 1024 251 536871951 ADC_Voltage 0 606
0
1 1024 275 536873231 printF 0 5995
0
iwdt_counter=1891
$530 200;ADC:0.427 V
tick : 427955
===============================================================
OS CPU Usage = 3.32% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
OS CPU OSIdleCtrRun = 804407
OS CPU OSIdleCtrMax = 8320
===============================================================
????????? ???????С ??????? ??????? ?????? ????? ??????д???
Prio StackSize CurStack MaxStack Taskname thread_state thread_count
30 512 259 536874407 App Task STAT 0 4764
0
31 256 83 536873719 App Task IDLE 0 57457
0
2 256 107 536872207 KeySwitch 0 14196
0
2 1024 251 536871951 ADC_Voltage 0 4278
0
1 1024 275 536873231 printF 0 41935
0
iwdt_counter=1869
MCU进入深度软件待机状态
MCU唤醒源为IRQ-10
iwdt_counter=1723
iwdt_counter=1950
S_key 1
$2864 200;ADC:2.308 V
iwdt_counter=1948

在串口调试助手中看见独立看门狗定时器唤醒信息,唤醒成功。所有信息包括系统tick 独立看门狗定时器都从复位状态开始平均100ms喂狗操作。
达到预期状态。