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

关于定时器UIF标志位问题

[复制链接]
D罩杯恋人 提问时间:2016-4-9 12:04 /
本帖最后由 D罩杯恋人 于 2016-4-9 12:07 编辑

问题:使用Cube库生存工程,想用TIM6做一个us延时,但是初始化时会自动开启更新事件标志UIF位。导致轮询时经常可以获得一个事件标志位。正常情况下,应该等到计数上溢或下溢才会更新这个标志位的,但是使用Cube已初始化,执行到: HAL_TIM_Base_Start(&htim6);或者HAL_StatusTypeDef HAL_TIM_Base_Start_IT(&htim6)都会去置位这个标志位!
以下为初始化代码:
void Timer_DelayUs(uint32_t Iu32DelayUs)
{
  TIM_HandleTypeDef htim6;
  uint8_t u8ReturnStatus=0;
  TIM_Base_InitTypeDef Tim6_Init;
  
  Tim6_Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
  Tim6_Init.CounterMode=TIM_COUNTERMODE_UP;
  Tim6_Init.Period=Iu32DelayUs;
  Tim6_Init.Prescaler=72;
  Tim6_Init.RepetitionCounter=0;
  
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 72;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 10000;

  
  TIM_Base_SetConfig(TIM6,&Tim6_Init);
  HAL_TIM_Base_MspInit(&htim6);
  //__HAL_TIM_CLEAR_IT(&htim6,TIM_FLAG_UPDATE);
  HAL_TIM_Base_Start(&htim6);
  while(1)
  {
    if((__HAL_TIM_GET_FLAG(&htim6, TIM_FLAG_UPDATE) != RESET))
      break;
  }
  __HAL_TIM_CLEAR_IT(&htim6,TIM_FLAG_UPDATE);
//  HAL_TIM_Base_Stop_IT(&htim6);
  HAL_TIM_Base_Stop(&htim6);
  
  

}


目前解决方法:只有一开始禁止更新时间(将UDIS置1),才不至于一初始化就会有事件标志位UIF置1,但问题是Cube定时器库函数没有设置UDIS的函数。

求解:大家在遇到这个问题是怎么解决的,是不是有什么更好的解决办法?

UIF标志位会在开启就置位为1

UIF标志位会在开启就置位为1
收藏 1 评论3 发布时间:2016-4-9 12:04

举报

3个回答
xmshao 回答时间:2016-4-9 22:10:38
有遇到过。

你试试调整配置顺序看看。
这里有一相关文章你可以了解下。STM32 定时器有时一开启就进中断的话题
D罩杯恋人 回答时间:2016-4-9 22:59:48
困扰了我很久,我以为理解错了
疯狂的指头 回答时间:2016-4-10 20:14:06
  1. MX_TIM6_Init();
  2. ...
  3. ...
  4. ...
  5. __HAL_TIM_CLEAR_IT(&htim6, TIM_IT_UPDATE);
  6. __HAL_TIM_ENABLE_IT(&htim6,TIM_IT_UPDATE);
复制代码

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版