Browse Source

update:默认时钟全部使用内部OSC,并提供接口给用户选择

alienwalker 4 years ago
parent
commit
e394944a92

+ 22 - 0
application/src/luat_mcu_air105.c

@@ -61,3 +61,25 @@ void luat_mcu_delay_us(int delay)
 {
 	Task_DelayUS(delay);
 }
+
+void luat_mcu_set_clk_source(uint8_t source_main, uint8_t source_32k, uint32_t delay)
+{
+	switch(source_main)
+	{
+	case 0:
+		PM_Set12MSource(0, delay);
+		break;
+	case 1:
+		PM_Set12MSource(1, delay);
+		break;
+	}
+	switch(source_32k)
+	{
+	case 0:
+		PM_Set32KSource(0);
+		break;
+	case 1:
+		PM_Set32KSource(1);
+		break;
+	}
+}

+ 32 - 0
bsp/air105/hal/core_pm.c

@@ -88,3 +88,35 @@ int32_t PM_Sleep(void)
 	return ERROR_NONE;
 
 }
+
+void PM_Set12MSource(uint8_t XTAL, uint32_t DelayCnt)
+{
+	volatile uint32_t delay = DelayCnt;
+	if (XTAL == ((SYSCTRL->FREQ_SEL & BIT(12)) >> 12))
+	{
+		__disable_irq();
+		if (XTAL)
+		{
+			SYSCTRL->FREQ_SEL &= ~BIT(12);
+		}
+		else
+		{
+			SYSCTRL->FREQ_SEL |= BIT(12);
+		}
+		while(--delay) {;}
+		__enable_irq();
+	}
+}
+
+void PM_Set32KSource(uint8_t XTAL)
+{
+	if (XTAL == ((BPU->SEN_ANA0 & BIT(10)) >> 10)) return ;
+	if (XTAL)
+	{
+		BPU->SEN_ANA0 |= BIT(10);
+	}
+	else
+	{
+		BPU->SEN_ANA0 &= ~BIT(10);
+	}
+}

+ 2 - 0
bsp/air105/include/core_pm.h

@@ -45,4 +45,6 @@ void PM_Init(void);
 void PM_SetHardwareRunFlag(uint32_t PmHWSn, uint32_t OnOff);
 void PM_SetDriverRunFlag(uint32_t PmDrvSn, uint32_t OnOff);
 int32_t PM_Sleep(void);
+void PM_Set12MSource(uint8_t XTAL, uint32_t DelayCnt);
+void PM_Set32KSource(uint8_t XTAL);
 #endif

+ 12 - 11
bsp/air105/platform/app_main.c

@@ -58,11 +58,11 @@ void SystemInit(void)
 {
 	memcpy(__SRAM_BASE_ADDR__, (uint32_t)(&__isr_start_address), 1024);
 	SCB->VTOR = __SRAM_BASE_ADDR__;
-#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_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_POWERMODE_CLOSE_CPU_MEM;;
-#endif
+//#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_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_POWERMODE_CLOSE_CPU_MEM;;
+//#endif
 //	SCB->VTOR = (uint32_t)(&__isr_start_address);
 	SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_ALL;
 	SYSCTRL->SOFT_RST1 = SYSCTRL_APBPeriph_ALL;
@@ -71,12 +71,13 @@ void SystemInit(void)
     SYSCTRL->LOCK_R |= SYSCTRL_USB_RESET;
     SYSCTRL->LDO25_CR &= ~(BIT(4)|BIT(5));
 //    BPU->SEN_ANA0 &= ~(1 << 10);
-#ifdef __USE_32K_XTL__
-	BPU->SEN_ANA0 |= (1 << 10)|(7 << 25) | (2 << 29);	//外部32768+最大充电电流+最大晶振供电
-#else
-	BPU->SEN_ANA0 &= ~(1 << 10);
-	BPU->SEN_ANA0 |= (7 << 25) | (2 << 29);	//内部32K+最大充电电流+最大晶振供电
-#endif
+//#ifdef __USE_32K_XTL__
+//	BPU->SEN_ANA0 |= (1 << 10)|(7 << 25) | (2 << 29);	//外部32768+最大充电电流+最大晶振供电
+//#else
+//	BPU->SEN_ANA0 &= ~(1 << 10);
+//	BPU->SEN_ANA0 |= (7 << 25) | (2 << 29);	//内部32K+最大充电电流+最大晶振供电
+//#endif
+	BPU->SEN_ANA0 |= (7 << 25) | (2 << 29);//最大充电电流+中等晶振供电
 	__enable_irq();
 }
 

+ 5 - 4
bsp/air105/platform/bl_main.c

@@ -597,11 +597,12 @@ void SystemInit(void)
 #else
 	SCB->VTOR = (uint32_t)(&__isr_start_address);
 #endif
-#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;
-#else
+//#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;
+//#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;
+//#endif
 	SYSCTRL->FREQ_SEL = 0x20000000 | SYSCTRL_FREQ_SEL_HCLK_DIV_1_2 | (1 << 13) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC | SYSCTRL_FREQ_SEL_XTAL_192Mhz;
-#endif
 	WDT_SetTimeout(__WDT_TO_MS__);
 	WDT_ModeConfig(WDT_Mode_Interrupt);
 	WDT_Enable();