/**************************************************************************//**
 * @item     CosyOS-III 例程（系统构建）
 * @file     demo_main.c
 * @brief    例程-主函数 for Cortex-M
 * @author   迟凯峰
 * @version  V1.0.4
 * @date     2026.06.22
 ******************************************************************************/

#if 0 /* 编译开关 */

#include "CosyOS.H" // 用户的各个c文件中应包含此文件
#include <stdio.h> // for printf

int main(void)
{
    /* 主栈检查初始化 */// 在main函数的入口处
    #if (SYSCFG_DEBUGGING == 1)
    #if defined ( __ICCARM__ ) // IAR EWARM
    uMainStack_CheckInit();
    #else // AC5/AC6/GCC
    uMainStack_CheckInit(0x1000); // 传参主栈大小，务必与定义值相同。
    #endif
    #endif
    
    /* USER INIT CODE BEGIN */
    // firmware library standard peripheric Driver
    #if   defined (USE_STDPERIPH_DRIVER)
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    USART1_UART_Init(115200);
    USART1_DMA_Init();
    
    // STM32CubeMX generate code use HAL Driver
    #elif defined (USE_HAL_DRIVER)
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_DMA_Init();
    #endif
    /* USER INIT CODE END */
    
    /* USER INIT SysTick替代定时器 */// 当系统中断配置为 TIMn_IRQHandler + XXXx_IRQHandler
    #if (MCUCFG_SYSINT == 0)
    if(1){
        static void TIM14_Init(void);
        TIM14_Init();
    }// SysTick替代定时器 选定为 TIM14。
    #endif
    
    /* USER DEBUG CONFIG */// for CosyOS-Taskmgr
    #if (SYSCFG_DEBUGGING == 1)
    if(1){
        void Debug_Config(void);
        Debug_Config();
    }// defined in demo_debug_fwl.c and demo_debug_hal.c
    #endif
    
    /* USER 启动 CosyOS */// 在main函数的末尾处
    if(1){
        #if 1 // 建议前期调试时开启，如果CosyOS启动失败会返回错误码提示用户！
        unsigned char _ecode = uStartCosyOS();
        printf("CosyOS startup failed, error code: %d.\r\n", (int)_ecode);
        #else
        uStartCosyOS();
        #endif
    }
    while(1);
}


/**
  * \brief  SysTick替代定时器初始化
  * \note   在 mcucfg_cmx.h 中，系统中断配置为 TIMn_IRQHandler + XXXx_IRQHandler。
  * \note   在 mcucfg_cm0.h 中，SysTick替代中断 配置为 TIM14_IRQHandler，<br>
            也就是说，SysTick替代定时器 选定为 TIM14。
  * \note   用户可在main函数中调用 TIM14_Init 来初始化 TIM14。
  */
#if (MCUCFG_SYSINT == 0)
static void TIM14_Init(void)
{
    RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;   // 定时器时钟使能
    TIM14->PSC = 48 / 1 * 1 - 1;           // 预分频
    TIM14->ARR = SYSCFG_SYSTICK_CYCLE - 1; // 重装载值
    TIM14->CR1 = (1 << 0) | (1 << 2);      // 使能计数器 | 只有上溢/下溢会生成更新中断 | 计数方向任意
    TIM14->DIER = 1;                       // 使能更新中断
}
#endif


#endif
