主题中讨论的其他器件:MSP-EXP430FR2355
工具/软件:Code Composer Studio
大家好、
我将 MSP-EXP430FR2355 LaunchPad开发套件与 Code Composer Studio 版本:8.2.0.00007搭配使用。
我正在尝试将"Timer B0 Interrput "实现为一个高优先级代码执行循环、在 main.c 的正文中有一个低优先级循环 中断的代码示例取自 slac740b 代码集合中的"msp430fr235x_tb0_01.c"。
中断按预期工作、但由于未知原因、从未达到主(低电平)循环。 我尝试在该环路中设置一个断点、以获得任何成功、或者只在相应的输出引脚上放置一个示波器、以查看电平变化、但不会发生任何变化、
提前感谢您的任何帮助。
我的代码:
#include
#include
#define MCLK_FREQ_MHz 8 // MCLK = 8MHz
#define true 1.
#define false 0
void Software_Trim (void); //软件调整可获得最佳 DCOFTRIM 值
void Init_GPIO (void);
//================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 Init_GPIO (空)
{
P1DIR = 0xFF;
P2DIR = 0xFF;
P1REN = 0xFF;
P2REN = 0xFF;
P1OUT = 0x00;
P2OUT = 0x00;
P6DIR = 0xFF;
}
====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
void Software_Trim (void)
{
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);
}
}
否则{ // 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 被锁定
}
====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
/
* main.c
(小部分 /
int main (空)
{
无符号静态字符切换;
无符号长整型 I = 0;
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
/*********
*初始化 DU 时钟 à 8MHZ
( /
_bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_REFOCLK; //将 REFO 设置为 FLL 基准源
CSCTL1 = DCOFTRIMEN_1 | DCOFTRIM0 | DCOFTRIM1 | DCORSEL_3; // DCOFTRIM = 3、DCO 范围= 8MHz
CSCTL2 = FLLD_0 + 243; // DCODIV = 8MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
Software_Trim (); //软件调整可获得最佳 DCOFTRIM 值
CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK; //将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
init_gpio(); //初始化 LES 端口
P1SEL1 |= BIT1; //将 ACLK 引脚设置为第二功能
PMM_unlockLPM5 ();
TB0CCTL0 |= CCIE; //启用 TBCCR0中断
TB0CCR0 = 50000;
TB0CTL |= TBSSEL_SMCLK | MC__Continous; // SMCLK,连续模式
_bis_SR_register (LPM0_bits | GIE); //输入 LPM3、带中断
__no_operation(); //进行调试
//主不可达循环???
while (-1){
i++;
如果(切换){
切换= false;
P6OUT |= BIT6;
}
否则{
P6OUT &=~BIT6;
切换= true;
}
}
}
============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// Timer B0中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = TIMER0_B0_vector
_interrupt void Timer_B (void)
#Elif defined (_GNU_)
void __attribute__((中断(TIMER0_B0_vector)) Timer_B (void)
其他
错误编译器不受支持!
#endif
{
P1OUT ^= BIT0;
TB0CCR0 += 50000; //将偏移添加到 TBCCR0
TB0CTL &= 0xFFE;
}