int main(void) { void *tmp; #if ZOTTAOS_TIMER == EVENT_TIMER_INDEX #error Event timer device must be different from the internal timer used by ZottaOS #endif // Enable debug module clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_DBGMCU,ENABLE); /* Stop ZottaOS internal timer during debugger connection */ #if ZOTTAOS_TIMER == OS_IO_TIM17 DBGMCU_APB2PeriphConfig(DBGMCU_TIM17_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM16 DBGMCU_APB2PeriphConfig(DBGMCU_TIM16_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM15 DBGMCU_APB2PeriphConfig(DBGMCU_TIM15_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM14 DBGMCU_APB1PeriphConfig(DBGMCU_TIM14_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM3 DBGMCU_APB1PeriphConfig(DBGMCU_TIM3_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM2 DBGMCU_APB1PeriphConfig(DBGMCU_TIM2_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM1 DBGMCU_APB2PeriphConfig(DBGMCU_TIM1_STOP,ENABLE); #endif /* Initialize Hardware */ SystemInit(); InitializeFlags(FLAG1_PIN | FLAG2_PIN); OSInitTimerEvent(2,47,0,EVENT_TIMER_INDEX); #if defined(ZOTTAOS_VERSION_HARD) tmp = OSCreateEventDescriptor(); OSCreateSynchronousTask(ClearLed1Task,1000,tmp,NULL); OSCreateTask(SetLed1Task,0,5000,5000,tmp); tmp = OSCreateEventDescriptor(); OSCreateSynchronousTask(ClearLed2Task,1000,tmp,NULL); OSCreateTask(SetLed2Task,0,10000,10000,tmp); #elif defined(ZOTTAOS_VERSION_SOFT) tmp = OSCreateEventDescriptor(); OSCreateSynchronousTask(ClearLed1Task,0,1000,0,tmp,NULL); OSCreateTask(SetLed1Task,0,0,5000,5000,1,1,0,tmp); tmp = OSCreateEventDescriptor(); OSCreateSynchronousTask(ClearLed2Task,0,1000,0,tmp,NULL); OSCreateTask(SetLed2Task,0,0,10000,10000,1,1,0,tmp); #endif /* Start the OS so that it starts scheduling the user tasks */ return OSStartMultitasking(NULL,NULL); } /* end of main */
int main(void) { #if ZOTTAOS_TIMER == OS_IO_TIM14 DBGMCU_APB1PeriphConfig(DBGMCU_TIM14_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM13 DBGMCU_APB1PeriphConfig(DBGMCU_TIM13_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM12 DBGMCU_APB1PeriphConfig(DBGMCU_TIM12_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM11 DBGMCU_APB2PeriphConfig(DBGMCU_TIM11_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM10 DBGMCU_APB2PeriphConfig(DBGMCU_TIM10_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM9 DBGMCU_APB2PeriphConfig(DBGMCU_TIM9_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM8 DBGMCU_APB2PeriphConfig(DBGMCU_TIM8_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM5 DBGMCU_APB1PeriphConfig(DBGMCU_TIM5_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM4 DBGMCU_APB1PeriphConfig(DBGMCU_TIM4_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM3 DBGMCU_APB1PeriphConfig(DBGMCU_TIM3_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM2 DBGMCU_APB1PeriphConfig(DBGMCU_TIM2_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM1 DBGMCU_APB2PeriphConfig(DBGMCU_TIM1_STOP,ENABLE); #endif /* Keep debugger connection during sleep mode */ DBGMCU_Config(DBGMCU_SLEEP,ENABLE); /* Initialize Hardware */ SystemInit(); /* Initialize ZottaOS I/O UART drivers */ OSInitUART(UART_TRANSMIT_FIFO_NB_NODE,UART_TRANSMIT_FIFO_NODE_SIZE, UARTUserReceiveInterruptHandler,UART_VECTOR); /* Initialize USART2 hardware */ InitializeUART2Hardware(); /* Start the OS so that it runs the idle task, which puts the processor to sleep when ** there are no interrupts. */ return OSStartMultitasking(NULL,NULL); } /* end of main */
void timers_init(void) { #ifdef TESTING RCC_APB2PeriphClockCmd(RCC_APB2Periph_DBGMCU, ENABLE); DBGMCU_APB1PeriphConfig(DBGMCU_APB1_FZ_DBG_TIM2_STOP, ENABLE); //frclock DBGMCU_APB1PeriphConfig(DBGMCU_APB1_FZ_DBG_TIM3_STOP, ENABLE); //txworker DBGMCU_APB2PeriphConfig(DBGMCU_APB2_FZ_DBG_TIM16_STOP, ENABLE); //pmsg #endif // TESTING frclock_init(); //do these really need to be accessible outside timers.c ? txwork_timer_init(); pmsg_timer_init(); return; }
int main(void) { TaskParametersDef *TaskParameters; // Enable debug module clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_DBGMCU, ENABLE); /* Stop timer during debugger connection */ #if ZOTTAOS_TIMER == OS_IO_TIM17 DBGMCU_APB2PeriphConfig(DBGMCU_TIM17_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM16 DBGMCU_APB2PeriphConfig(DBGMCU_TIM16_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM15 DBGMCU_APB2PeriphConfig(DBGMCU_TIM15_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM14 DBGMCU_APB1PeriphConfig(DBGMCU_TIM14_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM3 DBGMCU_APB1PeriphConfig(DBGMCU_TIM3_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM2 DBGMCU_APB1PeriphConfig(DBGMCU_TIM2_STOP,ENABLE); #elif ZOTTAOS_TIMER == OS_IO_TIM1 DBGMCU_APB2PeriphConfig(DBGMCU_TIM1_STOP,ENABLE); #endif /* Initialize Hardware */ SystemInit(); InitializeFlags(FLAG1_PIN | FLAG2_PIN | FLAG3_PIN); /* Create the 3 tasks. Notice that each particular task receives a private set of para- ** meters that it inherits from the main program and that it is the only task that can ** later access. */ #if defined(ZOTTAOS_VERSION_HARD) /* Calculation of the total load: ** 1250 / 5000 -> 25% ** 2500 / 10000 -> 25% ** 12000 / 30000 -> 40% ** Total: 90% */ TaskParameters = (TaskParametersDef *)OSMalloc(sizeof(TaskParametersDef)); TaskParameters->GPIOx = FLAG_PORT; TaskParameters->GPIO_Pin = FLAG1_PIN; TaskParameters->Delay = 350; OSCreateTask(FixedDelayTask,0,500,500,TaskParameters); TaskParameters = (TaskParametersDef *)OSMalloc(sizeof(TaskParametersDef)); TaskParameters->GPIOx = FLAG_PORT; TaskParameters->GPIO_Pin = FLAG2_PIN; TaskParameters->Delay = 700; OSCreateTask(FixedDelayTask,0,1000,1000,TaskParameters); TaskParameters = (TaskParametersDef *)OSMalloc(sizeof(TaskParametersDef)); TaskParameters->GPIOx = FLAG_PORT; TaskParameters->GPIO_Pin = FLAG3_PIN; TaskParameters->Delay = 3000; OSCreateTask(VariableDelayTask,0,3000,3000,TaskParameters); #elif defined(ZOTTAOS_VERSION_SOFT) /* Calculation of the total load: ** Without ZottaOS-Soft capabilities: ** 1250 / 5000 -> 25% ** 2500 / 10000 -> 25% ** 24000 / 30000 -> 80% ** Total: 130% (Task set is NOT schedulable) ** With ZottaOS-Soft capabilities: ** 1250 / 5000 / 3 -> 8% ** 2500 / 10000 / 3 -> 8% ** 24000 / 30000 / 1 -> 80% ** Total: 96% (Task set is schedulable) */ TaskParameters = (TaskParametersDef *)OSMalloc(sizeof(TaskParametersDef)); TaskParameters->GPIOx = FLAG_PORT; TaskParameters->GPIO_Pin = FLAG1_PIN; TaskParameters->Delay = 300; OSCreateTask(FixedDelayTask,125,0,500,500,1,2,0,TaskParameters); TaskParameters = (TaskParametersDef *)OSMalloc(sizeof(TaskParametersDef)); TaskParameters->GPIOx = FLAG_PORT; TaskParameters->GPIO_Pin = FLAG2_PIN; TaskParameters->Delay = 600; OSCreateTask(FixedDelayTask,250,0,1000,1000,1,3,0,TaskParameters); TaskParameters = (TaskParametersDef *)OSMalloc(sizeof(TaskParametersDef)); TaskParameters->GPIOx = FLAG_PORT; TaskParameters->GPIO_Pin = FLAG3_PIN; TaskParameters->Delay = 5000; OSCreateTask(VariableDelayTask,2400,0,3000,3000,1,1,0,TaskParameters); #endif /* Start the OS so that it starts scheduling the user tasks */ return OSStartMultitasking(NULL,NULL); } /* end of main */
void pwm_init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; DBGMCU_APB2PeriphConfig( DBGMCU_TIM8_STOP, ENABLE);//核心停止后终止PWM RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);////APB2 max frquency is 84M GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; /*TIM8 CH1*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8); /*TIM8 CH2*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8); /*TIM8 CH3*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM8); /*TIM8 CH4*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM8); // pwm_period = SystemCoreClock / IGBT_FREQ - 1;//计算设置开关频率计数周期 TIM_TimeBaseStructInit( &TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = pwm_period; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //设置PWM输出 TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; // TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; // TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; TIM_OC1Init(TIM8, &TIM_OCInitStructure); TIM_OC2Init(TIM8, &TIM_OCInitStructure); TIM_OC3Init(TIM8, &TIM_OCInitStructure); TIM_OC4Init(TIM8, &TIM_OCInitStructure); // TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; // TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; // TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; // TIM_BDTRInitStructure.TIM_DeadTime = 5; // TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; // TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; // TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable; // TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_ClearITPendingBit(TIM8, TIM_IT_Update); TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);//interrupt // TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_OC1);//可作为触发源,触发ADC等外设 TIM_CtrlPWMOutputs(TIM8, ENABLE);//pwm enable // TIM_Cmd(TIM8, ENABLE); //tim8 enable }