这次主要是想写下时间基准(SysTick),我们在做控制的时候,经常会需要一个时间基准,通常都是通过一个定时器来产生的,而M0的芯片自己已经有一个用于产生时间基准的东西:Systick,这样就可以不浪费定时器。
使用Systick,现在固件库做的让我们使用起来更简单了,只需要SysTick_Config(X)函数就可以了,其中X为定时中断的分频因素(呵呵,暂时就这样叫了),用了这句后,Systick的计数器寄存器就被复位,同时使能了Systick中断并开始使能了Systick计数器。
在手册中,有这样的一句话:SysTick 校准值设置为6000 , 当SysTick 时钟设置为6 MHz (fHCLK/8 的最大值) 时,会产生
1ms 时间基准。所以有如下的初始化产生1ms的定时中断。
void Systick_Init(void)
{
if (SysTick_Config(SystemCoreClock / 1000))//1ms
{
while (1);
}
}
在中断函数stm32f0xx_it.c中,加入下面的函数,进行1ms减1的操作:
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
如果要想比较准确的延时,比如延时N毫秒,新建一个systick.c文件,包含以下函数:
void Delay_ms(int nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
这样就完成了延时N毫秒的程序。
为了验证,我在主程序中加入下面几句:(其中RCC_Configuration(); GPIO_Configuration();在前面的笔记中写过,不详细介绍了。
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
Systick_Init();
while(1)
{
LED0_ON();
Delay_ms(1000);
LED0_OFF();
Delay_ms(1000);
}
}
此时可以看到LED4蓝色发光二极管亮1秒,然后熄灭1秒,如此反复闪烁。
写到这,那么SystemCoreClock 是什么东西呢?
其实在system_stm32f0xx.c中已经有这样的定义:uint32_t SystemCoreClock = 48000000;也就是48MHz
不错,stm比pic缺点就是定时的问题,给调试带来不少的疑虑,比如运行一个子程序耗用了多长时间呢?在MPLAB IDE里显而易见,但IAR里就不行了!