寫WEB程序的時候,發現若是加上步進電機控制的話,就會出現問題。緣由是若是把電機控制放在uip循環中處理的話,由於控制電機涉及到時間問題。因此必須解決,想到的方法就是多任務的思想。把步進電機的處理放在定時器中斷裏面。這樣的話就能避免問題了。順便學習了庫函數操做定時器。這裏用到的定時器功能簡單,只須要產生更新中斷。函數
下面是定時器初始化代碼學習
//定時器3初始化 //arr:定時重裝值 //psc:分頻值 void TIM3_Init(uint16_t arr, uint16_t psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //開啓TIM3時鐘 //定時器3配置,重載值、分頻值、分頻係數、計數模式 TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //容許定時更新中斷 //中斷配置 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3, ENABLE); //使能定時器3 }
定時器中斷處理函數ui
void TIM3_IRQHandler(void) { static uint8_t i; //相序計數器 if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); Motorcw(i); //電機正轉 i++; if(i==4) i = 0; } }
電機正傳代碼函數code
void Motorcw(uint8_t i) { GPIO_Write(GPIOC,phasecw[i]); }
這樣的話就不能干擾到uip的正常事件處理了。
事件