void SysTick_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; }
时间: 2023-07-15 22:12:54 浏览: 139
这是一段使用 SysTick 定时器初始化的代码,用于生成微秒和毫秒级的延时。其中,SYSCLK 是系统时钟频率,fac_us 和 fac_ms 是用于计算微秒和毫秒延时的系数。
在函数中,首先使用 SysTick_CLKSourceConfig 函数设置 SysTick 定时器的时钟源为 HCLK/8,即系统时钟的 1/8。然后,根据系统时钟频率计算出微秒和毫秒延时的系数 fac_us 和 fac_ms。
该函数可能是嵌入式系统中的一部分,用于实现精确的延时控制。
相关问题
void delay_init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择48M时钟 HCLK/8 // SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择8M时钟 HCLK fac_us=SYSCLK/8; //为系统时钟的1/8 fac_ms=(int16_t)fac_us*1000;//每个ms需要的systick时钟数 }
这段代码是用来初始化延时函数的。其中,`SYSCLK` 是系统时钟频率,通过该参数计算出每个微秒需要的 SysTick 时钟数 `fac_us`,以及每个毫秒需要的 SysTick 时钟数 `fac_ms`。在该函数中,通过设置 SysTick 时钟源为 HCLK/8,选择了 48MHz 的时钟源。这个函数的作用是为后面的延时函数提供时钟源。
#include "Delay.h" static u8 fac_us=0;//us static u16 fac_ms=0;//ms void Delay_Rough(int time) { int i,j; for(i=0;i<time;i++) for(j=0;j<time;j++) ; } void Delay_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟,HCLK/8 fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD?24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数计数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//时间加载 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 }
这是一个基于STM32的延时函数库,包括了毫秒级和微秒级的延时函数。其中,Delay_Rough函数是一个粗略的延时函数,用于产生较长时间的延时,如数码管显示等。Delay_Init函数用于初始化延时函数库,包括设置SysTick的时钟源以及计算fac_us和fac_ms的值。delay_ms函数用于产生指定毫秒级的延时,delay_us函数用于产生指定微秒级的延时。这些函数的实现都是基于SysTick定时器来实现的,具有较高的精度和稳定性。
阅读全文