OpenEdv-开源电子网

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

关于hal库中HAL_TIM_IRQHandler();函数底层感觉有bug的问题,有大神来回答一下吗?

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-3-28
在线时间
1 小时
发表于 2019-3-28 02:44:11 | 显示全部楼层 |阅读模式
1金钱
在HAL_TIM_IRQHandler();这个函数的定义中都会有类似__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET获取这个标志位的操作,但是并没有清除此标志位,但是同一函数中有__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) !=RESET这样的获取中断标志的操作,函数中就有清除的操作,这是为什么?有大神来解释一下吗?

还有一个小问题就是有大神来解释一下__HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) 和 __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)的具体区别是什么?
还有就是HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim);和HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);的区别。。。

如图圈起来的地方

如图圈起来的地方

最佳答案

查看完整内容[请看2#楼]

首先,他这样判断的依据是:先判断中断标志的发生, #define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__)) 然后在判断中断是否开启。。 #define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) 由这个宏定义可以知道,一个是读SR寄存器,一个是读DIER寄存器。 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2019-3-28 02:44:12 | 显示全部楼层
本帖最后由 xiedonghui258 于 2019-3-28 16:48 编辑

首先,他这样判断的依据是:先判断中断标志的发生,
#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__)          (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__))
然后在判断中断是否开启。。
#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)
由这个宏定义可以知道,一个是读SR寄存器,一个是读DIER寄存器。
TIM图片20190328164645.png
然后,
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__)     ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__))
清除的话,也是清除SR寄存器。

回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-3-28
在线时间
1 小时
 楼主| 发表于 2019-3-28 15:38:20 来自手机 | 显示全部楼层
自己顶一下....求助求助,大神们帮帮忙啊
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2019-3-28 16:16:25 | 显示全部楼层
[mw_shl_code=c,true]

/**
  * @brief  Checks whether the specified TIM interrupt flag is set or not.
  * @param  __HANDLE__: specifies the TIM Handle.
  * @param  __FLAG__: specifies the TIM interrupt flag to check.
  *        This parameter can be one of the following values:
  *            @arg TIM_FLAG_UPDATE: Update interrupt flag
  *            @arg TIM_FLAG_CC1: Capture/Compare 1 interrupt flag
  *            @arg TIM_FLAG_CC2: Capture/Compare 2 interrupt flag
  *            @arg TIM_FLAG_CC3: Capture/Compare 3 interrupt flag
  *            @arg TIM_FLAG_CC4: Capture/Compare 4 interrupt flag
  *            @arg TIM_FLAG_COM:  Commutation interrupt flag
  *            @arg TIM_FLAG_TRIGGER: Trigger interrupt flag
  *            @arg TIM_FLAG_BREAK: Break interrupt flag   
  *            @arg TIM_FLAG_CC1OF: Capture/Compare 1 overcapture flag
  *            @arg TIM_FLAG_CC2OF: Capture/Compare 2 overcapture flag
  *            @arg TIM_FLAG_CC3OF: Capture/Compare 3 overcapture flag
  *            @arg TIM_FLAG_CC4OF: Capture/Compare 4 overcapture flag
  * @retval The new state of __FLAG__ (TRUE or FALSE).
  */
#define __HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__)          (((__HANDLE__)->Instance->SR &(__FLAG__)) == (__FLAG__))

/**
  * @brief  Checks whether the specified TIM interrupt has occurred or not.
  * @param  __HANDLE__: TIM handle
  * @param  __INTERRUPT__: specifies the TIM interrupt source to check.
  * @retval The state of TIM_IT (SET or RESET).
  */
#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)

[/mw_shl_code]

自己去stm32fxxx_hal_tim.h去找对应的代码, 就可以知道差异.

HAL_TIM_Base_Start_IT()会发中断, 没有带_IT()后绰的不发.
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2019-3-28 16:49:52 | 显示全部楼层
第二个问题,看三楼
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-7-15
在线时间
18 小时
发表于 2019-8-16 09:23:11 | 显示全部楼层
我想问下这个函数应该怎么调用,我之前的函数是SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE);怎么改写到这个函数中?  新手求指导
回复

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-8-16 10:13:44 | 显示全部楼层
流云无声 发表于 2019-8-16 09:23
我想问下这个函数应该怎么调用,我之前的函数是SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE);怎么改写 ...

修改一下参数就好了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 10:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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