STM32内核中有一个系统定时器,它是一个24位递减计数器。工作原理是系统时基定时器设定初值并使能后,每经过1个系统时钟周期,计数值就减,当计数值减到0时,系统定时器会重新自动重装初值,并继续下一次计数,同时内部的COUNTFLAG标志位会置位。触发中断。 在很早的固件库中,提供了很多函数,来对SysTick进行设置,但是到了3.5版本的标准固件库中,移除了相关驱动函数,用户必须调用CMSIS 定义的函数,其中CMSIS只提供了一个Systick设置的函数,替代了STM32原来有的所有的驱动函数,这样做的目的,可能是简化Systick 的设置,可是降低了用户对SysTick的可控性。 在CMSIS中提供的函数是 SysTick_Config(uint32_t ticks); 该函数设置了自动重载入计数器(LOAD)的值,SysTick IRQ的优先级,复位了计数器(VAL)的值,开始计数并打开SysTick IRQ中断。SysTick时钟默认使用系统时钟。 其中这个函数定义在Core_cm3.h中 ,源代码如下所示: static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* 设置初值*/ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设置中断优先级*/ SysTick->VAL = 0; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* 使能Systick中断,和Systick 定时器*/ return (0);
} 从上面的函数中可以看出,这个函数把Systick的初值,中断优先级,使能中断,开启定时器都完成了。大大简化了程序。 其中ticks 代表的是初值。例如系统时钟是72Mhz 那么要产生1ms的时基,那么我们可以这样去写。 SysTick_Config(SystemCoreClock/1000); 当然也可以写成:SysTick_Config(72000); 了解了这些,我们可以用它来做一个简单的延时函数delay_ms(u16 time); 代码如下: void delay_ms(u16 time) { nTime=time ; /nTime 是个全局变量 可设 extern u16 nTime;/ while(nTime); } 在 中断函数中直接 加入nTime--; 在主函数 初始化过程中 加入 SysTick_Config(72000);
二、利用库函数和中断实现延时
/**在Systick的控制下, PB.5每1ms闪烁一次 SysTick被配置为1ms一次中断。 */ /***主函数***/ #include "stm32f10x.h" __IO uint32_t TimingDelay; void GPIO_Configuration(void); void Delay(__IO uint32_t nTime); int main(void) { GPIO_Configuration(); while (SysTick_Config(72000)); /* 设置SysTick定时器产生1ms中断 */ //设置的值小于0x00FFFFFF就继续往下执行... while (1) { GPIO_SetBits(GPIOB, GPIO_Pin_5); Delay(1); //延时1ms GPIO_ResetBits(GPIOB, GPIO_Pin_5); Delay(1); //延时1ms } } void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } /* 功能:延时nTime个ms. */ void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay); } /***stm32f10x_it.c***/ #include "stm32f10x_it.h" extern __IO uint32_t TimingDelay; void SysTick_Handler(void) { TimingDelay--; }
上一篇:STM32端口时钟
下一篇:STM32中的结构体是如何组织同类寄存器的
推荐阅读最新更新时间:2024-03-16 15:15