找回密码
 立即注册
查看: 418|回复: 13

定时器用作计数模式,寄存器值不能清零问题,急救!!

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-11 10:42:17 | 显示全部楼层 |阅读模式

项目中发现,定时器用作计数模式,寄存器值不能清零问题,目前比较急,急盼各路大佬支招,感谢!!描述如下:

一、代码:
17f1780e9fdb7b2b3c50be950dcf061.png

用示波器监控实际真实的计数脉冲有没有到P0.4及P0.6脚上,结果用示波器监控发现是有的:

a34442001b7f5c12d8c3bda833a656a.png

用485打印监控也有:

a6bfea31bd5b03249b630d09636f1a0.png

二、手册里面对定时器3的相关描述:

560b5c6c0cdf7fc2360fb536301c9ed.png

按照手册里面此处的描述,当定时器3用作计数方式【T3_C/T=1】、T3R=0时,我程序里面写T3H=0及T3L=0,此时应该可以对T3H及T3L写入0的,但是无论我如何操作都不能对T3H及T3L清0,此时读取的T3H及T3L仍然是接续计数停止前上次的值。

1743c2fe78371b0aa56bd0f115de051.png

实在不能理解!

不停地学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-11 12:36:28 | 显示全部楼层

希望高手帮忙分析一下,感谢baoquan

不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-1-11 23:13:12 | 显示全部楼层
需要手动清零用16位不自动重载模式
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-12 08:48:25 | 显示全部楼层
Debu*** 发表于 2025-1-11 23:13
需要手动清零用16位不自动重载模式

定时器3、4只有固定的16位自动重载模式。
不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-12 08:54:49 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=139487&ptid=13691][color=#999999]DebugLab 发表于 2025-1-11 23:13[/color][/url][/size] 需要手动清零用16位不自动重载模式[/quote]

1736643266566.png

不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-12 09:14:46 | 显示全部楼层

1736644173701.png
若是按照手册里面此处的描述,当定时器3用作计数方式【T3_C/T=1】、且停止计数【T3R=0】时,我程序里面写T3H=0及T3L=0,此时应该可以对T3H及T3L写入0的,但是无论我如何操作都不能对T3H及T3L清0,此时读取的T3H及T3L仍然是接续计数停止前上次的值。同时定时器3、4用作计数器时只有16位自动重装载模式,不知道是否是与此相关,只要处于16位自动重装载模式就不能改变T3H及T3L的值,有此疑问,但是不知是否确定是这样????????另外,我在计数器3、4初始化时却是可以写T3H=0及T3L=0的,这就给人一种误导,结合上面的的手册里面的相关描述的截图内容,很容易让人认为是可以在计数器停止时对寄存器进行清零操作的,唉,若此问题不能解决,我们的项目就要黄了,年都过不好了!!!!!!!

不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-12 09:17:23 | 显示全部楼层

想把定时器3、4改为0或1、2,但是硬件已经固化,也无法更改了!悲催了!!!!!

点评

你好,可以尝试先切换回到定时器模式,然后再进行清零操作,这边对T0的16位自动重载测试,是正常可以清零的 [attachimg]80279[/attachimg]  详情 回复 发表于 2025-1-12 17:51
不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-1-12 17:51:10 | 显示全部楼层

你好,可以尝试先切换回到定时器模式,然后再进行清零操作,这边对T0的16位自动重载测试,是正常可以清零的

while (1)
{
	if(P34_flag)
	{
		P34_flag = 0;
		in_cnt = ((u16)TH0<<8|(u16)TL0);
		printf("T0++,This Num=%d\r\n",in_cnt);
	}
	if(P35_flag)
	{
		P35_flag = 0;
		TCON &= ~(0x30);//clear TR0/TF0
		TMOD &= ~(0x0f);//clear T0_mode/C_T/GATE
		TH0 = TL0 = 0x00;
		printf("T0 clear,This Num=0!\r\n");
		T0_CT = 1;//in_cnt
		TR0 = 1;
		printf("T0 reload and run\r\n");
	}
}

image.png

补充测试T4也是一样的

image.png

详请参阅测试程序:

if(P33_flag)
{
	P33_flag = 0;
	T4T3M &= ~(0xf0);//clear T4R/T4C_T/T4x12/T4CLKO
	T4H = T4L = 0x00;
	printf("T4 clear,This Num=0!\r\n");
	T4_CT = 1;//in_cnt
	T4R = 1;
	printf("T4 reload and run\r\n");
}
if(P06_flag)
{
	P06_flag = 0;
	in_cnt = ((u16)T4H<<8|(u16)T4L);
	printf("T4++,This Num=%d\r\n",in_cnt);
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-12 18:07:17 | 显示全部楼层
王*** 发表于 2025-1-12 17:51
你好,可以尝试先切换回到定时器模式,然后再进行清零操作,这边对T0的16位自动重载测试,是正常可以清零的 ...

T0及T1确实可以清零,是因为它们都具有几种模式,但是T3、T4只具有16位自动重载模式,应该不支持对T3H、T4H、T3L、T4L清零的。没办法,我只好另选他法了,感谢指导!!
不停地学习
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-05-01 08:52:01
已绑定手机

23

主题

589

回帖

2813

积分

金牌会员

积分
2813
发表于 2025-1-12 18:16:02 | 显示全部楼层
王*** 发表于 2025-1-12 17:51
你好,可以尝试先切换回到定时器模式,然后再进行清零操作,这边对T0的16位自动重载测试,是正常可以清零的 ...

主要是我的硬件也已经固定无法更改了,只能使用T3、T4的外部脉冲计数输入端了。但是我发现只要给芯片断电重新上电,T3、T4的计数寄存器就可以自动恢复为0值,无奈我只好采用软件复位的方式来进行清零操作,虽然太笨了,但是也暂时解决了目前的不清零问题。

点评

你好,我测试T4可以清零的,只需要再给T4_C/T清零就可以了(切换成定时器模式),清零后再重新切换回计数器模式  详情 回复 发表于 2025-1-12 18:25
不停地学习
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:56 , Processed in 0.175895 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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