在stm32的3.5库里,systick的函数变得只剩下两个了:
SysTick_Config(SystemCoreClock);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
其中,第一个函数的变量是整数,查秒用的,第二个是选择时钟来源的。
一定要先调用第一个函数,再调用第二个函数。
但是先说第二个函数,有两个输入值:
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
第一个代表直接采用系统时钟,第二表示采用系统时钟除以8。
比如我用这么一段代码配置主时钟为最高72MHz:
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08);
}
}
再采用第一个输入值SysTick_CLKSource_HCLK,则第一个函数内输入72000000就是定时1s,输入72000000/1000就是1ms。
如果具体使用systick,先写初始化的函数:
void Init_SysTick(void)
{ if(SysTick_Config(SystemCoreClock / 1000))
while(1);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
}
然后再写定时的函数:
__IO uint32_t TimingDelay;
void delay_ms(__IO uint32_t nTime)
{
TimingDelay = nTime; while(TimingDelay != 0);
}
以上两个放在main里面
然后去stm32f10x_it.c里面,把SysTick_Handler()改了
extern __IO uint32_t TimingDelay;
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{ TimingDelay--; }
}
之后在主程序里调用
delay_ms(1000);
就达到了延时1s的效果了。