OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8067|回复: 11

求教STM32F103实现按键按一下暂停程序,再按一下继续执行

[复制链接]

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2022-9-29
在线时间
27 小时
发表于 2023-4-1 21:37:51 | 显示全部楼层 |阅读模式
3金钱
程序如下图所示,想中断改变标志位,然后死等标志位改变的方式来实现的,但是在中断中while又没法再次响应该中断来改变标志位。
程序的总体功能是控制电机旋转,希望在按下按键后电机可以停止,再次按下可以按照之前暂停的地方继续执行
求指教思路,该如何实现。

void EXTI9_5_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line8)!=RESET)
        {
                delay_ms(10);//Ïû¶¶
                if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)==0)         //°′¼üKEY0
                {
                        flag ^= 1;
                while(flag)
                {
//                                if(flag == 1)
//                                {
//                                        TIM_Cmd(TIM2, DISABLE);  //
//                                        TIM_Cmd(TIM3, DISABLE);  //
//                                        TIM_Cmd(TIM4, DISABLE);  //
//                                }
//                                else
//                                {
//                                        TIM_Cmd(TIM2, ENABLE);  //3
//                                        TIM_Cmd(TIM3, ENABLE);  //
//                                        TIM_Cmd(TIM4, ENABLE);  //
//                                        break;
//                        }
                }
                }               
        }
        EXTI_ClearITPendingBit(EXTI_Line8);  //Çå3yLINE4éÏμÄÖD¶Ï±ê־λ  
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8205
金钱
8205
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-4-3 14:59:20 | 显示全部楼层
while(flag)这句去掉试试,break也去掉.
电机是怎么让它转的?
专治疑难杂症
回复

使用道具 举报

26

主题

1538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6376
金钱
6376
注册时间
2015-8-25
在线时间
1004 小时
发表于 2023-4-3 16:32:29 | 显示全部楼层
我理解电机停止不是把程序卡住就行的吧??

直流电机控制:IO口控制方向,PWM来调速。你把程序卡住,IO,PWM早就设置好了,你的电机应该一直在转不会停吧
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

41

主题

276

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2354
金钱
2354
注册时间
2019-10-29
在线时间
380 小时
发表于 2023-4-3 16:45:09 | 显示全部楼层
正点原子的资料下载里有个电机开发板,你可以去下载资料看看是怎么控制电机转动的,给step脚输出pwm就转动了,停止输出pwm电机就停了,详细的去看看资料里的文档和源码
http://www.openedv.com/docs/boards/stm32dj/ATK-DMF407.html
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2022-9-29
在线时间
27 小时
 楼主| 发表于 2023-4-3 22:25:20 | 显示全部楼层
LcwSwust 发表于 2023-4-3 14:59
while(flag)这句去掉试试,break也去掉.
电机是怎么让它转的?

引脚一直输出PWM波
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2022-9-29
在线时间
27 小时
 楼主| 发表于 2023-4-3 22:27:24 | 显示全部楼层
szczyb1314 发表于 2023-4-3 16:32
我理解电机停止不是把程序卡住就行的吧??

直流电机控制:IO口控制方向,PWM来调速。你把程序卡住,IO ...

我用的步进电机,想停住的时候使能ENA引脚,通过时序控制ENA脚控制步进电机停转的,主要没法在delay_ms的时候让电机通过标志位知道该停了
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8205
金钱
8205
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-4-4 15:35:31 | 显示全部楼层
tyty697 发表于 2023-4-3 22:25
引脚一直输出PWM波

哦,暂停的话就只需停PWM呗,不需要让程序也跟着停。
专治疑难杂症
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-4-4 15:42:19 | 显示全部楼层
程序暂停怎么再去检测开始的按键。。。应该是没写过程序吧,思维逻辑不对
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2022-9-29
在线时间
27 小时
 楼主| 发表于 2023-4-4 21:53:57 | 显示全部楼层
LcwSwust 发表于 2023-4-4 15:35
哦,暂停的话就只需停PWM呗,不需要让程序也跟着停。

但是我主程序是让pwm输出一段时间,暂停一段时间,然后再输出一段时间这样子,如果直接在中断里将PWM关掉是可以暂停,但再次启动就不能按照之前的时序工作了。
感觉我主程序的写法有问题,如果主程序里是开PWM,delay,关PWM这样控制,是没办法做到暂停,然后再按照之前的行为启动了。
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2022-9-29
在线时间
27 小时
 楼主| 发表于 2023-4-4 21:57:12 | 显示全部楼层
a5820736 发表于 2023-4-4 15:42
程序暂停怎么再去检测开始的按键。。。应该是没写过程序吧,思维逻辑不对

也不是说要让程序暂停,就是想让程序可以阻塞在按下按键的这个时刻,在再次按下后取消阻塞继续运行。
看到原子哥在一个串口控制的帖子下面评论说让程序在串口中断里死等,同时检测串口接收的字符,如果是启动字符就再次启动。我就想着让程序在外部中断里死等了。。。
回复

使用道具 举报

5

主题

94

帖子

0

精华

高级会员

Rank: 4

积分
934
金钱
934
注册时间
2017-4-8
在线时间
111 小时
发表于 2023-4-6 17:20:50 | 显示全部楼层
tyty697 发表于 2023-4-4 21:57
也不是说要让程序暂停,就是想让程序可以阻塞在按下按键的这个时刻,在再次按下后取消阻塞继续运行。
看 ...

死等中断这种写法太浪费资源,今后在工作中也不会建议用这样的写法。还是从开始就培养良好的逻辑习惯把。
回复

使用道具 举报

7

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2022-9-29
在线时间
27 小时
 楼主| 发表于 2023-4-6 22:31:21 | 显示全部楼层
Mascreda 发表于 2023-4-6 17:20
死等中断这种写法太浪费资源,今后在工作中也不会建议用这样的写法。还是从开始就培养良好的逻辑习惯把。

所以说来询问有什么好的方法嘛。
#define MOTOR2_RUN_ONE                {        MOTOR2_RUN                        \
                                                                                                                delay_ms(1000);        \
                                                                                                                MOTOR2_STOP                        \
                                                                                                                delay_ms(500);         \
                                                                                                        }
主程序里是用这样的方法实现时序控制的,这样写就不知道该如何做到能随时使系统暂停,和启动,所以想问有什么好的方法没
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 20:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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