瑞萨单片机论坛
直播中

lustao

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

【RA4E2开发板评测】电压检测器 ThreadX显示量程0-3300 mV+独立看门狗定时器

续前【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)。未标题-2 拷贝.jpg

独立看门狗定时器 IWDT属性配置

在下面配置中:

Name : g_wdt0

NMI callback : iwdt_callback
未标题-2 拷贝.jpg

然后点击 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 :配置的循环周期次数,此数值越大,超时时间越长。
未标题-2 拷贝.jpg

事件标志组

点击Stacks选项卡--在左侧 Threads,

在Threads下方有一个Object区域,点击`New Object--Event Flags
未标题-2 拷贝.jpg

属性 Name: EventGroup`

Symbol: EventGroup

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

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**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口```

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显示:

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

image.png

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

达到预期状态。

更多回帖

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