STM32HAL库delay-us函数

本文介绍了如何在STM32中对系统时钟进行8分频初始化,以便使用9MHz计时,随后给出了微妙延时和毫秒延时函数的实现方法,通过实际测试验证了500ms延时功能的正确性。
摘要由CSDN通过智能技术生成

需要对系统时钟进行初始化,时钟树一般不做分频都是72M赫兹工作,那么此处对于延时函数的初始化,对系统时钟进行8分频,使得时钟9M计时。

uint16_t g_fac_us;

void Delay_Init(uint16_t systclk)
{
	SysTick->CTRL=0;
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
	g_fac_us = systclk/8;//9M速度计时
}

下面是微妙延时的函数,由于9Mhz的时钟计时1us需要9次,所以初始化时候计算得到的g_fac_us变量就是为9,因此此处只需要将延时的us数值乘以g_fac_us即可得到延时nus需要的计数值,将其传递给LOAD寄存器进行计时器计数值装载。同时再当前计数值清零0,CTRL的第一位置为1启动计时,计时过程中CTRL最低位时钟为1,等待计时完成则,CTRL第16就为1,进行一个while判断退出计时。然后再关闭时钟计时实能完成计时。

void delay_us(uint32_t nus)
{
	uint32_t temp;
	SysTick->LOAD=nus*g_fac_us;
	SysTick->VAL=0x00;
	SysTick->CTRL|=1<<0;
	do{
		temp = SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));
	SysTick->CTRL&=~(1<<0);
	SysTick->VAL=0x00;
}

接下来的ms延时函数,除了可以使用hal自带的HAL_Delay,我们也可以根据我们编写的us延时函数进行,代码如下。

void delay_ms(uint16_t nms)
{
	uint32_t repeat = nms/1000;
	uint32_t remain = nms%1000;
	while(repeat)
	{
		delay_us(1000*1000);
		repeat--;
	}
	if(remain)
	{
		delay_us(remain*1000);
	}
}

上面代码对于小于1s的可以直接计算,大于一秒的先取整进行一个delay_us(1000*1000),然后再取余进行一个小数位的延时。

使用STLINK连接stm32,将时钟设置为72M。

 

 

 

点击STLINKdebug,首先将延时函数初始化传入参数72,然后调用500ms延时,同时打一个断点,点击运行程序。

观察运行到断点后时候为0.12多,接着跳出延时观察时间

大概为0.62,满足500ms延时,完成了一个延时简单测试。 

 

 

 

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
HC-SR04是一种超声波测距模块,可以通过发送超声波信号并接收回波来测量距离。在使用STM32HAL库进行编程时,可以按照以下步骤进行操作: 1. 首先,需要包含相应的头文件,如"stdio.h"和"HC-SR04.h"。同时,还可以根据需要包含其他相关的头文件。 2. 接下来,需要对串口进行重映射,以便使用printf函数进行数据发送。可以通过重写fputc函数来实现,代码如下所示: ```c int fputc(int ch, FILE *f) { uint8_t temp\[1\] = {ch}; HAL_UART_Transmit(&huart1, temp, 1, 2); //HAL_UART_Transmit(&huart2, temp, 1, 2); return ch; } ``` 这段代码将通过串口1发送数据,如果需要使用其他串口,可以相应地修改代码。 3. 由于需要给HC-SR04模块发送至少10us的高电平信号,而HAL_Delay函数是以毫秒为单位的延时函数,所以需要编写一个微秒级的延时函数。可以使用定时器来实现,代码如下所示: ```c void delay_us(uint16_t us) { __HAL_TIM_SET_COUNTER(&htim2, 0); while(__HAL_TIM_GET_COUNTER(&htim2) < us); } ``` 这段代码使用定时器2来实现微秒级的延时,传入的参数us表示需要延时的微秒数。 4. 最后,在主函数中进行数据读取与打印。可以使用SR04_GetData函数来获取距离数据,并使用printf函数进行打印,代码如下所示: ```c while (1) { SR04_GetData(); printf("\r\n检测距离为:%.2fcm\r\n", distant); HAL_Delay(1500); } ``` 这段代码将循环执行,每次获取距离数据并使用printf函数打印出来,然后延时1.5秒。 以上就是使用STM32HAL库对HC-SR04模块进行操作的一般步骤。具体的实现可能会根据具体的硬件和需求有所不同,需要根据实际情况进行相应的修改和调整。 #### 引用[.reference_title] - *1* *3* [STM32(HAL库)驱动HC-SR04测距模块](https://blog.csdn.net/weixin_44597885/article/details/129231012)[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^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STM32基于HAL库的HC-SR04超声波测距学习](https://blog.csdn.net/qq_61870465/article/details/125572062)[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^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白研究僧学习嵌入式

谢谢您的鼓励,会持续努力滴!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值