你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 HAL库 定时器捕获 清零问题

[复制链接]
sgfwin 提问时间:2016-10-13 10:07 /
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{        
                if (htim->Instance == TIM4)
                {
                          if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
                         {
                                          ccr_cur = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1);
                                       
                                          __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 0);                                                                                                                                                                                                //dbug   不能清零捕获计算器
                                          dbug_data = __HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1);  
                                                                                      //dbug   读取仍然为ccr_cur的值

                                          。。。。。。。。。。。。。。。。。。。。
                                          。。。。。。。。。。。。。。。。。。。。


收藏 2 评论9 发布时间:2016-10-13 10:07

举报

9个回答
adlu 回答时间:2016-10-19 14:47:04
你这个用法就是错的,根本没理解这两个函数的功能。
__HAL_TIM_SET_COMPARE()是设置CCRx,一般是用在PWM输出的,控制PWM占空比。
而__HAL_TIM_GET_COMPARE()是用来读取CCRx的,一般用于捕获处理。

你可能对捕获的过程不是很清楚。
捕获是当设定的事件(如上升沿)发生时,CNT的值被复制到CCRx中。
在使用捕获功能时,清零CCRx并没有什么意义,此时对CCRx的写入是无效的。
所以你调用__HAL_TIM_SET_COMPARE()就没有效果。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

逍遥李 回答时间:2016-10-13 10:39:51
捕获的意思不是“跳变时间点”么,我的理解是这个返回的值是一个时间点,要拿到下一个跳变时间点才能获得脉宽,才算是完成捕获……是不是这样的?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

xmshao 回答时间:2016-10-13 13:04:49
你不调用函数,直接修改寄存器,然后再读寄存器看看。
sgfwin 回答时间:2016-10-13 13:30:29
逍遥李 发表于 2016-10-13 10:39
捕获的意思不是“跳变时间点”么,我的理解是这个返回的值是一个时间点,要拿到下一个跳变时间点才能获得脉 ...

电平跳变的时候  自动把定时器计数器time_cnt读取,并且放入捕获寄存器time_ccr。理论上应该是应该直接清零定时器计数器,调用__HAL_TIM_SET_COUNTER(&htim4,  0);    那么__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 0); 这个函数不知道起什么作用,看意思好像是清除捕获寄存器的值。
sgfwin 回答时间:2016-10-13 13:34:17
xmshao 发表于 2016-10-13 13:04
你不调用函数,直接修改寄存器,然后再读寄存器看看。

我的本意是让计数器从0重新计数。     应该是直接清除定时器的计数寄存器。    不知道__HAL_TIM_SET_COMPARE这个函数有什么用
逍遥李 回答时间:2016-10-13 13:57:19
sgfwin 发表于 2016-10-13 13:30
电平跳变的时候  自动把定时器计数器time_cnt读取,并且放入捕获寄存器time_ccr。理论上应该是应该直接清零 ...

进去看下原函数就知道了,是不是强制比较啊,就是直接设置电平,强制产生一次中断,很多单片机的捕获都有这个功能,另外,清零就是直接给计数器清零
xmshao 回答时间:2016-10-19 20:49:26
是的,楼上正解。 当CC同道配置为输入捕捉时,CCR寄存器变为只读。

至于函数功能,点进去往下看就知道了。
asssdz-382474 回答时间:2016-10-19 21:18:43
zero99 回答时间:2016-11-1 13:44:09
楼主解决没
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版