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.

[参考译文] MSP-EXP432P401R:对TimerA捕获示例存在疑问

Guru**** 2608405 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/654341/msp-exp432p401r-doubt-on-timera-capture-example

部件号:MSP-EXP432P401R

大家好!

我需要使用TimerA捕获数字方波,因此我开始看到了tirrex上的相关示例。

我有CCS v lp.rp 0.0.005万 和黑色启动板msp-exp432p401r,我参考ti-Rex中的示例,该启动板(msp432 pre-produion black lp version 3.30 .6.2 01.0)称为msp432p401_ta0_capture。
在此示例中,ACLK被路由到TA0.CCI2A引脚,因此在timerAcaptureValue变量中的20个周期后,I应从ACLK时钟的两个连续上升边缘读取已用时间。
我希望这些值代表ACLK时钟周期,但当我暂停调试器时,此数组中的值很奇怪,并且总是会增加。

它们的起始值为~441,结束值为~2012。
这些值不是常量值? 或者我错了?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    捕获的是实际计数器(TA0R)值。 如果您想要连续捕获之间的增量,则需要自行减去它们。

    20个捕获涵盖441-2012声音,如(2012-441)/19=~83 ticks。 由于SMCLK的速率(很模糊)为3MHz,大约是83/3=~28usec,虽然不是30usec,但非常接近。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Bruce,非常感谢您的回答!
    在我的推理中,我忘记了价值观之间的区别! 使用值之间的差值,我获得了~32KHz的ACLK正确值。
    再次感谢! ;)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢Bruce!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好!

    我对这一论点还有另一个问题,所以我不会再发布一篇文章。

    在ti-Rex中有三种类型的示例:driverlib示例,CMSIS样式示例和经典样式示例。

    在前一类示例中,我注意到当程序进入ISR时(这出现在多个驱动程序示例中),存在清除中断标志的方法,在TimerA捕获示例中,存在以下代码行:

    MAP_Timer_a_clearCaptureCompareInterrupt (timer_A0_base,timer_a_CAPTURECOMPare_register_1);

    但在最新示例(CMSIS样式和经典样式)中,没有任何代码行可清除中断标志。

    我会使用CMSIS或经典样式来编写代码, 因此,我不明白为什么在CMSIS和经典样式示例中,当程序进入ISR例程时,中断标志未被清除,而在driverlib示例中,当程序进入ISR例程时,中断标志被清除。

    有何区别?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您提出了一个好的观点。 因为他们不使用CCR0,所以他们都应该明确清除CCIFG,但我的副本(我认为是SLAC698D)没有。

    似乎有些示例(CMSIS/Classic)“偶然”地没有清除CCIFG工作-- ISR只需要足够长的时间(~90时钟),到ISR重新触发时(因为CCIFG仍处于设置状态),下一次捕获就已经准备就绪。 我尝试将捕获输入(WFP 2.5)连接到GND,然后将其删除,结果得到了20个具有相同值的捕获。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Bruce,再次感谢您的回复!

    因此,实用的答案是,使用ISR的正确方式是driverlib? 因此,在所有情况下(也使用其它外设),当程序进入ISR时,是否需要清除中断标志? 这是因为中断是由NVIC模块管理的,对吗? 此外,这取决于我使用的编译器(ti或GNU编译器),还是不取决于编译器?

    我是msp432的新手,但我有使用8位Atmel微控制器的经验。 当程序进入ISR时,使用这种微控制器,当程序执行例程时,ISR会自动清除中断标志,这是我的疑问。

    我还有一个关于msp432的问题,我如何找到一个好的学习材料? 我在TI现场看到过,但关于msp432的材料很少,很多材料是用于MSP430 (车间和其他)的,我可以参考msp432吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    规则不是很简单;您必须阅读相关的用户指南部分。 规则(如它们)不依赖于编译器。

    即使对于计时器A:CCR0:CCIFG也有自己的中断矢量,因此CCIFG自动清除。 所有其他CCRx:CCIFG (和TAIFG)使用"组"向量,您必须主动清除IFG (直接或通过TAxIV)。

    在eUSCI中,通过操作RX/TX BUF寄存器清除RX/TX IFG。 (您可以明确清除IFG,但我不建议这样做。) AVR也是如此。 与ADC14类似(正如我在AVR中所回顾的那样,您必须明确清除ADC IF)。

    我不得不在培训材料方面听从其他人的意见。 这些例子总的来说是一个很好的指导,即使这一个例子漏过了视察员。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次感谢Bruce!
    我明白你告诉我的! 问题是我没有像msp432上的好书一样的学习材料。 我知道数据表不是用户友好型的,所以我需要阅读一些时间来深入了解msp432外围设备。
    在这一刻,我读了一些关于ARM皮层结构的书,以及一本关于msp432的书,所以我开始使用这个微控制器来参考这些例子。 也许使用msp432的快速方法是使用driverlib,但我认为这与CMSI/经典方法相比不太灵活,我还在driverlib上找到了一些示例(特别是adc14中的一个),增加了我的疑虑。
    如果我有其他疑问,我会写一些其他的帖子! ;)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您仍在犹豫,这是您需要的代码行:
    [经典]
    TA0CCTL2 &=~CCIFG;
    [CMSIS]
    TIME_A0->CCTL[2]&=~TIME_A_CCTLN_CCIFG;

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

    你好,布鲁斯!

    谢谢,实际上我已经写了这个课程,但我还没有完成,所以你的帮助很有用! ;)

    实际上,我已经为atmega2560编写了完整的程序,但我对这款微控制器有一些问题,所以我尝试使用最强大的msp432。

    显然,程序是结构化的,并且是用c ++编写的,所以现在我可以理解代码的可移植性是什么意思! ;)

    布尔
    计时器A_icp::ISR() volatile {
    	CURR= TIME_A2->CCR[3];
    	句点=(Curr-prev);
    	prev = CURR;
    	IF (++I =2){
    		TIMER_A2->CTL |= TIMER_A_CTL_MC__STOP | TIMER_A_CTL_CTL_CLR;TIMER_A2->CCL=0;
    		CCI_EL_ELAE=~<3
    		
    		
    	;CCEL_RETURN
    	
    = 

    目前,这是我在TimerA ISR中调用的代码,但我尚未进行测试。 请您继续关注, 也许我会再次需要您的帮助! ;)

    硬件调试器非常有用,可以帮助您找到一些问题!