使用HAL库,程序一直卡在 HAL_GetTick( ) 函数中(已解决)

1. 原因

STM32 在 while(1) 循环中,调用了 HAL_Delay() 函数,导致程序卡死。

2. 解决方法

 我们重新写一个 Delay() 函数,采用滴答定时器进行延时。将这两个文件加入工程中:

① delay.c

#include  "delay.h"
 
uint8_t fac_us=0;
uint16_t fac_ms=0;
 
void Delay_Init()
{
	//只可以选择不分频或者8分频,这里选择系统时钟8分频,最后频率为9MHZ
	SysTick->CTRL &= ~(1<<2);
	//SystemCoreClock为72000000,最终fac_us为9,也就是记录震动9次。因为频率为9MHZ所以为1us
	fac_us  = SystemCoreClock  / 8000000;  
	fac_ms  = fac_us*1000;  //1000us=1ms
}
 
/*
	CTRL     SysTick控制及状态寄存器
	LOAD     SysTick重装载数值寄存器
	VAL      SysTick当前数值寄存器
*/
void Delay_us(uint32_t nus)
{
	uint32_t temp;
	SysTick->LOAD  =nus*fac_us;   //设置加载的值,比如1us就要计数9次。nus传入1,CALIB=1*9=9,最后就是1us
	SysTick->VAL   =0x00;         //清空计数器中的值,LOAD里的值不是写入后就会加载,而是在systick使能且VAL值为0时才加载
	SysTick->CTRL  |=SysTick_CTRL_ENABLE_Msk;  //使能时钟,开始计时
	do
	{
		temp=SysTick->CTRL;   //查询是否计数完成
	}while((temp&0x01)&&!(temp&(1<<16)));   //先判断定时器是否在运行,再判断是否计数完成
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//关闭计数器
	SysTick->VAL =0X00;      					 //清空计数器	 
}
 
void Delay_ms(uint32_t nms)
{
	uint32_t temp;
	SysTick->LOAD  =nms*fac_ms;   //设置加载的值,比如1us就要计数9次。nus传入1,CALIB=1*9=9,最后就是1us
	SysTick->VAL   =0x00;         //清空计数器中的值,LOAD里的值不是写入后就会加载,而是在systick使能且VAL值为0时才加载
	SysTick->CTRL  |=SysTick_CTRL_ENABLE_Msk;  //使能时钟,开始计时
	do
	{
		temp=SysTick->CTRL;   //查询是否计数完成
	}while((temp&0x01)&&!(temp&(1<<16)));   //先判断定时器是否在运行,再判断是否计数完成
	SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;	//关闭计数器
	SysTick->VAL =0X00;      					 //清空计数器	 
}
 

② delay.h

#ifndef     __delay_H
#define     __delay_H
 
#include "stm32f1xx.h"  // 相当于51单片机中的  #include <reg51.h>
 
void Delay_Init(void);
void Delay_us(uint32_t nus);
void Delay_ms(uint32_t nms);
#endif

 3. 使用注意事项

① 使用之前在 mian.c 中调用 Delay_Init();,必须放在 SystemClock_Config(); 之后。

② 然后就可以使用 Delay_us(uint32_t nus); 和 Delay_ms(uint32_t nms); 函数啦~

若有解决你的问题,点个赞再走呗!

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[3\]的代码,可以看出HAL_GetTick()函数是用来获取系统时钟的函数。它通过返回变量uwTick的值来表示经过的时间。在HAL_Delay()函数,会调用HAL_GetTick()函数来获取当前的系统时钟,并通过比较当前时钟与起始时钟的差值来实现延时功能。根据引用\[2\]的代码,可以看出在延时期间,会不断地调用HAL_GetTick()函数来判断是否达到延时的时间。如果HAL_GetTick()函数死,可能是由于uwTick变量没有被正确更新导致的。这可能是由于uwTick变量没有被正确地增加,或者在增加uwTick变量时发生了错误。为了解决这个问题,可以检查HAL_IncTick()函数的实现,确保uwTick变量被正确地增加。另外,还可以检查系统时钟的配置是否正确,以及时钟断是否正常工作。 #### 引用[.reference_title] - *1* [STM32+Cube MX使用MPU6050 DMP时,在外部调用read_dmp函数发生系统死问题的根本原因分析](https://blog.csdn.net/phmatthaus/article/details/120749696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [关于STM32的HAL库超时函数tick溢出后产生的问题的思考及求证](https://blog.csdn.net/eibo51/article/details/53615060)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [用STM32开发小记及排坑小记](https://blog.csdn.net/qq515973568/article/details/122208017)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值