金牌会员
 
- 积分
- 2874
- 金钱
- 2874
- 注册时间
- 2020-4-30
- 在线时间
- 226 小时
|
50金钱
本帖最后由 chen12345678 于 2025-9-4 13:15 编辑
最近接手一个项目,用的freertos系统,遇到一个问题,在任务A中有个函数B,想要在函数B里做个延时,让电机运转一段时间然后关闭。具体是启动电机后打开定时器,定时一段时间进入中断,中断中关闭电机,这套在裸机中正常运行。把这段代码移植到freertos系统却发现运行不了,电机根本不动,分步仿真后打断点倒可以实现,不能理解。想请教下各位大神,有办法解决么,freertos系统新接触的,不熟- 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);
- }
- }
复制代码
|
最佳答案
查看完整内容[请看2#楼]
看起来不像"中断不能正常启动",像是一启动就中断,建议利用IO翻转,示波器测一下TIM2启动到进入中断的时间.
|