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

楼主: fuluoce

STM32的HAL库的HAL_Delay问题和UART接受数据问题

[复制链接]

4

主题

14

回帖

0

蝴蝶豆

初级会员

最后登录
2018-12-27
发表于 2015-1-30 14:18:15 | 显示全部楼层
一般不会出现这种问题,只要你的应用中不延时46天就行,系统运行不受46天限制,比如你从FFFFFF00,开始定时10天,这个函数也是不会错的,仔细想一下吧
回复 支持 反对

使用道具 举报

5

主题

31

回帖

0

蝴蝶豆

初级会员

最后登录
2019-4-10
 楼主| 发表于 2015-1-30 17:59:47 | 显示全部楼层
a208hlc-57526 发表于 2015-1-30 14:18
一般不会出现这种问题,只要你的应用中不延时46天就行,系统运行不受46天限制,比如你从FFFFFF00,开始定时1 ...

uwTick的值范围是不是   0- 0xffffffff;uwTick每1ms加1
当uwTick=0xfffffff0;的时候 延时0xff ms  你就会发现延时不了

void HAL_Delay(__IO uint32_t Delay)  // Delay=0xff
{
  __IO uint32_t timingdelay;

  timingdelay = uwTick + Delay;  //假如此刻uwTick =0xfffffff0 Delay=0xff  timingdelay=0xef;
  //while(HAL_GetTick() < timingdelay)
        while(uwTick < timingdelay)   //这里不会等待延时 直接跳出去
  {;
  }
}

不知道你看懂了没有
回复 支持 反对

使用道具 举报

5

主题

31

回帖

0

蝴蝶豆

初级会员

最后登录
2019-4-10
 楼主| 发表于 2015-2-4 09:33:18 | 显示全部楼层
顶一个!  求解决
回复 支持 反对

使用道具 举报

2

主题

397

回帖

0

蝴蝶豆

高级会员

最后登录
2016-12-21
发表于 2015-2-11 12:29:40 | 显示全部楼层
uint32_t timingdelay
回复 支持 反对

使用道具 举报

93

主题

2449

回帖

4

蝴蝶豆

论坛元老

最后登录
2020-6-28
发表于 2015-2-11 12:46:00 | 显示全部楼层
fuluoce 发表于 2015-1-13 14:01
这里的滴答定时器 只是1ms中断一次 就是说1ms uwTick加1 这并没有把我的问题解决 ...

滴答定时器到0后,自动+载的吧,另外滴答是的24位计数器,uwTick++达不到uwTick=0xffffffff的吧
回复 支持 反对

使用道具 举报

5

主题

122

回帖

2

蝴蝶豆

金牌会员

最后登录
2020-1-19
发表于 2015-2-11 19:31:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

2

回帖

0

蝴蝶豆

新手上路

最后登录
2020-11-20
发表于 2015-5-4 00:49:18 | 显示全部楼层
本帖最后由 飞飞ARM 于 2015-5-4 02:03 编辑

似乎是有这问题。其实以前的VB也有这个问题。
MSDN中也明确的提到了:"Retrieves the number of milliseconds that have elapsed since the system was started, up to 49.7 days."。因此,如果是编写服务器端程序,此处一定要万分注意,避免引起意外的状况。

不过再MCU里连续工作49天那是很正常的。所以还是有一些问题的。

回复 支持 反对

使用道具 举报

0

主题

2

回帖

0

蝴蝶豆

新手上路

最后登录
2020-11-20
发表于 2015-5-4 00:54:35 | 显示全部楼层
本帖最后由 飞飞ARM 于 2015-5-4 02:03 编辑

应该还是有问题的吧。。
在HAL库里,很多都是:if((Timeout == 0) || ((HAL_GetTick() - tickstart ) > Timeout))  这类判断

如果改成:if((Timeout == 0) || (HAL_GetTick() > (tickstart + Timeout))) 就好像没问题了

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();
  while(HAL_GetTick() < (tickstart+ Delay))
  {
  }
}

回复 支持 反对

使用道具 举报

1

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
2015-5-23
发表于 2015-5-22 22:42:36 | 显示全部楼层
这个bug感觉理论上无法解决。这种定时应该只能通过中断程序来实现(在SysTick_Handler中来处理)。

  1. uint32_t g_delay_request_flag = 0;
  2. uint32_t g_delay_timeout_flag = 0;
  3. uint32_t g_delay_target_tick;

  4. void HAL_Delay(__IO uint32_t Delay)
  5. {
  6.   HAL_SuspendTick();        //先停止定时器,或者禁止中断
  7.   
  8.   g_delay_target_tick = HAL_GetTick() + Delay;
  9.   
  10.   g_delay_timeout_flag = 0;
  11.   
  12.   g_delay_request_flag = 1;
  13.   
  14.   HAL_ResumeTick();
  15.   
  16.   while(!g_delay_timeout_flag)
  17.   {
  18.   }
  19. }

  20. /**
  21. * @brief This function handles System tick timer.
  22. */
  23. void SysTick_Handler(void)
  24. {
  25.   /* USER CODE BEGIN SysTick_IRQn 0 */

  26.   /* USER CODE END SysTick_IRQn 0 */
  27.   HAL_IncTick();
  28.   HAL_SYSTICK_IRQHandler();
  29.   /* USER CODE BEGIN SysTick_IRQn 1 */

  30.   if(g_delay_request_flag && g_delay_target_tick == HAL_GetTick())
  31.   {
  32.         g_delay_request_flag = 0;
  33.        
  34.         g_delay_timeout_flag = 1;
  35.   }
  36.   /* USER CODE END SysTick_IRQn 1 */
  37. }
复制代码
回复 支持 反对

使用道具 举报

4

主题

233

回帖

0

蝴蝶豆

高级会员

最后登录
2019-1-10
发表于 2015-7-2 12:16:53 | 显示全部楼层
不懂,帮顶
回复 支持 反对

使用道具 举报

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