总结一下STM8L101F3P6工作在16MHz下,利用死循环、中断等不同写法的微秒级延时函数精度的情况。
一、死循环空指令的写法,延时函数程序如下:
- /******************************************************************************/
- /* Function name: Delay_us */
- /* Descriptions: 微秒级延时函数函数,16MHz时钟 */
- /* input parameters: nCount延时时间 */
- /* output parameters: 无 */
- /* Returned value: 无 */
- /******************************************************************************/
- void Delay_us(unsigned int nCount)
- {
- for (; nCount != 0; nCount--);
- }
调用函数如下:
- /******************************************************************************/
- /* Function name: main */
- /* Descriptions: 主函数 */
- /* input parameters: 无 */
- /* output parameters: 无 */
- /* Returned value: 无 */
- /******************************************************************************/
- main()
- {
- BoardInit();
-
- while(1)
- {
- GPIO_ResetBits(GPIOC,GPIO_Pin_2);
- Delay_us(1);
- GPIO_SetBits(GPIOC,GPIO_Pin_2);
- Delay_us(1);
- }
- }
Delay_us(1)大约延时3.3微秒。 Delay_us(10)大约延时10.58微秒。
Delay_us(100)大约延时83.465微秒。
Delay_us(1000)大约延时8118.5微秒。
可以看到,这种利用死循环来写的微秒级的延时,其精度实在太低,毫无规律可言。根本原因与指令流水、代码量、编译器优化等均有关系,我现在说不清楚,估计一两句也说不清楚。在微秒级的延时函数如此糟糕的精度下,如果利用该函数来模拟如IIC和SPI的时序,或是其它速度较快的通信协议时,其根本无法保证精度,结果可想而知,事必要花一定的时间来调时序,累时,费力,费人。
Delay_us(1)波形如下:
Delay_us(10)波形如下:
Delay_us(100)波形如下:
Delay_us(1000)波形如下:
-------------------------------------------------------------------------------------------------------------------------
|