2022年11月26日发(作者:切尔西 汉德勒)利用IAR自带的延时函数__delay_cycles() 写的可调脉冲发生程序
在 IAR 软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:
(1):将以下这段代码复制到你的.C源文件中。
#define CPU_F ((double)8000000)
#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))
复制代码(2):修改
在 #define CPU_F ((double)8000000) 语句里 8000000 修改成你当前MSP430 CPU的主频频率,即CPU的MCLK。
单位为HZ。本例中的8000000为MCLK=8MHZ 的意思。
(3):使用范例
delay_us(1); //1 微秒的延时
delay_ms(1); //1 毫秒的延时
delay_us(3.5); //延时3.5微秒
delay_ms(3.5); //延时3.5毫秒
delay_ms(1000); //延时1秒
*/
#include
#define CPU_F ((double)8000000)
#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))
#define Major_Cycle 1500 //主周期
#define Minor_Cycle 43.5 //小周期
#define H_level 6 //高电平脉冲宽度
#define L_level ( (Minor_Cycle)-(H_level) ) //低电平脉冲宽度
#define Minor_Delay ( L_level )/2
#define Major_Delay ( Major_Cycle -(Minor_Cycle)*8 )
void main(void)
{
unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL
P2DIR |= 0x01; // P2.0 = output direction
P2SEL |= 0x01; // P2.0 = ACLK function
P1DIR |= BIT2 + BIT3; // P1.2 P1.3 = output direction
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to t
}
while ((IFG1 & OFIFG)); // OSCFault flag still t?
BCSCTL2 |= SELM_3; // MCLK = LFXT1 (safe)
P1OUT &= 0xfa; // P1 init 1111 1001
while (1) // Infinate loop
{
for(i=0;i<8;i++)
{
P1OUT |= BIT3;
delay_ms(H_level);
P1OUT ^= BIT3;
delay_ms(Minor_Delay);
P1OUT |= BIT2;
delay_ms(H_level);
P1OUT ^= BIT2;
delay_ms(Minor_Delay);
}
delay_ms(Major_Delay);
}
}