自从有了STM32我觉得最方便的就是这个函数啦!!!
比如:我们以前延时函数总是用for循环,准不准另码说,总觉得有点“胡弄”。现在好了,准确无误。
该函数有几点注意:
1.
1.该函数是CMSIC函数,就是娘胎里自带,可以延时从US到MS甚至S
函数直接调用SysTick_Config()函数配置。
2.
可以配置分频,要分频可以调函数SysTick_CLKSourceConfig(),在stm32f0xx_misc.c
3.
它的优先级在SysTick_Config()函数中被调用,对编程者来说这些都不用管
4.
编程者只要管
重装值 = SysTick 定时频率(HZ) * 想要延时的时间
以下是实例:
对STM32的时钟我想不必太深究,为什么呢,就是外部时钟,原因很简单,保证时钟准确无误给后边串口,SPI,I2C
有个时钟准确的保证。在这样的前提下,我想不用过多考虑时钟用什么不用什么,就是外部时钟
这个定义在
在system_stm32f0xx.c 文件中
#define PLL_SOURCE_HSI // HSI (~8MHz) used to clock the PLL, and the PLL is used as system clock source
有看官会问,我做系统也用外部么,我的答案是的,且代码都不用改^_^
然后是真证的实现
#if defined (PLL_SOURCE_HSI)
/* At this stage the HSI is already enabled */
/* Enable Prefetch Buffer and set Flash Latency */
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
/* HCLK = SYSCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
/* PCLK = HCLK */
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;
/* PLL configuration = (HSI/2) * 12 = ~48 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL12);
/* Enable PLL */
RCC->CR |= RCC_CR_PLLON;
/* Wait till PLL is ready */
while((RCC->CR & RCC_CR_PLLRDY) == 0)
{
}
/* Select PLL as system clock source */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;
/* Wait till PLL is used as system clock source */
while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
{
}
最后为了编程定义一个宏
uint32_t SystemCoreClock = 48000000;
实现起来方便很只要定义两个函数
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
在中断文件:stm32F0xx_it.c声明一下
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
即可,至于更大时间延时,用户可在此自行编写。这个延时是毫秒级。也可微秒级,秒级
以下是图片
[
本帖最后由 ddllxxrr 于 2013-11-21 17:38 编辑 ]