本帖最后由 jian0052 于 2025-9-4 13:13 编辑
最近接手一个项目,用的freertos系统,遇到一个问题,在任务A中有个函数B,想要在函数B里做个延时,让电机运转一段时间然后关闭。具体是启动电机后打开定时器,定时一段时间进入中断,中断中关闭电机,这套在裸机中正常运行。把这段代码移植到freertos系统却发现运行不了,电机根本不动,分步仿真后打断点倒可以实现,不能理解。想请教下各位大神,有办法解决么,freertos系统新接触的,不熟
[C] 纯文本查看 复制代码 void TIM2_Int_init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM2,DISABLE);
TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
}
void TIM2_IRQHandler(void) //TIM2中断
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_Cmd(TIM2,DISABLE);//关闭定时器2
TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
if(ballflag==1)
{
TIM_SetCompare1(TIM5, 0);
ballflag=0;
}
}
}
void my_delay_ms(u16 ms)
{
TIM2_Int_init(7199,(ms*10)-1);
TIM_Cmd(TIM2,ENABLE);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}
static void vTaskRobCtl(void *pvParameters)
{
while(1)
{
updatePress_1();
updatePress_2();
updatePress_3();
bldcMotorLoop() ;
beep_loop();
keyScan();
power_task_hand();
SwitchLoop();
alarm_loop();
vTaskDelay(10);//10ms
}
}
void bldcMotorLoop(void)
{
if(BallStartFlag==1)//启动
{
TIM_SetCompare1(TIM5, 1650);
ballflag=1;
my_delay_ms(100);
}
}
|