stm32系统时钟触发中断时间设置及延时设置

stm32系统时钟触发中断时间设置

以stm32F407ZE为例

系统定时器中断函数SysTick_Handler

在startup_stm32f40_41xxx.s汇编文件中227行

SysTick_Handler PROC
                EXPORT  SysTick_Handler            [WEAK]
                B       .
                ENDP

如何设置时间呢?
首先了解频率50Hz,时间 t = 1 / f = 1s / 50Hz = 0.02s
系统时钟触发的中断频率为168MHz:1秒的时间内系统时钟进行 168 000 000 次计数
也就是进行 168 000 000 次计数时,时间为 1s
那么进行 168 000 次计数时,时间则为 1ms
以此类推,进行 168 次计数时,时间则为 1μs


//系统时钟触发中断频率设置
//168000000/1000 = 168000,系统定时器进行 168 000 次计数,就代表时间经过 1ms
SysTick_Config(SystemCoreClock/1000);

//168000000/1000000 = 168,系统时钟进行 168 次计数,就代表时间经过 1μs
//SysTick_Config(SystemCoreClock/1000000);

void SysTick_Handler(void)
{
	static uint32_t num = 0;
	num++;
	if(num == 500)     			//计数500次,每次 1ms,共500毫秒
	{
		num = 0;					//计数清零
		void fun(void);			//用户自定义内容
	}
}



延时函数

如何使用延时函数delay准确进行时间计算呢

//以毫秒为单位进行计时
void delay_ms(uint32_t nms)
{
	while(nms--)
	{
		SysTick->CTRL = 0; 		// 关闭系统定时器
	    SysTick->LOAD = 168000; // (根据系统定时器频率设置)配置计数值,计数值就是延时时间1ms,与上部分定时器中的原理相同
		SysTick->VAL = 0; 		// 清空当前计数标志位
	    SysTick->CTRL = 5; 		// 让系统定时器开始工作计数,时钟源为系统定时器,频率为168MHz
	    while ((SysTick->CTRL & 0x00010000)==0);// 等待计数完毕(计数值已经到达0)
	    SysTick->CTRL = 0; 		// 关闭定时器
	} 
 }
	
//以微秒为单位进行计时
void delay_us(uint32_t nus)
{
	while(nus--)
	{
		SysTick->CTRL = 0; 		// 关闭系统定时器
	    SysTick->LOAD = 168*nus; // (根据系统定时器频率设置)配置计数值,计数值就是延时时间1ms,与上部分定时器中的原理相同
		SysTick->VAL = 0; 		// 清空当前计数标志位
	    SysTick->CTRL = 5; 		// 让系统定时器开始工作计数,时钟源为系统定时器,频率为168MHz
	    while ((SysTick->CTRL & 0x00010000)==0);// 等待计数完毕(计数值已经到达0)
	    SysTick->CTRL = 0; 		// 关闭定时器
	} 
 }


你可能感兴趣的:(stm32系统时钟触发中断时间设置及延时设置)