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.

[参考译文] CCS/MSP430FR5994:请求有关中断初始化的帮助

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/758024/ccs-msp430fr5994-requesting-help-with-initialization-of-interrupts

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

您好!  

我正在输出占空比不断变化的 PWM 信号。 我的代码基于设置一个计时器、该计时器最多可对 PWM 信号的一个周期进行计数、并设置另一个计时器用于占空比。 最终目标是使用 LPF 来求 PWM 的平均值并创建一个正弦波。

我的问题是、我的中断永远不会被触发。 我不知道为什么。 我尝试了几种计时器初始化方法、但运气不好。  如果能为代码提供任何帮助、我将不胜感激。 如果有人能给我指出这个项目的正确方向、我也会很高兴。  

#include 

#include 



/**
* main.c
*

/ unsigned char 计数器; //波形数组中的当前位置
unsigned char wave[32]={ //波形,预设为正弦值
128、140、152、164、173、 181、187、191、
192、191、187、181、173、 164、152、140、
128、116、104、92、83、 75、69、65、
64、65、69、75、83、 92、104、116};

无符号 int i; //用于'for'循环。

void main (void)
{

WDTCTL = WDTPW | WDTHOLD; //停止 WDT
PM5CTL0 &=~LOCKLPM5;
P8DIR |= BIT0;// P1.0输出
P1DIR |= BIT0;
计数器= 0; //重置计数器
P8OUT=0x0001;
//初始化计时器
TA0CCTL0 |= CCIE;//启用定时器上的中断
TA0CCTL1 |= CCIE;//启用 CCR1中断
TA0CCR0 = 256; //将 PWM 周期设置为256个时钟周期
TA0CCR1 = wave[计数器]; //设置第一个占空比值
TA0CTL = tassel_1 |TAIE| MC_1 | TACLR;// SMCLK、upmode、启用中断、清除 TA1R
P8OUT=0x0001;
P1OUT=0x0001;
P1OUT=0x000;
//printf ("使用 init\n"done);
_BIS_SR (LPM0_Bits + GIE);//输入 LPM0带中断

}

//**
* TimerA0中断服务例程
**/
#pragma vector=TIMER0_A0_vector
__interrupt void Timer_A0 (void)
{
P8OUT |= BIT0; //设置 P1.0
P1OUT=0x0001;
TA0CCR1 = wave[计数器]; //设置下一个占空比值
计数器+= 1; //将偏移添加到 CCR0
如果(计数器==32) //如果计数器位于数组的末尾
{
计数器= 0; //重置计数
器}
}

/**
* TimerA1中断向量(TAIV)处理程序
**/
#pragma vector=Timer1_A1_vector
__interrupt void Timer_A1 (void)
{

switch (TAIV)
{
案例2: // CCR1中断
P8OUT &=~BIT0; //清除 P1.0以确定占空比。
中断;
默认值:
中断;
}

}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您现在的问题是:
    >#pragma vector=Timer1_A1_vector
    这是 TA1CCR1、而不是 TA0CCR1的向量。 我怀疑您的意思是:
    >#pragma vector=TIMER0_A1_vector
    --------------
    这将是您的下一个问题:
    > switch (TAIV)
    TAIV 是一个常量(右键单击名称并"转到定义")。 尝试:
    > switch (TA0IV)
    --------------
    未经请求:
    > TA0CTL = tassel_1 |TAIE| MC_1 | TACLR;// SMCLK、upmode、启用中断、清除 TA1R
    1) 1)这会启用 TAIE、但您不会使用它执行任何操作(您不需要它)。 它不会伤害您、但会生成多余的中断。
    2) 2) tassel_1是 ACLK、而不是 SMCLK。 如果这是您想要的、没关系、但 tassel_2是 SMCLK。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也是主动的:这对于软件 PWM 来说是可以的、但是如果您希望硬件生成信号(在 P1.0上)、您应该添加:
    根据数据表(SLASE54B)表6-20、> P1SEL0 |= BIT0;// P1.0作为 TA0.1
    > TA0CCTL1 |= OUTMOD_7;//对同相 PWM 进行复位/置位