瑞萨单片机论坛
直播中

lustao

13年用户 626经验值
擅长:嵌入式技术
私信 关注

【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+深度软件待机模式

续前【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按钮**![按键]未标题-1 拷贝.jpg

在pins`标签 项中加入key按钮 p005 引脚配置

未标题-2 拷贝.jpg

因为中断唤醒需要配置key按钮中断增加中断 配置

在Stacks 标签项中 点击Stacks->New Stack->Input-> External IRQ (r_icu)
未标题-2 拷贝.jpg
中断 配置

  • Name: g_external_irq10
    Channel: 10
    Trigger: Falling
    Callback: NULL
    Pin Interrupt Priority: Priority 2
    IRQ10-DS: P005

未标题-2 拷贝.jpg

产生冲突时在pins`标签 项中对于引脚60取消p005只保留IRQ10-DS
未标题-2 拷贝.jpg

Deep Standby Options配置

在Stacks项中 点击Stacks->New Stack->Power -> Low

Power Mode (r_lpm)。未标题-2 拷贝.jpg

未标题-2 拷贝.jpg

在下面配置中:![未标题-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)
(image.png

完成后点击生成代码即可
未标题-1 拷贝.jpg

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; //ÉèÖñê־λ

/*°´¼ü1Öжϻص÷£¬ÓÃÓÚ½øÈëÉî¶È˯Ãß»ò»½ÐÑ*/
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 (); //ÆôÓöÔ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");
        }
    }							



			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;
			}

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**MODE配置成sci boot模式* 连接带自己USB-com接口tx,rx到usb未标题-1 拷贝.jpg* tmp_fa46ecf6b5972cfa1e0632d2e2c6dc13.jpg*找到编译后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**MODE配置成sci boot模式
  • 连接带自己USB-com接口tx,rx到usb未标题-1 拷贝.jpg
  • tmp_fa46ecf6b5972cfa1e0632d2e2c6dc13.jpg

*找到编译后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

未标题-2 拷贝.jpg

命令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
  • 未标题-2 拷贝.jpg

*烧录数据正确,成功

MODE CONFIG* *MODE

配置成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

image.png
在串口调试助手中看见唤醒信息,说明唤醒成功。所有信息包括系统tick都从复位状态开始。

与FreeRTOS相同线程相比,编程更简便,ro rw rom Size都更小。

达到预期状态。

更多回帖

发帖
×
20
完善资料,
赚取积分