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/MSP430FR5969:如何加快 ISR 的速度?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/565077/ccs-msp430fr5969-how-to-make-an-isr-quicker

器件型号:MSP430FR5969

工具/软件:Code Composer Studio

您好!

我叫 Trujillo、我来自西班牙。 首先,我对我可能会犯的任何英文书写错误表示歉意。

实际上、我使用的是 MSP430FR5969、我尝试从计时器 A 中断生成 PWM 信号(计时器 B)(在可闻频率范围内)。 我发现的问题是来自 Timer B 的 PWM 信号显示正确、但我需要来自 Timer A 的 PWM 保持工作。 最后一点不会发生。 ISR 似乎有很多工作要做、CPU 处理速度无法达到我所需的速度。 这是守则,如果有人能帮助我,我将会非常感激。

#include 
#include 
unsigned int mostra (void);
unsigned int valor=0;
unsigned long resultats=0.0;
unsigned int vector[48]={0};
unsigned int puntero=0;
unsigned long Mitja=0.0;

//
* main.c
*
/ int main (void){

WDTCTL = WDTPW | WDTHOLD; //停止 WDT

//配置 GPIO -------------------------------------------------------
//

P1DIR |= BIT2;
P1SEL0 |= BIT2;

P1DIR |= BI5;
P1SEL0 &=~BI5;

P1DIR = 0x10;
P1SEL0 = 0x10;

P4SEL0 |= BIT4;
P4SEL1 |= BIT4;


//禁用 GPIO 上电默认高阻抗模式,以激活
//先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;


//--- ////
configuración de los clocks
//------------------------------------------------------- //
CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_6;
CSCTL2 = SELA_VLOCLK | SELS__DCOCLK | SELM_DCOCLK;
CSCTL3 = DIVA_8 | DIVS_8 | DIVM__1;
CSCTL0_H = 0;
//----------------- /////// configuración
ó n del ADC12
//--------------- //

ADC12CTL0 = ADC12SHT1_0 | ADC12ON;
ADC12CTL1 = ADC12SHP | ADC12SSEL_3 | ADC12PDIV_1 | ADC12CONSEQ_0;
ADC12CTL2 =ADC12RES_2;
ADC12CTL3 = ADC12C12PDIV_1 | ADC12CONSEQ0;ADC12CTL2 =ADC12TRC12TAC10
= ADC12MCTR_ADC12TAC0;ADC12TALL_ADC12TAC10;ADC12TRC12TACTR

///---------------------------------------------------------- /////// configuración
de la Señal PWM Principal
//--------------- //
TA1CTL = tassel_SMCLK | MC__UP | TACLR;
TA1CCR0 = 2325-1;
TA1CCTL1 = OUTMOD_7;
TA1CCR1 = 1850;
TA1CCTL2 = CCIE;
TA1CCR2 = 1965年;
//----------------- //


__bis_SR_register (LPM0_bits+GIE);//输入 LPM0 y generamos la ISR


while (1){};
}//------
ISR -------------------------------------------------------------- //
#pragma vector=Timer1_A1_vector // INTERRUPCIÓN EN Timer1:TA1.1
__interrupt void Temp (void)
{
switch (TA1IV)
{
case 4:// interrupción en TA1CCR2


mistra();
int i;
vector[puntero]=mustra();
if (puntero=47){
puntero=0;
for (i=0;i<48;i++){
Mitja=Mitja+vector[i];
}

tattat=Mitja/48;
if (resultat<<205){
resultat=205.0;
}
//--- configuración de la Señal PWM de salida de audio para localización -------- //

TB0CTL = TBSSEL_SMCLK | MC__UP | CNTL_1 | TBCLR;
TB0CCTL1 = OUTMOD_7;
TB0CCR0 =(409600/结果)-1;
TB0CCR1 = TB0CCR0/2;
Mitja=0;
resulttat=0.0;

}
否则
为 puntero++;

break;
}
TA1CTL &&~TAIFG;
}
//------ ADC12------------------------------------------------------- //
unsigned int motra (void)
{

ADC12MEM10=0;
ADC12CTL0 |= ADC12ENC | ADC12SC;
while (((ADC12CTL0&ADC12SC)=ADC12SC){};
valor=ADC12MEM10;
ADC12CTL0 &=~ADC12ENC;
return valor;

} 

非常感谢!

Trujillo

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

    您的主时钟频率当前为8MHz、您可以将其提高到16MHz 以更快地为 ISR 提供服务。 但主要问题是、ISR 内部的运行情况太多。 MSP430FR5969有五个计时器(TA0-3、TB0)、您应该使用这些计时器来对任务进行分频。 TA1继续创建 PWM 输出、一个内部计时器(TA2/3)触发 ADC 转换、而另一个内部计时器在需要时启动 TB0 PWM 输出。 应减少所有 ISR 以执行小任务并尽快返回活动或 LPM。

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

    首先、非常感谢您花时间回答我的问题。 我很感谢。
    关于您的答案、我认为 MCLK 不能用于高于8MHz 的频率。 我弄错了。
    另一方面、我已经修改了我的代码、当我转到实验室时、我将对其进行测试、我将向您提供反馈。 考虑一下代码、在我的案例中、另一种可能的解决方案可以在每个 TA1CCRx 中创建不同的 ISR、从3到6个不等? 我想测试这种方法是否可行、但 CCS 无法识别 TA1CCTL3、TA1CCTL4、TA1CCR3和 TA1CCR4。 我是否必须包含一些能够识别这些寄存器的库? 我不确定该主题是否是提出此问题的正确方法。 如果不是、请毫不犹豫地告诉我。

    再次感谢你。

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

    MCLK 可以高达16MHz、但您必须确保相应地调整 FRAM 等待状态、您可以参阅 msp430fr59xx_cs_02.c 以了解如何执行此操作的示例。 MSP430FR5969中不存在 TA1 CCR[3-6]、但 TB0具有您要查找的 CCRx 寄存器数量。

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

    人能听到的东西相当慢。

    硬件 PWM 永远不会错过任何节拍、它是否可以因 ISR 占用系统而跳过更改、是的。

    您正在使用 timerB 硬件 PWM 来生成1-2 KHz 范围内的音调?
    您需要根据 ADC12采样值更改音调吗?

    您是否无法使用 timerB IRQ 读取最后一个 ADC 样本、然后 触发另一个 ADC12采样?
    可以使用:如果(!++跳过和7)、如果您只想在 ISR 运行时每八次执行一次。

    不要在 ISR 中执行复杂的数学运算。
    永远 不会从 执行标志硬件轮询的 ISR 执行函数调用。

    运行均值将数学分解为较小的片段、减少了占用系统的风险:
    unsigned int temp = ADC12MEM;
    battery.volt=(temp+battery.volt*3)/4;//平均3/4 OLD + 1/4 NEW

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

    到目前为止、我无法执行必要的测试来验证我所做的更改是否正确。 我做了你布朗先生和菲利普松先生向我推荐的每一项修改。 我使用了不同的计时器、不同的 CCR、不同的频率、不同的一切、但没有发生任何情况。 因此、考虑到我不是 MSP430领域的经验丰富的人、我决定从零开始。 实际发生的情况是端口配置未正确完成。 具体地说:

    P1DIR = 0x10;
    P1SEL0 = 0x10;

    这是一个愚蠢的错误、但我看不到它。 当我改变这个时、一切都很明显。 我很抱歉以前没有看到过这种情况、而且浪费了您的时间。

    我希望今后能够作出更认真的贡献。

    非常感谢。

    Trujillo