Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
rt-thread死机
定时器线程
使用定时器会不定时死机
发布于 2024-01-22 12:01:36 浏览:230
订阅该版
主板主控stm32F429,主要加热和电机控制功能,加热使用定时器14生成PWM,电机使用定时器3,系统使用RTT1.2.2版本的系统。上位机使用的昆仑通态串口屏,总是会不定期死机,最多运行3-4天,少的运行10个小时就会死机。加热功能代码 ```c static void heat_timeout(void* parameter) { // rt_kprintf("heat beat!\n"); PWM_Control_Heat(); } u8 initHeatTimer(u16 ms) { heatProcessSeconds=0; rt_timer_init(&heatbeat, "heat timer", heat_timeout, /* bind timeout callback function */ RT_NULL, (1000 * ms) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1, RT_TIMER_FLAG_PERIODIC); return TRUE; } void PWM_Control_Heat(void) { PWM=PID_realize(); TIM_SetCompare1(TIM14,PWM); } void heat_test(float temp,u8 flag) { setKP(502);//设置Kp setKI(7.4);//设置比例积分 setKD(19);//设置比例积分 PID_Init(); setSETTEMP1(temp); if(heatctrl_flag == 0) { rt_kprintf("目标TEMP=%f\r\n",temp); initHeatTimer(1*1000);//初始化加热时间 rt_timer_start(&heatbeat);//定时器开始加热 heatctrl_flag = 1;heatctrl_flag_fff = 0; } return ; } void heat_run_stop(void) { if(heatctrl_flag_fff == 0){ if(rt_timer_stop(&heatbeat) == RT_EOK) { TIM_SetCompare1(TIM14,0); heatctrl_flag = 0; heatctrl_flag_fff = 1; } return ; } } void TIM14_PWM_Init(u32 arr,u32 psc)// TIM14_PWM_Init(10000-1,9000-1);180M { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //使能TIM14时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //使能io口时钟 GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //设置F9为TIM14的复用 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //led0和led1对应的io口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //高速模式 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOF,&GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; //初始化定时器14 TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //pwm调制模式1 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性低 TIM_OC1Init(TIM14,&TIM_OCInitStructure); TIM_SetCompare1(TIM14,PWM); TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM14,ENABLE); TIM_Cmd(TIM14,ENABLE); } 电机参数 void pumpTurn_stop(void) { union scy_float_t scy_floattemp; rt_timer_stop(&motorRaceTime); drvPulseExecute(DISABLE);//停止 motorctrl_flag = 0; } static void motorrace_timeout(void* parameter)//电机走步超时 { if(flow_t.flag ) rt_event_send(&raceEvent, EVENT_FLAG6); else rt_event_send(&raceEvent,EVENT_FLAG1); } #if 1 u8 initmotorRaceTimer(u16 ms)//电机运动事件 { rt_timer_init(&motorRaceTime, "motor race timer", motorrace_timeout, /* bind timeout callback function 绑定超时回调函数*/ RT_NULL, (1000 * ms) / (1000 * 1000 / RT_TICK_PER_SECOND) + 1, RT_TIMER_FLAG_ONE_SHOT); /* one shot */ // rt_kprintf("电机走步数race: %d ms\n",ms); return TRUE; } void pumpTurn(struct FLOWPROCESS_T floww_t )//泵转 { union scy_float_t scy_floattemp; rt_uint32_t e; float speed=flow_t.speed;//转速 u32 mseconds=flow_t.racetime;//时间 if(speed >0){ if(flow_t.dir==CW) {PUMPDRAIN; usSRegHoldBuf[ADDR_SingTASK_flag] = 1;usSRegHoldBuf[ADDR_pump_flag] = 1; } //抽 else {PUMPPUSH; usSRegHoldBuf[ADDR_SingTASK_flag] = 2; usSRegHoldBuf[ADDR_pump_flag] = 2;} //推 setMotorFrq(speed); //设置转速 if(motorctrl_flag == 0){ rt_kprintf("pump 未在运行\n"); drvPulseExecute(ENABLE);//开 initmotorRaceTimer(mseconds); rt_timer_start(&motorRaceTime); motorctrl_flag =1; } while(1) { /* 接收事件,事件触发,接收完后清除事件标志 */ if (rt_event_recv(&raceEvent, (EVENT_FLAG1),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { pumpTurn_stop(); motor_move_result_flag = MOTOR_TIMEOUT;//电机运行超时; if(debuggg >=3){ rt_kprintf("pump overtime stop:racetime=%d,speed=%f,dir=%d\n", mseconds,speed*100,flow_t.dir);} break; } if (rt_event_recv(&raceEvent, (EVENT_FLAG6),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { pumpTurn_stop(); if(debuggg >=3){ rt_kprintf("MOTOR_TIMEOK stop:racetime=%d,speed=%f,dir=%d\n", mseconds,speed*100,flow_t.dir);} motor_move_result_flag = MOTOR_TIMEOK;//电机运行时间到 break; } //check liquid level3 检查液位开关 高 if (rt_event_recv(&tripEvent, (EVENT_FLAG2),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { getMTLIOLowState(); if(flow_t.htierchk)//设置需要检测高水位 { if(mt.top==LEVELUP) { pumpTurn_stop(); motor_move_result_flag = MOTOR_TOPOK ;//高停止 if(debuggg >=3){ rt_kprintf("pump top stop:racetime=%d,speed=%f,dir=CW\n", mseconds,speed*100);} break; } } } if (rt_event_recv(&tripEvent, (EVENT_FLAG3),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { getMTLIOLowState(); if(flow_t.htierchk)//设置需要检测高水位 { if(mt.top==LEVELDN) { pumpTurn_stop(); motor_move_result_flag = MOTOR_TOPOK ;//高停止 if(debuggg >=3){ rt_kprintf("pump top stop:racetime=%d,speed=%f,dir=CCW\n", mseconds,speed*100);} break; } } } //check liquid level2 中 if (rt_event_recv(&tripEvent, (EVENT_FLAG4),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { getMTLIOLowState(); if(flow_t.mtierchk) { if(mt.mid==LEVELUP) { pumpTurn_stop(); motor_move_result_flag = MOTOR_MIDOK ;//中停止 if(debuggg >=3){ rt_kprintf("pump mid stop:racetime=%d,speed=%f,dir=CW\n", mseconds,speed*100);} break; } } } if (rt_event_recv(&tripEvent, (EVENT_FLAG7),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { getMTLIOLowState(); if(flow_t.mtierchk) { if(mt.mid==LEVELDN) { pumpTurn_stop(); motor_move_result_flag = MOTOR_MIDOK ;//中停止 if(debuggg >=3){ rt_kprintf("pump mid stop:racetime=%d,speed=%f,dir=CCW\n", mseconds,speed*100); } break; } } } //check liquid level1 低 if (rt_event_recv(&tripEvent, (EVENT_FLAG5),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { getMTLIOLowState(); if(flow_t.ltierchk) { if(mt.bot==LEVELUP) { pumpTurn_stop(); motor_move_result_flag = MOTOR_BOTOK ; if(debuggg >=3){ rt_kprintf("pump bot stop:racetime=%d,speed=%f,dir=CW\n", mseconds,speed*100); } break; } } } if (rt_event_recv(&tripEvent, (EVENT_FLAG8),RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,RT_WAITING_NO, &e) == RT_EOK) { getMTLIOLowState(); if(flow_t.ltierchk) { getMTLIOLowState(); if(mt.bot==LEVELDN) { pumpTurn_stop(); motor_move_result_flag = MOTOR_BOTOK ; if(debuggg >=3){ rt_kprintf("pump bot stop:racetime=%d,speed=%f,dir=CCW\n", mseconds,speed*100); } break; } } } if(usSRegHoldBuf[ADDR_run_pump_task]==3)//泵停止命令 { pumpTurn_stop(); motor_move_result_flag = MOTOR_STOPOK ; usSRegHoldBuf[ADDR_run_pump_task]=0; break; } if(usSRegHoldBuf[ADDR_return_ACTION] == 1) { rt_kprintf("usSRegHoldBuf[ADDR_return_ACTION]=%d\n", usSRegHoldBuf[ADDR_return_ACTION]); break; } } }else pumpTurn_stop(); } ```
查看更多
0
个回答
默认排序
按发布时间排序
暂无答案,快来添加答案吧
撰写答案
登录
注册新账号
关注者
0
被浏览
230
关于作者
神的红薯干
这家伙很懒,什么也没写!
提问
5
回答
0
被采纳
0
关注TA
发私信
相关问题
1
mbedtls 定义全局变量就会死机
2
按下复位键,RTT程序死机正常吗?
3
打开了USB MSC功能一段时间后卡死
4
RT_Thread中不同线程对全局变量读和写,会导致死机吗?
5
STM32F767同时用两个串口会导致死机
6
STM32G030F6,用串口中断函数接收数据,一向其发送数据就死机
7
timer这个线程是不是应该要高于其它所有线程
8
为什么系统创建的只执行一次的timer定时器会反复执行
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部