OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9011|回复: 7

Keil5中Manage Run-Time Environment中HAL_Delay死机

[复制链接]

2

主题

6

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-2-13
在线时间
4 小时
发表于 2016-5-9 13:41:08 | 显示全部楼层 |阅读模式
14金钱
本帖最后由 Sweet 于 2016-5-9 16:36 编辑

最近调试了一个程序,使用的是keil5中Manage Run-Time Environment搭建的库。但是里面的延时函数就是个bug。函数原型与定义如下:
void HAL_Delay(__IO uint32_t Delay);
/**
  * @brief This function provides accurate delay (in milliseconds) based
  *        on variable incremented.
  * @note In the default implementation , SysTick timer is the source of time base.
  *       It is used to generate interrupts at regular time intervals where uwTick
  *       is incremented.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @param Delay: specifies the delay time length, in milliseconds.
  * @retval None
  */
__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}

/**
  * @brief Provides a tick value in millisecond.
  * @note This function is declared as __weak to be overwritten in case of other
  *       implementations in user file.
  * @retval tick value
  */
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

一调用HAL_Delay,CPU就会死机。我在原子的库中重新定义了HAL_Delay,依然死机。但是keil自带的库上面依然有很多函数在调用这个函数。比如SPI,I2C等。这就意味着如果这个问题不解决,那么keil本身的很多外设的驱动就不能直接调用,还要从底层重新写。所以我想解决这个问题。求指教。


15Usart.zip

5.96 MB, 下载次数: 244

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-2-13
在线时间
4 小时
 楼主| 发表于 2016-5-9 13:44:59 | 显示全部楼层
本帖最后由 Sweet 于 2016-5-9 13:48 编辑

我把金钱全部用上了。希望大家指导一下。谢谢。
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-9 15:04:06 | 显示全部楼层
滴答定时器没处理好
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-2-13
在线时间
4 小时
 楼主| 发表于 2016-5-9 16:05:02 | 显示全部楼层
zuozhongkai 发表于 2016-5-9 15:04
滴答定时器没处理好

一般来说怎样处理呢?HAL定时器与原子的Delay定时器是冲突的。我看了原子的底层有启用定时器,关闭定时器。
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-2-13
在线时间
4 小时
 楼主| 发表于 2016-5-9 16:25:06 | 显示全部楼层
zuozhongkai 发表于 2016-5-9 15:04
滴答定时器没处理好

主程序如下,程序的源代码已经上传到了第一楼的附件中。
[mw_shl_code=cpp,true]extern "C"
{
    #include "delay.h"
    #include "led.h"
    #include "stm32f4xx_hal.h"
    #include "usart.h"
}
int main()
{
    HAL_Init();
    delay_init(168);
    Usart1_Init(115200);
    LED *MyLED = new LED;
    int *mem = new int;         //动态分配一个int内存
        while(1)
        {
        for(*mem = 0; *mem < 100; (*mem) ++)
        {
            MyLED->Toggle();
            delay_ms((*mem + 1) * 2);  //使用这句话不死机
//            HAL_Delay((*mem + 1) * 2); //使用这句话就死机  

            Usart1_Send_String("I love nature,\r\n");
            Usart1_Send_String("For nature is beautiful!\r\n");
        }
        }
}

[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-5-11 21:31:17 | 显示全部楼层
HAL的延时用的是中断方式延时,很蛋疼。。。
中断里面一定不要调用,否则就死。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-6-19
在线时间
38 小时
发表于 2019-6-1 19:18:57 | 显示全部楼层
开启优化等级就出现调用HAL_Delay()就会进入HardFault_Handler,不是有哪位大神能解答,在此感激不尽
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2020-2-18
在线时间
3 小时
发表于 2020-2-21 15:38:44 | 显示全部楼层

我想问一下,为什么我的 Manage Run-Time Environment 界面是空白的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-7 20:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表