您好!
我正在尝试使用 MSP430FR2355开发板的一些东西。 我尝试获取1ms 计时器中断、但无法找到计数值。
如何计算1ms 计数器值。
这是我的时钟设置。
[代码]
#include
#include
#define MCLK_FREQ_MHz 16 // MCLK = 16MHz
void Software_Trim (){
unsigned int oldDcotTap = 0xFFFF;
unsigned int newDcoTap = 0xFFFF;
unsigned int newDcoDelta = 0xFFFF;
unsigned int bestDcoDelta = 0xFFFF;
unsigned int csCtl0Copy = 0;
unsigned int csCtl1Copy = 0;
无符号 int csCtl0Read = 0;
无符号 int csCtl1Read = 0;
unsigned int dcoFreqTrim = 3;
unsigned char endLoop = 0;
执行{
CSCTL0 = 0x100;// DCO 抽头= 256
执行{
CSCTL7 &=~DCOFFG;//清除 DCO 故障标志
}
while (CSCTL7 & DCOFFG);//测试 DCO 故障标志
__DELAY_CYCLLES ((unsigned int) 3000 * MCLK_FREQ_MHz);//等待 FLL 锁定状态(FLLUNLOCK)保持稳定
//建议等待24个经过分频的 FLL 参考时钟周期
while (((CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)))&(((CSCTL7 & DCOFFG)= 0))
;
CSCCtl0Read = CSCTL0;//读取 CSCTL0
CSCCtl1Read = CSCTL1;//读取 CSCTL1
oldDcoTap = newDcoTap;//记录上次的 DCOTAP 值
newDcoTap = csCtl0Read & 0x01ff;//这次获得 DCOTAP 值
DcoFreqTrim =(csCtl1Read & 0x0070)>> 4;//获取 DCOFTRIM 值
IF (newDcoTap < 256)// DCOTAP < 256
{
newDcoDelta = 256 - newDcoTap;// DCPTAP 和256之间的增量值
if ((oldDcotap!= 0xFFFF)&&(oldDcotap >= 256)// DCOTAP 交叉256
endLoop = 1;//停止 while 循环
否则{
dcoFreqTrim --;
CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim << 4);
}
}
else // DCOTAP >= 256
{
newDcoDelta = newDcoTap - 256;// DCPTAP 和256之间的增量值
IF (oldDcoTap < 256)// DCOTAP 交叉256
endLoop = 1;//停止 while 循环
否则{
dcoFreqTrim++;
CSCTL1 =(csCtl1Read &(~DCOFTRIM))|(dcoFreqTrim << 4);
}
}
if (newDcoDelta < bestDcoDelta)//记录最接近256的 DCOTAP
{
csCtl0Copy = csCtl0Read;
csCtl1Copy = csCtl1Read;
bestDcoDelta = newDcoDelta;
}
}
while (endLoop = 0);//轮询直到 endLoop = 1
CSCTL0 = csCtl0Copy;//重新加载锁定的 DCOTAP
CSCTL1 = csCtl1Copy;//重新加载锁定的 DCOFTRIM
while (CSCTL7和(FLLUNLOCK0 | FLLUNLOCK1))
;//轮询直到 FLL 锁定
}
void init_CS (void){
//根据 MCLK 的器件数据表的要求配置一个 FRAM 等待状态
//在配置时钟系统之前在8MHz 以上运行。
FRCTL0 = FRCTLPW | NWAITS_1;
_bis_SR_register (SCG0);//禁用 FLL
CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_5;// DCOFTRIM = 5、DCO 范围= 16MHz
CSCTL2 = FLLD_0 + 487;// DCOCLKDIV = 16MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0);//启用 FLL
Software_Trim ();//软件调整可获得最佳 DCOFTRIM 值
CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
//默认 DCOCLKDIV 为 MCLK 和 SMCLK 源
}
void timer_b (void){
Timer_B_initContinuousModeParam ={0};
param.clockSource = timer_B_CLOCKSOURCE_SMCLK;
param.clockSourceDivider = timer_B_CLOCKSOURCE_divider;
param.timerInterruptEnable_TBIE = Timer_B_TBIE_INTERRUPT_ENABLE;
param.startTimer = true;
param.timerClear = timer_B_skip_clear;
Timer_B_initContinuousMode (timer_B1_base、¶m);
}
int main (void){
WDT_A_HOLD (WDT_A_base);
init_CS();
Timer_b ();
//配置 GPIO
P1DIR |= BIT0;//将引脚设置为输出
P1OUT |= BIT0;
PM5CTL0 &=~LOCKLPM5;
_bis_SR_register (LPM3_bits | GIE);//输入 LPM3、中断被启用
__no_operation();//用于调试器
while (1){
}
}
//
//
//这是计时器 B0中断矢量服务例程。
//
//
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_B0_VECTOR
_interrupt
#Elif defined (_GNU_)
__attribute__((interrupt (TIMER0_B0_vector)))
#endif
void TIMER0_B0_ISR (void){
P1OUT ^= BIT0;
}
[/代码]