请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR2355 我有以下测试程序...我正在使用示波器来测量 PWM 开启的选通时间。 它将由配置为计时器的看门狗进行门控。 它不能正常工作。 我发现、如果我在启用 GIE 后将该行替换为:
WDTCTL =(WDTPW | WDTSSEL_ACLK | WDTTMSEL | WDCTNCL | WDTIS_4);
我得到我想要的预期结果。 但是、我希望做的是按如下方式配置看门狗(也可能添加 WDTHOLD 标志以节省功耗)。 在另一个 ISR 内(此处未显示)、我只需取消暂停并清除计数器(使用 PW)、但没有结果。
我的问题:
在 知道我回读高字节中的0x69后、似乎没有任何方法可以执行按位运算符并在稍后的某个点添加值以进行配置、这是正确的吗? (似乎我不能总是写入完整的寄存器)
2. 是否有办法在应用程序中及早配置、然后稍后复位计数器、如下所示?
#include #include "application.h"#include volatile int wd_entry = 0; int main (void) { struct TimerB s_TB; struct pwm s_tb3_pwm; WDTCTL =(WDTPW | WDTSSEL_ACLK | WDTTMSEL | WDTCNTCL | WDTIS_4); //配置 GPIO P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚 操作 { CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志 SFRIFG1 &=~OFIFG; } while (SFRIFG1和 OFIFG); //测试振荡器故障标志 //禁用 GPIO 上电默认高阻抗模式以激活 //先前配置的端口设置 PM5CTL0 &=~LOCKLPM5; strcpy (s_tb.clksrc、"A"); S_TB.whichTimer = 3; strcpy (s_tb.mode、"U"); S_TB.irqValue = 0; TimerBConfig (&s_TB); s_tb3_pwm.freq = 983;//minimum 983 - 30Hz s_tb3_PWM.rate = 50;//%导通时间(整数) pwmConfig (&s_tb3_PWM); pwmRun (channel_2); _bis_SR_register (GIE); WDTCTL |=(WDTPW | WDTCNTCL); SFRIFG1 &=~WDTIFG; SFRIE1 |= WDTIE;//1秒 _bis_SR_register (LPM3_bits); //进入 LPM3 __no_operation(); //对于调试 } #pragma vector = WDT_vector __interrupt void OneSec_ISR (void) { WD_Entry ++; 如果(wd_entry > 1) { pwmRun (all_off); WD_Entry = 0; // WakeRadio(F); SFRIE1 ~WDTIE; SFRIFG1 &=~WDTIFG; } }