总结一下STM8L101F3P6工作在16MHz下,利用死循环、中断等不同写法的微秒级延时函数精度的情况。
一、死循环空指令的写法,延时函数程序如下:
[cpp] view plain copy
- /******************************************************************************/
- /* 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++)
- {;}
- }
- }
调用函数如下:
[cpp] view plain copy
- /******************************************************************************/
- /* 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(1);大约延时1毫秒Delay_ms(10);大约延时9.9835毫秒 Delay_ms(100);大约延时99.74毫秒 Delay_ms(1000);大约延时997.05毫秒 可以看到,这种利用死循环来写的毫秒级的延时,与微秒级的延时来比,相对来说,精度已经提高了不少。但是要知道,这种死循环的延时是与代码量也有关系的,在代码变多的情况下,如果想提高ms级的精度,要适当的调整循环值,并且要用示波器进行观察。这种方法的缺点就不多说了,CPU占用率太高,效率低下,浪费能源。
|