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.
工具/软件:Code Composer Studio
为了更好地学习如何编程MSP430系列微控制器,我首先使用MSP430FR2000跳进了一个辅助项目。 目标是制作模仿火车喇叭的音乐合唱(出于愚蠢的原因)。 最后一条电路将由电池供电,以便我将其连接到预定丢弃的寻呼扬声器。
要生成声音,我正在使用Timer_B (微控制器上唯一的计时器)生成三个不同的频率。 我按照TI应用手册 SLAA513A的说明 生成了三种不同的频率。 我有一个按钮连接到了WFP 1.1 上,它会产生一个中断来启动Timer_B和频率生成,直到Timer_B溢出,这时声音就会关闭。 频率是在IO针脚上生成的,即:WFP 1.5 到WFP 1.7。 现在,我在WFP 1.0 上安装了一个LED指示灯,用于指示何时产生声音进行调试。
令人惊讶的是,我很快就得到了代码的频率生成部分。 我遇到问题的原因是我使用eCOMP来监控电池电压。 最终电路将使电池电压连接到分压器,分压器的输出连接到MSP430上的IO引脚WFP 1.2。 这是比较器V+的C2输入。 比较器的V-连接到内部电压参考引用的内部DAC。 比较器的输出连接到IO针脚WFP LED/cout,当电池电压达到一定水平时,此针脚将点亮2.0 指示灯。
我无法获得比较器的输出来点亮LED。 调试过程中,我使用连接到GND和3.3V的电线设置了WFP 1.2 ,但比较器不会切换。 在调试模式下使用CCS,我可以在CPCTL1寄存器中看到CPOUT切换,但似乎不能切换WFP 2.0。 当WFP 2.0 1.2 连接到GND时,我可以使用DMM测量在WFP上的~10mV的小幅增加。 另外,当WFP 1.2 连接到GND (即CPOUT为1)时,在WFP 1.6 和1.7 上不生成频率。
使用相同的电路设置,我修改了TI示例msp430fr211x_eCOMP_01.c ,其设置与我的代码相同,并且可以使比较器工作(Timer_B未在使用中)。
使用比较器和Timer_B似乎存在问题 是否有一个我忽略的寄存器设置将两者连接在一起? 在 用户指南 中,图17-1显示比较器有一个输出至计时器CPTM ,但搜索CPTM的pdf显示这是唯一提及CPTM的内容。 这是否意味着比较器的输出连接到Timer_B?
我希望这是我明显忽略的。 如有任何帮助,我们将不胜感激。 谢谢。
//************************************************************************************************
// MSP430FR2000 -火车喇叭
////
说明:仅使用TimerB在多个频率上切换引脚,
//出于愚蠢的原因模拟火车喇叭。
//使用CRR0和软件切换WFP 1.5。 使用1.1
上的CCR1和CCR2 //按钮进行的WFP 1.6 和WFP 1.7 切换功能可以生成频率,直到TimerB溢出
// eCOMP为止,以监控Vbat (当前未设置,仅限测试模式)
////
aclk = TBCLK =3.2768万Hz, MCLK = SMCLK =默认DCODIV ~1MHz
// WFP 1.5 = CCR0 ~ 32KHz (2*66)=~248.24Hz ->目标频率:246.94Hz (B3)
// WFP 1.6 = CCR1 ~ 32KHz /(2*53)=~309.13Hz ->目标频率:311.13Hz (B3)// 1.7
~ 44Hz (044Hz)/ 0 (0 Hz)=~44Hz
MSP430FR2000
// --------
// /|\\| WFP 1.0 (电位计)|-->计时器状态指示灯
// || WFP 1.1 NAME|<--按钮至GND//
|| WFP 1.2 CO2/C2|<-- V+ eCOMP输入
// || WFP 1.5
|-->~248.24Hz
// --|RST 1.6 (高分辨率)/TB 0.1 (高分辨率)|-->~309.13Hz
// | WFP 1.7 ()/TB 0.2 (速度控制器)|-->~442.81Hz
// | ESCOP/cout |--> 2.0 eCOMP状态
//////
TimerB多频基于TI应用手册SLAA513A和随附代码
//**********************************************************************************************
#include <MSP430-h>
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止WDT
//配置重置
SFRRPCR || SYSRSTRE | SYSRSTUP; //在复位引脚上启用内部上拉电阻
//配置比较器输入和输出
P1SEL0 |= BIT2; //选择eCOMP输入功能:1.2
P1SEL1 |= BIT2;
P2DIR || BIT0; //在2.0 上选择CPOUT功能
P2SEL1 || BIT0;
//配置中断按钮
P1IES |= BIT1; //在高到低转换时播放按钮中断
P1REN |= BIT1; //启用电阻器,必须将P1OUT设置为上拉
P1OUT || BIT1;
//配置Timer_B输出
P1SEL1 || BIT6 | BIT7; //选择0.1 TB和0.2 WFP功能,用于1.6 和WFP 1.7
P1DIR || BIT0 | BIT5 | BIT6 | BIT7; // WFP 1.0 ,WFP 1.5 ,WFP 1.6 和WFP 1.7 输出
P1OUT &=~BIT0; //关闭WFP 1.0 上的LED
//配置未使用的GPIO
P1DIR || BIT3 | BIT4;
P2DIR || BIT1 | BIT6 | BIT7;
PM5CTL0 &=~LOCKLPM2; //禁用GPIO开机默认高阻抗模式以激活
//以前配置的端口设置
//配置参考
PMMCTL0_H = PMMPW_H; //解锁PMM寄存器
PMMCTL2 |= INTREFEN; //启用内部参考
while (!(PMMCTL2 & REFGENRDY)); //轮询直至内部参考值确定
//设置eCOMP
CPCTL0 |= CPPSEL1; //选择C2作为V+端子的输入
CPCTL0 |= CPNSEL1 | CPNSEL2; //选择DAC作为V端子的输入
CPCTL0 |= CPPEN | CPNEN; //启用eCOMP输入
CPDACCTL || CPDACREFS | CPDACEN; //选择片上VREF并启用DAC
CPDACDATA |= 0x0020; // CPDACBUF1=片上VREF *32/64=0.75V
CPCTL1 |= CPEN | CPMSEL | CPINV; //在低功率模式下打开eCOMP,反向输出*/
P1IFG = 0; //清除所有挂起的中断
P1IE = BIT1; //在WFP 1.1 上启用中断
用于(;;){
__bis_sr_register (LPM3_bits | GIE); //输入LPM3,启用中断
__no_operation(); //用于调试
}
}//
Port1中断向量处理程序
#pragma vector=Port1_vector
__interrupt void Port1_ISR(void)
{
P1IE = 0; //禁用任何进一步的中断
P1OUT ^= BIT0; //将WFP 1.0 LED切换为timer_b状态
//设置时间B
TB0CCTL0 = OUTMOD_4 + CCIE; // TBCCR0切换,中断已启用
TB0CCTL1 = OUTMOD_4 + CCIE; // TBCCR1切换,中断已启用
TB0CCTL2 = OUTMOD_4 + CCIE; // TBCCR2切换,中断已启用
TB0CTL = TBSSEL_1 | MC_2 | TBCLR | TBIE;// ACLK,连续模式,清除TBR,启用中断
}//
Timer0_B3中断向量(TBIV)处理程序
#pragma vector=TIMER0_B0_vector
__interrupt void TIMER0_B0_ISR(void){
TBCCR0 +=66;
P1OUT ^= BIT5; //在WFP 1.5 上生成~248.24Hz频率
}//
Timer0_B3中断向量(TBIV)处理程序
#pragma vector=TIMER0_B1_Vector
__interrupt void TIMER0_B1_ISR(void){
Switch(__偶 数_in_range(TB0IV,TB0IV_TBIFG))
{
案例TB0IV_NONE:
中断; //不中断
案例TB0IV_TBCCR1: // CCR1
TBCCR1 +=53; //~在WFP 1.6 上产生309.13Hz频率
中断;
案例TB0IV_TBCCR2: // CCR2
TBCCR2 +=37; //在WFP 1.7 上产生~442.81Hz的富热
中断;
案例TB0IV_TBIFG: //溢出
P1OUT ^= BIT0; //将WFP 1.0 LED切换为timer_b状态
TB0CTL &=~(MC_2); //禁用Timer_B
TB0CCTL0 = 0; //禁用CCR0,CCR1,CCR2
TB0CCTL1 = 0;
TB0CCTL2 = 0;
P1OUT &=~(BIT5 | BIT6 | BIT7);//将引脚设置为低电平,因为它们在中断期间可能较高
//再次启用播放按钮
P1IFG = 0; //确认所有中断
P1IE = BIT1; //在WFP 1.1 上启用中断
中断;
默认:
中断;
}
}
您好,Mitch,
感谢您的回复。
1.我不完全确定如何在CPOUT上设置断点,因为它是寄存器,所以我设置了ISR并在其中设置了断点。
下面是我在switch语句第87行设置了断点的ISR。
// eCOMP中断向量处理程序 #pragma vector=ECOMP0_vector __interrupt void ECOMP_ISR(void) { Switch(__偶 数_in_range(CPIV, CPIV__CPIIFG)) { 案例CPIV__none: 中断; 案例CPIV__CPIFG: 中断; CASE CPIV__CPIIFG: 中断; 默认: 中断; } }
我将比较器设置为在下降边缘中断。 我用与1.2 Vcc绑定的WFP启动调试模式。 当我接地到WFP 1.2 时,我按预期的方式碰到了断点,我按了RESUME (恢复),程序就会继续运行,而不会再碰到断点。 从中断断点恢复后,查看注册查看窗口CPOUT保持切换状态。 (我必须暂停程序才能正确刷新寄存器)。 我确实对ISR进行了一些操作,并且能够使用ISR内的软件切换器来切换引脚,但我想使用硬件来切换WFP 2.0 ,就像我基于比较器设置代码的示例程序一样。 如有必要,我可以使用软件切换。
2.下面是LED电路的示意图。
您好,Luis,
这似乎成功了。 我把下面一行放在我最初发布的代码第57行之前。
SYSCFG2 |= TB0TRGSEL;
感谢你的帮助。
编辑:
忘记说我去检查了,当WFP 1.2 接地时,我也得到了频率生成。 这解决了我所有的问题。 再次感谢。