This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR2355:1 Ms 计时器计数计算

Guru**** 2387080 points
Other Parts Discussed in Thread: MSP430FR2355
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1181360/msp430fr2355-1-ms-timer-count-calculation

器件型号:MSP430FR2355

您好!

我正在尝试使用 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、&param);

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;

[/代码]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    使用16MHz 时钟(SMCLK)时、1ms 为16000个周期。

    Timer_B_initContinuousMode (timer_B1_base、&param);

    可以使用连续模式构造1ms 中断、但这是很长的路要走。 使用 Timer_B_initUpMode()可能更简单。  

     Timer_B_TBIE_INTERRUPT_ENABLE  调用 TIMER0_B1_VECTOR。 您可能需要替代 TIMER_B_CCIE_CCR0_INTERRUPT_ENABLE 。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    注意到了 OK。