我现在用定时器已经可以产生2ms的方波。
我想产生方波周期为2us。但是从示波器上只能是方波的周期是10.70us
IDE:IAR 5.3
/******************************************************************
* 实验名称:定时计数器A 的简单应用-10ms 计时器 (MSP430F149)* * 实验说明:
* 通设置系统主时钟(MCLK=8Mhz ) 、辅助时钟(ACLK=8Mhz )、
* 子系统时钟(SMCLK=8Mhz )
* 编译软件:Embedded Workbench 5.3
*
*
*
*
******************************************************************/
#include <MSP430x14x.h>
#define uchar unsigned char
#define uint unsigned int
#define CNT (65536-1) //计数
void Init_Timer_A(void)
{
CCTL0 = CCIE; // 使能CCR0 中断
TAR=CNT; // 计数装入初值
TACTL=TASSEL_2+MC_2+TAIE+ID_3;//设置时钟源和计数模式 采用SMCLK/8 =1Mhz
}
void Init_Clock(void)
{
unsigned char i;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
/*——选择系统主时钟为8MHz——-*/
BCSCTL1 &= ~XT2OFF; // 打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i–); // 等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); // 晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //主时钟和从时钟都选择高频晶振 MCLK = SMCLK = XT2
}
void main(void)
{
WDTCTL=WDTPW + WDTHOLD; // 关闭看门狗
P2DIR |= BIT5;
Init_Clock();
Init_Timer_A();
_BIS_SR(LPM0_bits+ GIE);//进入低功耗睡眠模式
while(1)
{
}
}
#pragma vector=TIMERA0_VECTOR //定时器A 中断服务程序
__interrupt void Timer_a(void){ switch(TAIV) //TAIV 表示中断向量号 { case 2:break; case 4:break; case 10: //TAIV=10 表示中断计数器溢出中断 TAR=CNT;// (65536-1) P2OUT ^= BIT5;
}
LPM0_EXIT;
}
Maka Luo:
可以,用CCP0作为设置占空比计数器,CCP1作为周期计数器。
Lina Lian:
Yukun Wang,
你看到的现象是正常的,你是在定时器中断里进行的IO口状态翻转,就需要考虑进入中断和推出中断的时间,和你所定时时间相比而言,是否可以比拟。中断现场保护和恢复时间:6+5 CPU Cycles,再加上你设置IO和中断中其他处理的时间。你可以算算比例。另外如果想要产生方波或PWM,建议时刻使用OUT_MODE设置,直接输出PWM波。
希望对你有帮助!O(∩_∩)O~