Browse Source

update:优化一下低功耗表现,非luatos编译时释放掉相关内存给用户用

alienwalker 4 years ago
parent
commit
6efcd21e5e
3 changed files with 33 additions and 8 deletions
  1. 26 6
      bsp/air105/hal/core_pm.c
  2. 4 0
      bsp/air105/include/FreeRTOSConfig.h
  3. 3 2
      bsp/air105/platform/app_main.c

+ 26 - 6
bsp/air105/hal/core_pm.c

@@ -7,6 +7,7 @@ typedef struct
 }PM_CtrlStruct;
 static PM_CtrlStruct prvPM;
 
+
 void PM_Init(void)
 {
 	GPIO->WAKE_TYPE_EN = (1 << 12) | (1 << 11);
@@ -16,7 +17,15 @@ void PM_Init(void)
 	GPIO->WAKE_P0_EN = 0;
 	GPIO->WAKE_P1_EN = 0;
 	GPIO->WAKE_P2_EN = 0;
-	SYSCTRL->ANA_CTRL |= 0x00f0;
+	SYSCTRL->MSR_CR1 |= BIT(27);
+	SYSCTRL->LDO25_CR |= BIT(4);
+	SYSCTRL->ANA_CTRL |= BIT(7)|BIT(4)|BIT(5);
+	SENSOR->SEN_EXTS_START = 0x55;
+	int i;
+	for(i = 0; i < 19; i++)
+	{
+		SENSOR->SEN_EN[i] = 0x80000055;
+	}
 }
 
 void PM_SetHardwareRunFlag(uint32_t PmHWSn, uint32_t OnOff)
@@ -48,20 +57,31 @@ void PM_Print(void)
 	DBG("%x,%x", prvPM.HWFlagBit, prvPM.DrvFlagBit);
 }
 
-int32_t __FUNC_IN_RAM__ PM_Sleep(void)
+int32_t PM_Sleep(void)
 {
 	uint64_t StartTick;
-	uint32_t Temp;
+	uint32_t Temp, Temp2, Temp3, Temp4;
 	if (prvPM.HWFlagBit || prvPM.DrvFlagBit) return -ERROR_DEVICE_BUSY;
 	__disable_irq();
+	Temp2 = ADC0->ADC_CR1;
+	Temp3 = DAC->DAC_CR1;
+	Temp4 = ADC0->ADC_CR2;
+	ADC0->ADC_CR1 |= BIT(8);
+	ADC0->ADC_CR1 &= ~BIT(6);
+	DAC->DAC_CR1 |= (1 << 4);
+	ADC_IntelResistance(0);
 	StartTick = RTC_GetUTC();
-	SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_KBD|SYSCTRL_APBPeriph_GPIO;
-	SYSCTRL->FREQ_SEL = (SYSCTRL->FREQ_SEL & ~(SYSCTRL_FREQ_SEL_POWERMODE_Mask)) | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU_MEM;
 	Temp = TRNG->RNG_ANA;
 	TRNG->RNG_ANA = Temp | TRNG_RNG_AMA_PD_ALL_Mask;
+//	SYSCTRL->PHER_CTRL |= BIT(20);
+//	SYSCTRL->LDO25_CR |= BIT(5);
 	__WFI();
+//	SYSCTRL->LDO25_CR &= ~BIT(5);
+//	SYSCTRL->PHER_CTRL &= ~BIT(20);
 	TRNG->RNG_ANA = Temp;
-	SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_ALL;
+	ADC0->ADC_CR1 = Temp2;
+	DAC->DAC_CR1 = Temp3;
+	ADC0->ADC_CR2 = Temp4;
 	WDT_Feed();
 	SysTickAddSleepTime((RTC_GetUTC() - StartTick) * CORE_TICK_1S);
 	Timer_WakeupRun();

+ 4 - 0
bsp/air105/include/FreeRTOSConfig.h

@@ -83,7 +83,11 @@
 #define configCPU_CLOCK_HZ                (SystemCoreClock)
 #define configTICK_RATE_HZ                ((TickType_t)100)
 #define configMINIMAL_STACK_SIZE          ((uint16_t)512)
+#ifdef __LUATOS__
 #define configTOTAL_HEAP_SIZE             ((size_t)(264 * 1024))
+#else
+#define configTOTAL_HEAP_SIZE             ((size_t)(64 * 1024))
+#endif
 #define configMAX_TASK_NAME_LEN           (16)
 #define configUSE_TRACE_FACILITY          0
 #define configUSE_16_BIT_TICKS            0

+ 3 - 2
bsp/air105/platform/app_main.c

@@ -57,9 +57,9 @@ static void prvSystemReserCtrl(void)
 void SystemInit(void)
 {
 #ifdef __USE_XTL__
-	SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_EXT | SYSCTRL_FREQ_SEL_XTAL_192Mhz;
+	SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_EXT | SYSCTRL_FREQ_SEL_XTAL_192Mhz | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU_MEM;
 #else
-	SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC | SYSCTRL_FREQ_SEL_XTAL_192Mhz;
+	SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC | SYSCTRL_FREQ_SEL_XTAL_192Mhz | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU_MEM;;
 #endif
 	SCB->VTOR = (uint32_t)(&__isr_start_address);
 	SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_ALL;
@@ -67,6 +67,7 @@ void SystemInit(void)
 	SYSCTRL->PHER_CTRL &= ~(1 << 20);
     SYSCTRL->SOFT_RST2 &= ~SYSCTRL_USB_RESET;
     SYSCTRL->LOCK_R |= SYSCTRL_USB_RESET;
+    SYSCTRL->LDO25_CR &= ~BIT(5);
 //    BPU->SEN_ANA0 &= ~(1 << 10);
 #ifdef __USE_32K_XTL__
 	BPU->SEN_ANA0 |= (1 << 10)|(7 << 25) | (2 << 29);	//外部32768+最大充电电流+最大晶振供电