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.

[参考译文] MSP430F47177:如何分解 ADC 中断与放大器;硬件乘法器、这会导致复位

Guru**** 2390755 points
Other Parts Discussed in Thread: ADS131M08, MSP430F47177

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/989155/msp430f47177-how-to-disble-adc-interrupt-hardware-multiplier-which-is-causing-reset

器件型号:MSP430F47177
主题中讨论的其他器件:ADS131M08

大家好、  

我们使用 ADS131M08 AFE 测量连接到 MSP430F47177的电压、电流值。

之前、我们使用 MSP430F47177的内置 ADC 进行了同样的操作。 使用内部 ADC 时、使用了 ADC 中断和硬件乘法器。 (代码中存在硬件乘法器的 asm 代码)

现在、当我们要使用外部 ADC ADS131M08时、我们不需要 ADC 中断。 但是、我们需要计算  我们在 ADC 中断中执行的操作。

因此、我们禁用了 ADC 中断、并调用了一个函数(例如 ADC_Read)、该函数具有与 ADC 中断中存在的计算代码相同的计算代码。

在 ADC 中断代码中、有一个用于硬件乘法的汇编代码、用于计算平方和值。

当我们通过调用 ADC_Read 函数来运行代码时代码 执行到硬件乘法器部分、但随后进入 NMI 中断并进行复位。

如果我没有调用函数 ADC_Read、代码工作正常、但未进行复位。

这种情况发生的原因。

这是因为 ADC 中断未被正确禁用、我是否需要更改硬件乘法器项目中的设置?

注:-

我更改了以下设置

1。

更早的版本:- Project->Properties->MSP430 Compiler->Optimization -> Inline Hardware 乘法 RTS mpy 例程(--use_hw_mpy)=32

更改为:-

结果:-代码仍在重置。

2.

更早版本:- Project->Properties->MSP430 Compiler->ULP Advisor -> Hardware Multiplier

已更改为 :-“硬件乘法器”的“取消标记为”复选框

结果:-代码仍在重置。

谢谢、此致

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

    调试完代码后、发现它正在进入 NMI 中断。

    NMI 中断产生的原因是闪存访问违反。

    ACCVIFG 位被置位 IB FCTL3寄存器。

    如何避免这种情况?

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

    硬件乘法器的汇编代码如下:-

    asm (

    " MOV V32_temp+0、&0144h; //Signed 32 MPY

    " MOV V32_temp+2、&0146h; //Signed 32 MPY

    MOV #4096、0138h;//#4096是 SMCLK_ADC_Ratio

    MOV &0154h、V32_temp;

    " MOV &0156h、V32_temp+2;      

    "; MOV &0158h、V32_temp+2;   //添加到 MSB  

    "; MOV &015Ah、V32_temp+6;    

    );  

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

    我没有看到汇编代码有任何明显的错误。

    此时、我会假设我不小心将手肘夹在了一些不相关的东西中、并将其基本知识介绍给我:

    1) 1)检查映射文件以确保 V32_temp 没有突然移动到不合适的位置

    2)检查汇编代码以确保它看起来像 asm ()语句(可能与(3)合并)

    3)使用"运行->汇编步骤进入"(我认为有一个按钮用于此操作、但我现在看不到它)分步执行汇编代码、以固定准确的指令。

    这些可能告诉您任何信息、也可能不告诉您任何信息、但可能只需大约15分钟即可完成。

    除此之外:设置中的这些复选框仅控制编译器的功能;编译器不知道 asm ()语句中的内容。

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

    除非有某种理由保持这种通用、否则向左移动12位几乎总是优于使用乘法运算。

    我对您的代码有点困惑。 您将一个32位操作数写入 OP1、但随后只将一个16位操作数写入 OP2。 文档指出、在向 OP2L 写入16位值后、必须将后半部分写入 OP2H。 无法执行16X32乘法。 因此、我可以告诉您将乘法器悬空、但操作不完整。