/* * Copyright (c) 2022 OpenLuat & AirM2M * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "app_inc.h" uint32_t SystemCoreClock; uint8_t gMainWDTEnable; static HANDLE prvWDTTimer; extern const uint32_t __isr_start_address; extern const uint32_t __os_heap_start; extern const uint32_t __ram_end; const uint32_t __attribute__((section (".app_info"))) g_CAppInfo[256] = { __APP_START_MAGIC__, sizeof(g_CAppInfo), 0,//此处后期放入luatos固件版本 0, }; //enum //{ // USER_EVENT_TEST_START = USER_EVENT_ID_START+1, // USER_EVENT_SPI_DONE, // USER_EVENT_I2C_DONE, // USER_EVENT_HWTIMER_DONE, //}; static void prvSystemReserCtrl(void) { #ifdef __DEBUG__ WDT_Feed(); #endif } 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; #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 SCB->VTOR = (uint32_t)(&__isr_start_address); SYSCTRL->CG_CTRL1 = SYSCTRL_APBPeriph_ALL; SYSCTRL->SOFT_RST1 = SYSCTRL_APBPeriph_ALL; SYSCTRL->PHER_CTRL &= ~(1 << 20); SYSCTRL->SOFT_RST2 &= ~SYSCTRL_USB_RESET; SYSCTRL->LOCK_R |= SYSCTRL_USB_RESET; __enable_irq(); } void SystemReset(void) { NVIC_SystemReset(); } void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */ { SystemCoreClock = HSE_VALUE * (((SYSCTRL->FREQ_SEL & SYSCTRL_FREQ_SEL_XTAL_Mask) >> SYSCTRL_FREQ_SEL_XTAL_Pos) + 1); } void vApplicationStackOverflowHook(TaskHandle_t xTask, char * pcTaskName ) { DBG("%s stack overflow", pcTaskName); } void vApplicationTickHook( void ) { //PowerOnTickCnt++; } static int32_t prvMainWDT(void *pData, void *pParam) { WDT_Feed(); } void vApplicationIdleHook( void ) { if (gMainWDTEnable) { WDT_Feed(); Timer_StartMS(prvWDTTimer, 12000, 1); } if (Core_GetSleepFlag()) { SYSCTRL->FREQ_SEL = (SYSCTRL->FREQ_SEL & ~(SYSCTRL_FREQ_SEL_POWERMODE_Mask)) | SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU; while (!(SYSCTRL->FREQ_SEL & (~SYSCTRL_FREQ_SEL_POWERMODE_CLOSE_CPU))); __disable_irq(); __WFI(); __enable_irq(); if (gMainWDTEnable) { WDT_Feed(); } Timer_Stop(prvWDTTimer); } } static void prvMain_InitHeap(void) { uint32_t prvHeapLen; prvHeapLen = (uint32_t)(&__ram_end) - (uint32_t)(&__os_heap_start); bpool((uint32_t)(&__os_heap_start), prvHeapLen); } int main(void) { cm_backtrace_init_ex("air105", "1.0", "v0001", prvSystemReserCtrl); __NVIC_SetPriorityGrouping(7 - __NVIC_PRIO_BITS);//对于freeRTOS必须这样配置 SystemCoreClockUpdate(); CoreTick_Init(); prvMain_InitHeap(); DMA_GlobalInit(); Uart_GlobalInit(); DMA_TakeStream(DMA1_STREAM_1);//for qspi DBG_Init(1); ADC_GlobalInit(); Timer_Init(); I2C_GlobalInit(); RTC_GlobalInit(); USB_GlobalInit(); RNG_Init(); gMainWDTEnable = 1; prvWDTTimer = Timer_Create(prvMainWDT, NULL, NULL); Core_ServiceInit(); #ifdef __DEBUG__ DBG("APP Build debug %s %s!", __DATE__, __TIME__); #else DBG("APP Build release %s %s!", __DATE__, __TIME__); #endif /* 启动调度,开始执行任务 */ vTaskStartScheduler(); /* 如果系统正常启动是不会运行到这里的,运行到这里极有可能是空闲任务heap空间不足造成创建失败 */ while (1) { } }