OpenEdv-开源电子网

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

f103 按键触发定时器问题

[复制链接]

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
发表于 2021-9-4 09:00:25 | 显示全部楼层 |阅读模式
3金钱
我把定时器赋值成  形式参数,用多个按键买改变定时器的触发时间,但是我把MX_TIM3_Init(7199,1999);放入while循环里,定期器触发就不正常,时间太快,放在int main就是正常的。请论坛里的大神帮忙解决下,这是啥问题?


void MX_TIM3_Init(unsigned short int aaa,unsigned short int bbb)//定时器入口参数
{
   htim3.Init.Prescaler = aaa;
   htim3.Init.Period = bbb;
   程序有省略.......................................



}



int mainl里

while (1)
  {
//     HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

//     HAL_Delay(100);


     if(HAL_GPIO_ReadPin(KEY_S2_GPIO_Port,KEY_S2_Pin) == GPIO_PIN_RESET)//置位1
     {
         HAL_Delay(20);

         if(HAL_GPIO_ReadPin(KEY_S2_GPIO_Port, KEY_S2_Pin) == GPIO_PIN_RESET)//置位1
         {
//             MX_TIM3_Init(7199,1999);

            HAL_TIM_Base_Start_IT(&htim3);
         }
         else

         {

             HAL_TIM_Base_Stop_IT(&htim3);
//          HAL_GPIO_ResetBits(LED0_GPIO_Port, LED0_Pin);
             HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);//置位0
         }
     }



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

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-9-4 09:16:39 | 显示全部楼层
MX_TIM3_Init你这个是初始化吧?你反复去初始化他干吗啊?
要么初始化前先把定时器停了,要么就单纯的去设置ARR他们
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-9-4 09:25:04 | 显示全部楼层
聚东风 发表于 2021-9-4 09:16
MX_TIM3_Init你这个是初始化吧?你反复去初始化他干吗啊?
要么初始化前先把定时器停了,要么就单纯的去设置A ...

我单独设置这个两个参数,给aaa,bbb赋值,发现没起作用
htim3.Init.Prescaler = aaa;
   htim3.Init.Period = bbb;
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-9-4 09:28:34 | 显示全部楼层
tianxiazone 发表于 2021-9-4 09:25
我单独设置这个两个参数,给aaa,bbb赋值,发现没起作用
htim3.Init.Prescaler = aaa;
   htim3.Init. ...

你试下
TIM3->ARR=bbb;
TIM3->  PSC=aaa;
如果没起作用,就去CR1,CR2里面看下,缓冲是不是生效了
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-9-4 09:40:10 | 显示全部楼层
聚东风 发表于 2021-9-4 09:28
你试下
TIM3->ARR=bbb;
TIM3->  PSC=aaa;

我是菜鸟,不会直接操作寄存器 ,  
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2021-9-4 10:27:12 | 显示全部楼层
tianxiazone 发表于 2021-9-4 09:40
我是菜鸟,不会直接操作寄存器 ,

void MX_TIM3_Init(unsigned short int aaa,unsigned short int bbb)//定时器入口参数
{
   htim3.Init.Prescaler = aaa;
   htim3.Init.Period = bbb;
   程序有省略.......................................



}
把这里面两句话直接换掉啊
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-9-4 10:42:31 | 显示全部楼层
聚东风 发表于 2021-9-4 10:27
void MX_TIM3_Init(unsigned short int aaa,unsigned short int bbb)//定时器入口参数
{
   htim3.Init ...

我是这样换掉的,但是下载后没有反应,我现在用的编译器是 stm32cubeide用的是HAL库
但是我觉得这个
htim3.Init.Prescaler = aaa;
htim3.Init.Period = bbb;

TIM3->ARR=bbb;
TIM3->  PSC=aaa;
这两个语句是一样的,一个是HAL库做的,一个直接操作了寄存器
void MX_TIM3_Init(unsigned short int aaa,unsigned short int bbb)//定时器入口参数
{
   TIM3->ARR=bbb;
   TIM3->  PSC=aaa;
   程序有省略.......................................
}

其实主要的问题再这里。。。。。。。。。。。。。。。。。。。。。。

while (1)
  {
     if(HAL_GPIO_ReadPin(KEY_S2_GPIO_Port,KEY_S2_Pin) == GPIO_PIN_RESET)//置位1
     {
         HAL_Delay(20);

         if(HAL_GPIO_ReadPin(KEY_S2_GPIO_Port, KEY_S2_Pin) == GPIO_PIN_RESET)//置位1
         {
            aaa=7199;//这个是全局变量
            bbb=1999;//
            

            HAL_TIM_Base_Start_IT(&htim3);
         }
         else
         {
             HAL_TIM_Base_Stop_IT(&htim3);
             HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);//置位0
         }
     }
主函数需要定义一个
extern unsigned  int aaa,bbb;

         aaa=7199;//这个是全局变量
         bbb=1999;//

tim.c
的函数中需要定义一个

unsigned  int aaa,bbb;



unsigned  int aaa,bbb;与void MX_TIM3_Init(unsigned short int aaa,unsigned short int bbb)//是不是一个函数,还是 unsigned  int aaa,bbb是全局变量,void MX_TIM3_Init(unsigned short int aaa,unsigned short int bbb是局部变量
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2021-6-29
在线时间
13 小时
发表于 2021-9-4 11:45:50 | 显示全部楼层
为什么我发的求助帖一直在审核中。。。这个也是新帖子就能发出来。
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-9-4 11:48:25 | 显示全部楼层
lxjiiing 发表于 2021-9-4 11:45
为什么我发的求助帖一直在审核中。。。这个也是新帖子就能发出来。

我也不清楚啊,你的贴子有图片么?
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2021-6-29
在线时间
13 小时
发表于 2021-9-4 11:50:09 | 显示全部楼层
tianxiazone 发表于 2021-9-4 11:48
我也不清楚啊,你的贴子有图片么?

没有图片,昨天发的帖子一直审核中,奇怪了,发帖有什么要求。
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-9-4 11:55:31 | 显示全部楼层
lxjiiing 发表于 2021-9-4 11:50
没有图片,昨天发的帖子一直审核中,奇怪了,发帖有什么要求。

你再发一个   我有时候发两个
回复

使用道具 举报

3

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2021-6-29
在线时间
13 小时
发表于 2021-9-4 12:01:53 | 显示全部楼层
tianxiazone 发表于 2021-9-4 11:55
你再发一个   我有时候发两个

发了3个全部待审核。
无标题.png
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-9-4 13:53:22 | 显示全部楼层
lxjiiing 发表于 2021-9-4 12:01
发了3个全部待审核。

有可能f3 专区  维护的人不多
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-9-6 01:06:38 | 显示全部楼层
再次初始化之前,必须关闭定时器,进行凡初始化。
你的按键程序也有问题。比如说按下2s,按你的程序是大约进行了2000/20=100次初始化。
而且你释放按键的时刻也会有抖动,如果你WHILE循环扫描到GPIO引脚时是RESET,抖动了5ms,那20ms后已经恢复高电平了,这时必然进入你的else分支,停止定时器。
按键程序有非常成熟的了,去参考一下吧。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-9-6 01:59:07 | 显示全部楼层
多学学基础,什么都靠cubmex,是干不了事的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-9-6 08:54:15 | 显示全部楼层
别的不说,这按键程序我就。。。。。
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-9-6 08:55:15 | 显示全部楼层
按键按着就一直初始化定时器?按下初始化一次就够了啊。
回复

使用道具 举报

8

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2017-7-19
在线时间
87 小时
 楼主| 发表于 2021-9-6 08:58:55 | 显示全部楼层
正点原子 发表于 2021-9-6 01:59
多学学基础,什么都靠cubmex,是干不了事的

谢谢原子哥,我基础的确不是太好,我也是简单的学习编程,c语言的功底也并不是太好,但是我觉得stm32cubeide 这个软件的确不错,又是stm自己开发的,对自己的芯片不管是兼容还是下载调试都非常好,主要他还是一个编译器,而且是免费的。  编程的代码也可以不需要他现成的编译的代码,可以完全自己写,其实stm32cubeide开发的这款软件就是为了用户快速的开发项目,加快编译的效率,stm32cubeide 就一个很好的编译器,可能以后会越来越普及,也希望原子哥可以出一个stm32cubeide的视频教程,谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-9-7 01:58:57 | 显示全部楼层
tianxiazone 发表于 2021-9-6 08:58
谢谢原子哥,我基础的确不是太好,我也是简单的学习编程,c语言的功底也并不是太好,但是我觉得stm32cube ...

我们暂时不考虑
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-2 20:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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