总结一下STM8L101F3P6工作在16MHz下,利用死循环、中断等不同写法的微秒级延时函数精度的情况。
一、死循环空指令的写法,延时函数程序如下:
/******************************************************************************/
/* Function name: Delay_ms */
/* Descriptions: 毫秒级延时函数函数,16MHz时钟 */
/* input parameters: nCount延时时间 */
/* output parameters: 无 */
/* Returned value: 无 */
/******************************************************************************/
void Delay_ms(unsigned int nCount)
{
uint16_t i=0,j=0;;
for(i=0;i<nCount;i++)
{
for(j=0;j<1142;j++)
{;}
}
}
调用函数如下:
/******************************************************************************/
/* Function name: main */
/* Descriptions: 主函数 */
/* input parameters: 无 */
/* output parameters: 无 */
/* Returned value: 无 */
/******************************************************************************/
main()
{
BoardInit();
enableInterrupts();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
Delay_ms(1);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
Delay_ms(1);
}
}
Delay_ms(10);大约延时9.9835毫秒
Delay_ms(100);大约延时99.74毫秒
Delay_ms(1000);大约延时997.05毫秒
可以看到,这种利用死循环来写的毫秒级的延时,与微秒级的延时来比,相对来说,精度已经提高了不少。但是要知道,这种死循环的延时是与代码量也有关系的,在代码变多的情况下,如果想提高ms级的精度,要适当的调整循环值,并且要用示波器进行观察。这种方法的缺点就不多说了,CPU占用率太高,效率低下,浪费能源。
Delay_ms(1)的波形:
Delay_ms(10)的波形:
Delay_ms(100)的波形:
Delay_ms(1000)的波形: