方式二:简单延时 优点:实现简单,如果是F1系列,HAL_RCC_GetHCLKFreq()获取的值是72000000,此方式经过测试还是比较准的,如果不考虑通用性,F1系列建议使用此种方式。 缺点:只适用F1系列72M主频。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 voiddelay_us(uint32_t us){uint32_t delay=(HAL_RCC_GetH...
具体操作以下行数的形参改为比1000跟小的值,比如1,这样SysTick 1s 中断一次,而延时函数的单位,和最小单位,也成了1s。 代码语言:javascript 代码运行次数:0 运行 AI代码解释 /*Configure the SysTick to have interrupt in 1ms time basis*/HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000U); 这里再简单介...
1. 使用SysTick定时器实现微秒级延时 SysTick是Cortex-M内核自带的24位递减计数器,可以用于实现微秒级延时。以下是一个示例代码: c #include "stm32f4xx_hal.h" void udelay(uint32_t us) { uint32_t ticks = us * (HAL_RCC_GetHCLKFreq() / 1000000); // 计算需要的SysTick滴答数 uint32_t start...
同理HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000) 即 1us 中断一次 为何输入延时时间在HAL_Delay(us-1);处要减1呢?由于进出函数,配置寄存器都需要时间,经过测试大约为1us,故而要减去1 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);重新将中断设为 1ms 中断一次,退出函数 优点:可省下一个硬件...
// HAL_RCC_GetHCLKFreq()/1000 1ms中断一次,即HAL_Delay函数延时基准为1ms// HAL_RCC_GetHCLKFreq()/100000 10us中断一次,即HAL_Delay函数延时基准为10us// HAL_RCC_GetHCLKFreq()/1000000 1us中断一次,即HAL_Delay函数延时基准为1usHAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);// 配置并启动...
方式二:简单延时 优点: 实现简单,如果是F1系列,HAL_RCC_GetHCLKFreq()获取的值是72000000,此方式...
方式二:简单延时 优点:实现简单,如果是F1系列,HAL_RCC_GetHCLKFreq()获取的值是72000000,此方式经过测试还是比较准的,如果不考虑通用性,F1系列建议使用此种方式。 缺点:只适用F1系列72M主频。 void delay_us(uint32_t us) { uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us); ...
#include "delay.h" void delay_us(uint32_t nus) { uint32_t fac_us = HAL_RCC_GetHCLKFreq() / 1000000; uint32_t temp; uint32_t begin; int32_t end; for(; nus > 10; nus -= 10) { temp = 10 * fac_us; begin = SysTick->VAL; end = begin - temp; if(end <= 0) { en...
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);重新将中断设为 1ms 中断一次,退出函数 优点:可省下一个硬件定时器资源,功耗相较于多个硬件定时器使用时较低 缺点:此延时函数不适合在中断、某些RTOS中调用 方法二:传统的for、while循环延时 /*
// HAL_RCC_GetHCLKFreq()/100000 10us中断一次,即HAL_Delay函数延时基准为10us // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次,即HAL_Delay函数延时基准为1us HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000); // 配置并启动系统滴答定时器 ...