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.

[参考译文] MSP432P401R:MSP432P401旧版 MSP432WARE 3.4示例问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/871735/msp432p401r-msp432p401-older-msp432ware-3-4-example-issues

器件型号:MSP432P401R
主题中讨论的其他器件:MSP432WARE

在对 MSP432Ware 3.4_xx 进行一些研究并使用 Timer_A0中断进行实验而不激活它们之后、必须有理由

下面使用的示例不是 driverlib、而是使用一个计时器和一个中断的纯寄存器级示例。

//-----

//  Texas Instruments Inc.
//  2016年6月(更新)| 2013年11月(创建)
//  使用 CCSv6.1、IAR、Keil、GCC 构建
//
#include "msp.h"

int main (void){
   WDT_A->CTL = WDT_A_CTL_PW |            //停止 WDT
           WDT_A_CTL_HOLD;

   //配置 GPIO
   P1->DIR |= BIT0;
   P1->OUT |= BIT0;

   Timer_A0->CCTL[0]= TIMER_A_CCTLN_CCIE;// TACCR0中断被启用
   Timer_A0->CCR[0]= 50000;
   Timer_A0->CTL = TIMER_A_CTL_ssel_SMCLK |// SMCLK,连续模式
           Timer_A_CTL_MC__Continuous;

   SCB->SCR |= SCB_SCR_SLEEPONEXIT_MSK;   //从 ISR 退出时启用睡眠

   _enable_interrupt ();
   NVIC->ISER[0]= 1 <<(TA0_0_IRQn)& 31);

   while (1)   {
       _SLEEP();
       __no_operation();                  //用于调试器
   }


//计时器 A0中断服务例程
void TA0_0_IRQHandler (void){
   Timer_A0->CCTL[0]&&~Timer_A_CCTLN_CCIFG;
   P1->OUT ^= BIT0;
   Timer_A0->CCR[0]+= 50000;             //将偏移添加到 TACCR0

此示例 A 看起来完整、但实际上在 CCS 6.1.3中、这些中断不存在。

现在、由于 Cortex 使用大量预设、依赖项和模式、 例如在可以使用中断之前激活中断、

这是否意味着每次 预设都是静态的,还是在 它被释放之前,它应该是静态的?

其他一些示例 B 以另一种方式使用中断,它们在使用中断之前每次都被激活?

while (1)   {
       MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1 | GPIO_PIN4);
       MAP_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);
       MAP_Interrupt_enableInterrupt (INT_EUSCIA0);
       MAP_Interrupt_enableInterrupt (INT_Port1);
       MAP_Interrupt_enableInterrupt (INT_TA1_0);
       MAP_Interrupt_enableInterrupt (INT_TA2_0);
       MAP_Interrupt_enableMaster();
       MAP_PCM_gotoLPM0 ();
   }

现在 、另一个 MSP432Ware 3.4_xx 示例 B 会按预期激活中断、但这两个示例原理 A 和 B 现在有所不同

最后一个问题是 MSP432WARE 3.40_xx 寄存器级示例是否正常工作? 或者是否存在其他问题

此问题背后的未知原因、工具、版本、库等

实际上、如果 MSP432的文档确实具有运行时寿命、则对上述定义生命周期的描述并不十分详细。

BR

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

    您好!

    我们将仔细研究它、尽快返回给您。 请多多包涵。

    谢谢、

    PM

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

    你(们)好

    好的,实际上 A 示例中可能缺少的一个东西是计数器设备 TA0中断激活,TAIE 没有被置位?

    至少这会阻止它创建中断、但添加这仍然没有激活中断服务函数。。。?

    嗯...

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

    我认为该解决方案存在于 MSP432 driver_lib 和寄存器级 MSP432WARE C 文件示例之间、这些中断根本未使用、这可能会导致空 CCS 工程等待时出现故障。

    与 纯寄存器级 c 文件示例相比、Driver_lib 在这个阶段的作用更多、通过在 使用 CCS 编译器时将用户中断函数作为外部文件引入系统启动文件 startup_msp432p401_ccc.c、这就需要手动包含系统使用的中断服务函数。

    'DEFAULT_ISR'由该文件表中的器件中断函数名称替换、在注释列右侧、保持 STARTUP_msp432p401_CCC.c 中的中断顺序

    因此、MSP432WARE 3.40_00具有一组寄存器级 C 文件示例、它们非常有用且结构紧凑、但使用它们的开始步骤通常并不十分明显、或者在其他地方记录得非常简单。

    希望这有助于其他人激活缺失的中断

    BR

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

    是的、所提供的 startup.c 文件的早期版本用"defaultISR"(或某些这样的)填充矢量表、并且为了添加一个 ISR、还必须手动修改 startup.c。 后续版本使用适当的(CMSIS-Form)名称填充该表、这些名称称为"弱外部变量"、如果不存在则解析为 Default_Handler。

    这些较旧的 startup.c 文件在较旧的示例中仍然是浮动的(因为我是一个电池组、所以我仍然有一个3.30.00.01的副本)、所以这是需要注意的。 不过、我不确定 DriverLib (本身)会影响这一点。

    "弱外部因素"的方法是我认为更好的方法。

    [如果情况不明显:我同意您的意见。]

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

    你(们)好

    好的、感谢您的评论、更新的 MSP432WARE 和 CCS 7.4内部预设已更改、不再如此

    手动维护。

    但现在要进行下一个实验、因为目标是以 最小的 SW 交互获得到输出 IO 引脚的非常精确的计时脉冲

    此 TA 计数器。

    我认为中断会增加一些延迟、如果它是恒定的、这是可以的、但如果直接内部信号认为计数器具有较高的优先级、那就更好了。

    在对定时器16位定时器进行了一些研究之后、注意到 OUTMODE 信号发送困难、因为模式3未进行设置复位

    显示在 MSP432P401R 的 P7.3 TA0.0引脚上、实际上它们在任何模式下都未正确显示。

    现在、需要对输出信号用例进行一些说明、 其中提到了 OUTMODE_0 (1..7)、但

    1) 1)这是否应在 CCR 寄存器初始化时进行预设?

    2) 2)或者在比较匹配时、它在中断功能上设置为 CCR 寄存器?

    3) 3)这可能是连接到端口/其他输入的硬件逻辑接口、因此可能需要在 OUTMOD 0之外的其他模式中进行预设、等等

    是否应通过将 CCRx 寄存器使用值设置为0或1来将其设置为中断功能时的 CCR 寄存器?

    第606页的 Timer_A 文档显示了这个计数器原理图、输出位输入具有与门到 OUT6信号(CCR6 reg 示例)、但

    我 认为这个逻辑连接到 TimerAx (1..4)和第二个器件输出、所以如果引脚 P7.3被保留到 TA0.0

    那么任何 TA0 CCRx 寄存器比较输出都可以控制 P7.3引脚吗?

    此比较模式应独立于捕捉输入 CCIS、SCS、因为中断由 CCRn 和 CCR0激活、但由 OUTMODE 激活

    或者比较器输出和 D-FF 时钟信号之间存在时序或相位差时、信号不会出现这种情况。

    一个很长的故事是 、很快就有一个 MSP432P401 OUTMODE 0使用示例、例如。  在计数期间使用 CCR1->CCR0或使用 CCR3->CCR0进行多次比较,请?

    此致

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

    如果我正确理解您的问题、您只需要寻找脉冲序列。 这里的关键字是"PWM"。 大多数人使用"PWM"一词来表示改变脉宽、但如果您永远不改变脉宽、这只是一个(固定)脉冲序列。 您可以设置一次脉冲序列、而不会触摸它、硬件将为您生成脉冲序列(尤其是:无需 ISR)。

    OUTMOD 描述了波形的外观、CCR 定义了频率和脉冲宽度。 CCR0几乎是每个 OUTMOD 的一部分、因此您应该计划使用 TA0.1和更高版本、而不是 TA0.0。

    示例 msp432p401x_TA1_16生成两个脉冲序列、即具有指定脉冲宽度(由于是同一个计时器、因此频率相同)的固定 PWM 流:

    http://dev.ti.com/tirex/explore/node?node=AM9ftBfVYSFvblITRKXJwQ__z-lQYNj__LATEST

    [编辑:链接稍好]

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

    大家好、感谢您的回复和评论。

    是的、目标是获得100ms 的延迟、由 SW 激活、并且该计时输出应连接到外部 IO 引脚。 混淆是误解了多个 CCR 比较结果是合并到公共 IO 引脚还是稍后。 很明显、它们各自都有自己的专用 IO 端口、可在其中输出 事件。

    不用担心、复杂的逻辑有时也会如此。

    感谢您的指导