a208hlc-57526 发表于 2015-1-30 14:18:15

一般不会出现这种问题,只要你的应用中不延时46天就行,系统运行不受46天限制,比如你从FFFFFF00,开始定时10天,这个函数也是不会错的,仔细想一下吧

fuluoce 发表于 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=0xfftimingdelay=0xef;
//while(HAL_GetTick() < timingdelay)
      while(uwTick < timingdelay)   //这里不会等待延时 直接跳出去
{;
}
}

不知道你看懂了没有

fuluoce 发表于 2015-2-4 09:33:18

顶一个!求解决

foxglove 发表于 2015-2-11 12:29:40

uint32_t timingdelay

wambob 发表于 2015-2-11 12:46:00

fuluoce 发表于 2015-1-13 14:01
这里的滴答定时器 只是1ms中断一次 就是说1ms uwTick加1 这并没有把我的问题解决 ...

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

liudashuang 发表于 2015-2-11 19:31:33

:@:@:@:@:@:@:@

飞飞ARM 发表于 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天那是很正常的。所以还是有一些问题的。

飞飞ARM 发表于 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))
{
}
}

gkcclm 发表于 2015-5-22 22:42:36

这个bug感觉理论上无法解决。这种定时应该只能通过中断程序来实现(在SysTick_Handler中来处理)。

uint32_t g_delay_request_flag = 0;
uint32_t g_delay_timeout_flag = 0;
uint32_t g_delay_target_tick;

void HAL_Delay(__IO uint32_t Delay)
{
HAL_SuspendTick();        //先停止定时器,或者禁止中断

g_delay_target_tick = HAL_GetTick() + Delay;

g_delay_timeout_flag = 0;

g_delay_request_flag = 1;

HAL_ResumeTick();

while(!g_delay_timeout_flag)
{
}
}

/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */

/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
/* USER CODE BEGIN SysTick_IRQn 1 */

if(g_delay_request_flag && g_delay_target_tick == HAL_GetTick())
{
        g_delay_request_flag = 0;
       
        g_delay_timeout_flag = 1;
}
/* USER CODE END SysTick_IRQn 1 */
}

HenryChen 发表于 2015-7-2 12:16:53

不懂,帮顶
页: 1 [2] 3 4
查看完整版本: STM32的HAL库的HAL_Delay问题和UART接受数据问题