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
不懂,帮顶