硬汉嵌入式论坛

 找回密码
 立即注册
查看: 477|回复: 8
收起左侧

[技术讨论] 请教freertos系统中函数里的延时问题

[复制链接]

5

主题

11

回帖

26

积分

新手上路

积分
26
发表于 2025-9-4 11:03:26 | 显示全部楼层 |阅读模式
本帖最后由 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);		
	}
}

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-4 11:33:38 | 显示全部楼层
方便的话,分享下相关代码实现看下。
回复

使用道具 举报

5

主题

11

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2025-9-4 13:30:23 | 显示全部楼层
eric2013 发表于 2025-9-4 11:33
方便的话,分享下相关代码实现看下。

代码已加,请审核通过
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-5 09:49:14 | 显示全部楼层
这个任务里面是启动电机执行任务吗
static void  vTaskRobCtl(void *pvParameters)

是的话,调试加个断点,看看这个任务得到执行没
回复

使用道具 举报

5

主题

11

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2025-9-5 11:19:32 | 显示全部楼层
eric2013 发表于 2025-9-5 09:49
这个任务里面是启动电机执行任务吗
static void  vTaskRobCtl(void *pvParameters)

执行了,bldcMotorLoop() ;这个函数也执行了,仿真时打断点,功能是正常的,就是全速运行的时候,电机会极短时间启动下,然后停掉,再无反应
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2025-9-5 11:50:44 | 显示全部楼层
jian0052 发表于 2025-9-5 11:19
执行了,bldcMotorLoop() ;这个函数也执行了,仿真时打断点,功能是正常的,就是全速运行的时候,电机会 ...

看看是为什么停掉的,程序运行到哪里的时候停下的,是不是PWM停了。
rtos不涉及多任务的时候,只关注一个任务,其实和裸机没什么区别
回复

使用道具 举报

5

主题

11

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2025-9-5 16:43:54 | 显示全部楼层
二十四书生 发表于 2025-9-5 11:50
看看是为什么停掉的,程序运行到哪里的时候停下的,是不是PWM停了。
rtos不涉及多任务的时候,只关注一 ...

打上断点,执行时就是正常的
1.png
到此断点,正常启动
2.png
到此断点,正常关闭
但去掉断点后,就不正常了
回复

使用道具 举报

25

主题

234

回帖

309

积分

高级会员

积分
309
QQ
发表于 2025-9-9 09:29:27 | 显示全部楼层
void  bldcMotorLoop(void)
{   
    if(BallStartFlag==1)//启动
    {
        TIM_SetCompare1(TIM5, 1650);
        ballflag=1;
        my_delay_ms(100);      
    }
}

这个函数中 BallStartFlag 标志在哪里清掉的呢? 如果每10ms调用一次 bldcMotorLoop ,似乎会无法触发TIM2中断
回复

使用道具 举报

5

主题

11

回帖

26

积分

新手上路

积分
26
 楼主| 发表于 2025-9-10 08:47:17 | 显示全部楼层
yono 发表于 2025-9-9 09:29
void  bldcMotorLoop(void)
{   
    if(BallStartFlag==1)//启动

你说的对,我也找到问题了,每次还没触发中断,定时器就又初始化了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 08:40 , Processed in 0.047354 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表