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

楼主: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版