中断当初觉得有点麻烦···
不过受够了例程里面那样的延时方法,纯靠经验了,尝试了一下SysTick设置,允许了系统时间中断,这样就就可以准确的设置延迟时间了...
不过对CPU利用率就不好说了,毕竟中断的处理还是很麻烦的一件事情,尽管STM32对中断进行了优化。
Cortex-M3的内核中包含一个SysTick时钟。SysTick 为一个24位递减计数器,每经过1个系统时钟周期,计数值就减1。计数到0时,SysTick计数器自动重装初值并继续计数,同时内部的COUNTFLAG标志会置位,触发中断。
在处理中利用Delay(nTime)延时函数,同时用SysTick作为定时时钟,设定每1ms产生一次中断,在中断处理函数里对nTime--,在函数中循环检测nTime是否为0,不为0则进行循环等待;若为0则关闭SysTick时钟,退出函数。
这样就可以精确实现延时了。
这里还得说STM32的库函数强大....所有的中断处理函数都包含在stm32f10x_it.c文件里,只要配置好中断类型,然后在中断处理函数里相应的函数里面写处理函数就好了。
/*******************************************************
* Function Name : Delay
* Description : 插入延时时间
* Input : nTime: 延时时间以ms为单位
* Output : None
* Return : None
********************************************************/
void Delay(u32 nTime)
{/* 允许SysTick计数 */
SysTick_CounterCmd(SysTick_Counter_Enable);
TimingDelay = nTime;
while(TimingDelay != 0);
/*禁止SysTick计数 */
SysTick_CounterCmd(SysTick_Counter_Disable);
/* SysTick计数清零*/
SysTick_CounterCmd(SysTick_Counter_Clear);
}
/***************************************************
* Function Name : SysTickHandler
* Description : 中断处理
* Input : None
* Output : None
* Return : None
***************************************************/
void SysTickHandler(void)
{TimingDelay--;
}