当前位置: 代码迷 >> 综合 >> 【MSP430】关于MSP430的精准延时__delay_cycles的分析
  详细解决方案

【MSP430】关于MSP430的精准延时__delay_cycles的分析

热度:80   发布时间:2024-02-23 03:53:43.0

首先我们先看以下代码:

#define CPU_F ((double)8000000) //CPU_F代表系统选用的主时钟大小,单位Hz 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 

分析上述代码:
??一、8000000为MSP430板载的外部高速晶振提供的8MHz的主时钟频率,单位为Hz

??二、__delay_cycles是编译器提供的一个内联的精准延时函数,该函数的原型是:

 __intrinsic void __delay_cycles(unsigned long __cycles)//__cycles是CPU运行周期的个数,即时钟/机器周期的个数

分析
1、在MSP430单片机中,一个时钟周期 = MCLK晶振的倒数
?例如:如果MCLK是8MHz,则一个时钟周期为1/8us

2、MSP430的时钟模块主要包括:
?ACLK --> 辅助时钟
?MCLK --> 主时钟
?SMCLK --> 子系统时钟

3、时钟的来源:
?ACLK --> 是LFXT1CLK信号经1/2/4/8分频后得到的,主要用作低速外围的时钟
?MCLK --> 是LFXT1CLK,XT2CLK, DCOCLK的三者之一决定,由软件选择,然后经1/2/4/8分频后得到,主要用于CPU和系统
?SMCLK --> 可由LFXT1CLK和DCOCLK ,或者XT2CLK和DCOCLK决定,然后经1/2/4/8分频后得到,主要用于高速外围模块

4、注意:
?上文陈述的代码中,8000000是已经由系统选定的MCLK时钟(8MHz),不可以直接通过改变它的值来实现对不同主频系统参数的统一,即它的值受主时钟频率的改变而改变,而非MCLK频率受它的值的改变而改变。
?举个例子:
??当系统时钟为1MHz时,改为 --> ? #define CPU_F ((double)1000000)