续前【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+CPU利用率+任务当前使用栈
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。
在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。
RA芯片有专门管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。
RA4E2开发板支持4种低功耗模式:睡眠模式(Sleep Mode)、软件待机模式(Software Standby Mode)、贪睡模式(Snooze Mode)、深度软件待机模式(Deep Software Standby mode).
深度软件待机模式类似于设备关机,CPU状态、SRAM存储的数据以及大部分外设寄存器的数据都会丢失,只有少量外设,如RTC和AGTn(n=0~3)可以运行。因此MCU无法保存上下文,只能以中断重置的状态唤醒。适合有需要时才采集数据的使用。
本次项目准备采用深度软件待机模式key按钮中断唤醒。
rasc部分
打开【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+CPU利用率+任务当前使用栈配置的RA Smart Configurator.
唤醒源key按钮配置
唤醒源key按钮**![按键]
在pins`标签 项中加入key按钮 p005 引脚配置

因为中断唤醒需要配置key按钮中断增加中断 配置
在Stacks 标签项中 点击Stacks->New Stack->Input-> External IRQ (r_icu)

中断 配置
- Name: g_external_irq10
Channel: 10
Trigger: Falling
Callback: NULL
Pin Interrupt Priority: Priority 2
IRQ10-DS: P005

产生冲突时在pins`标签 项中对于引脚60取消p005只保留IRQ10-DS

Deep Standby Options配置
在Stacks项中 点击Stacks->New Stack->Power -> Low
Power Mode (r_lpm)。

在下面配置中:![未标题-2 拷贝.jpg]
将General|Name: g_lpm0
Low Power Mode:Deep Software Standby mode ,在Deep Standby Options (Not available on every MCU中配置唤醒源)(Deep Standby Options (Not available on every MCU)|Cancel Sources|IRQ10 ☑自动生成Deep Software Standby mode 配置g_lpm0.p_ctrl = &g_lpm0_ctrl和g_lpm0.p_cfg = &g_lpm0_cfg)
(
完成后点击生成代码即可

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

在lu\src会多出几个*Task_entry.c文件,这些文件是留给我们写线程具体功能的。
**‘在hal_entry.c不需要加入任何代码,所有与os有关代码由[瑞萨]在生成项目时完成了.’
相关Deep Software Standby mode 代码都放在printf_Task_Task.c 中:
volatile _Bool key_flag = false;
void key_irq_callback(external_irq_callback_args_t *p_args)
{
FSP_PARAMETER_NOT_USED(p_args);
key_flag = true;
}
IRQ_Init ();
R_BSP_PinAccessEnable ();
if (1U == R_SYSTEM->RSTSR0_b.DPSRSTF)
{
R_LPM_IoKeepClear (NULL);
R_SYSTEM->RSTSR0_b.DPSRSTF = 0;
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");
}
}
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");
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;
}
在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;
}
/*
*******************************************************************************************************
* ±äÁ¿
*******************************************************************************************************
*/
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;
while (OSStatRdy == 0)
{
tx_thread_sleep(200); /* µÈ´ýͳ¼ÆÈÎÎñ¾ÍÐ÷ */
}
OSIdleCtrMax /= 100uL;
if (OSIdleCtrMax == 0uL)
{
OSCPUUsage = 0u;
}
//__disable_irq();
OSIdleCtr = OSIdleCtrMax * 100uL; /* ÉèÖóõʼCPUÀûÓÃÂÊ 0% */
//__enable_irq();
for (;;)
{
// __disable_irq();
OSIdleCtrRun = OSIdleCtr; /* »ñµÃ100msÄÚ¿ÕÏмÆÊý */
OSIdleCtr = 0uL; /* ¸´Î»¿ÕÏмÆÊý */
// __enable_irq(); /* ¼ÆËã100msÄÚµÄCPUÀûÓÃÂÊ */
OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
tx_thread_sleep(100); /* ÿ100msͳ¼ÆÒ»´Î */
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: 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;
}
}
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: 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);
//}
**‘在hal_entry.c不需要加入任何代码,所有与os有关代码由[瑞萨]在生成项目时完成了.’**这次编译没有出错:
compiling r_lpm.c...
linking...
Program Size: Code=18804 RO-data=1228 RW-data=2320 ZI-data=12184
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), 486 Warning(s).
Build Time Elapsed: 00:01:29
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口```
‘在hal_entry.c不需要加入任何代码,所有与os有关代码由[瑞萨]在生成项目时完成了.’
这次编译没有出错:
compiling vector_data.c...
linking...
Program Size: Code=11836 RO-data=560 RW-data=2320 ZI-data=10944
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] Output file "E:\\lst\\ra4l1\\ra4-e2-64\\FSP_Project\\Objects\\FSP_Project.sbd" does not exist. Proceeding with RASC invocation...
Generating Smart Bundle..
".\\Objects\\FSP_Project.axf" - 0 Error(s), 474 Warning(s).
Build Time Elapsed: 00:00:53
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显示:
$456 200;ADC:0.367 V
S_key 1
tick : 120097
===============================================================
OS CPU Usage = 0.18% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
OS CPU OSIdleCtrRun = 830471
OS CPU OSIdleCtrMax = 8320
===============================================================
任务优先级 任务栈大小 当前使用栈 最大栈使用 任务名 线程状态 线程运行次数
Prio StackSize CurStack MaxStack Taskname thread_state thread_count
30 512 243 536874407 App Task STA
T 4 1200
0
31 256 83 536873719 App Task IDLE 0 17020
0
2 256 107 536872207 KeySwitch 0 4001
0
2 1024 251 536871951 ADC_Voltage 4 1201
0
1 1024 275 536873231
printF 0 11984
0
tick : 180104
===============================================================
OS CPU Usage = 0.18% OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
OS CPU OSIdleCtrRun = 830535
OS CPU OSIdleCtrMax = 8320
===============================================================
任务优先级 任务栈大小 当前使用栈 最大栈使用 任务名 线程状态 线程运行次数
Prio StackSize CurStack MaxStack Taskname thread_state thread_count
30 512 243 536874407 App Task STA
T 0 1799
0
31 256 83 536873719 App Task IDLE 0 23010
0
2 256 107 536872207 KeySwitch 0 5998
0
2 1024 251 536871951 ADC_Voltage 0 1800
0
1 1024 275 536873231
printF 0 17974
0
MCU进入深度软件待机状态
MCU唤醒源为IRQ-10
S_key 1
$2822 200;ADC:2.274 V
$3274 200;ADC:2.638 V
$3261 200;ADC:2.628 V
$3222 200;ADC:2.596 V

在串口调试助手中看见唤醒信息,说明唤醒成功。所有信息包括系统tick都从复位状态开始。
与FreeRTOS相同线程相比,编程更简便,ro rw rom Size都更小。
达到预期状态。