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.

[参考译文] MSP432E401Y:计时器查询

Guru**** 2537350 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1068273/msp432e401y-timer-inquiry

部件号:MSP432E401Y
“线程:测试”中讨论的其它部件

您好,

你好。 我们的客户询问了 MSP432E4计时器的相关信息。 请参见下文。

有一个关于 MSP432E4计时器(16位单独使用)的问题,我可以将 Timer2B 配置为 timer_CFG_B_periodic,并使用 MAP_TimerLoadSet 将计数器设置为1000,它的计数可能从1000到0,这是正确的

如果我通过 timer_CFG_B_periodic 更改 timer_CFG_B_B_periodic_up,它将无法工作,只有0-65535。

未遇到错误。 我想从0加载开始计数(匹配)

https://paste.ubuntu.com/p/pYN2Zw4k9T/

/* --COPYRIGHT--,BSD
* Copyright (c) 2017, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --/COPYRIGHT--*/
/******************************************************************************
* MSP432E4 Example project for Configuring a timer in 16-bit periodic mode
*
* Description: In this example, the timer is configured to generate an
* interrupt every 0.1 sec in 16-bit periodic mode. On the interrupt the state
* of the LED D2
*
* MSP432E401Y
* ------------------
* /|\| |
* | | |
* --|RST |
* | |
* | PN0|-->LED
* | |
* | |
* | |
* Author: Amit Ashara
*******************************************************************************/
/* DriverLib Includes */
#include

/* Standard Includes */
#include
#include
#include "uartstdio.h"
int i=0;
void TIMER2B_IRQHandler(void)
{
uint32_t getTimerInterrupt;

/* Get timer interrupt status and clear the same */
getTimerInterrupt = MAP_TimerIntStatus(TIMER2_BASE, true);
MAP_TimerIntClear(TIMER2_BASE, getTimerInterrupt);

/* Toggle the LED */
if(1)
{
i=0;
MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0,
~(MAP_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_0)));
UARTprintf("cnt\r\n");
}
}

void ConfigureUART(uint32_t systemClock)
{
/* Enable the clock to GPIO port A and UART 0 */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

/* Configure the GPIO Port A for UART 0 */
MAP_GPIOPinConfigure(GPIO_PA0_U0RX);
MAP_GPIOPinConfigure(GPIO_PA1_U0TX);
MAP_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

/* Configure the UART for 115200 bps 8-N-1 format */
UARTStdioConfig(0, 115200, systemClock);
}

int main(void)
{
uint32_t systemClock;

/* Configure the system clock for 120 MHz */
systemClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480),
120000000);

ConfigureUART(systemClock);
/* Enable the clock to the GPIO Port N and wait for it to be ready */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
while(!(SysCtlPeripheralReady(SYSCTL_PERIPH_GPION)))
{
}

/* Configure the GPIO PN0 as output and put in low state */
MAP_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0);
MAP_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0, ~(GPIO_PIN_0));

/* Enable the Timer-0 in 16-bit periodic mode with interrupt generated
* every 0.1 sec */
MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);
while(!(SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER2)))
{
}

MAP_TimerConfigure(TIMER2_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PERIODIC_UP);/*TIMER_CFG_B_PERIODIC work*/
MAP_TimerIntEnable(TIMER2_BASE, TIMER_TIMB_TIMEOUT);

/* Since the 16-bit timer can count only 65536 value, we use the pre
* scaler of 256 to divide down the count rate by 256. Thus the actual
* count load is 120e6/256 = 468750. Now when to count at 0.1 sec the
* load value in the timer would be 468750 * 0.1 = 46875 = 0xB71B. */
MAP_TimerPrescaleSet(TIMER2_BASE, TIMER_B, 255);
//MAP_TimerLoadSet(TIMER2_BASE, TIMER_B, (systemClock/(256*10)));

// MAP_TimerLoadSet(TIMER2_BASE, TIMER_B, 10000); /*could not work,just count 0-65535*/
// MAP_TimerMatchSet(TIMER2_BASE, TIMER_B, 10000); /*could not work,just count 0-65535*/

//MAP_TimerMatchSet(TIMER2_BASE, TIMER_B, (systemClock/(256*10)));

/* Enable Timer Interrupt */
MAP_IntEnable(INT_TIMER2B);

/* Enable the timer count */
MAP_TimerEnable(TIMER2_BASE, TIMER_B);
UARTprintf("Hello\r\n");
while(1)
{
}
}


请帮帮我们。 谢谢你。


此致,

塞德里克

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

    你(们)好

    GPMTBILR 寄存器是 UP 模式下的绑定值(默认值为0xFFFF)。 检查其配置。

    有关详细信息,请参阅用户指南

    www.ti.com/.../slau723a.pdf

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

    你好,艾伦,

    感谢你的回复。

    我们收到了客户的反馈。 请参见下文。

    你知道,在我的代码中,我尝试通过 MAP_TimerLoadSet (TIMER2_base, TIMER _B, 10000);更改 GPMTBILR,但它不起作用。 我尝试了 TimerLoadGet();检查 GPMTBILR,但它是10000而不是0xFFFF。
    我的时间2B 仍为0-65535。 如果是 msp432e 中的错误,请告诉我。


    此致,

    塞德里克

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

    你好,艾伦,

    获得客户的反馈。 请参见下文。

    最新消息,我得到了“UINT32_t*”指向 GPMTBILR 地址的一个点。 事实上,API 是有效的,但当 GPMTBPR 设置为 TIMER _CFG_B_B_CONRATED_UP“0x00003200”或 TIMER CFG _B_PWM“0x00000A00”时,GPMTBILR 可能无效。

    此致,

    塞德里克

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

    你(们)好  

    我已经检查过计数模式是否存在缺陷。

    您可以参考示例代码和驱动程序用户指南来修改代码。

    https://dev.ti.com/tirex/explore/node?node=AOD4LXqFA8XEr21FehvtQA__J4.hfJy__LATEST

    dev.ti.com/.../node

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

    你好,艾伦,

    请参阅以下客户的回复:

    但我恐怕要说,我已经提到了你提到的案例,只是把第97行的 TIMER CFG _B_REVALIDE_TIMER 替换为 TIMER CFG _B_REVALID_UP,这会导致第105行在设置在第104行生效时无效。 如果您还通过查看 LED 闪烁频率来观察计时器频率,请将线路105更改为 MAP_TimerLoadSet(TIMER2_BASE,TIMER _B, 10000);,您可以清楚地感觉到10000和65535之间的差异。 如你所说,如果你已经尝试点算,我将不胜感激,如果你能向我提供一个你确认可用的代码。 它还可以减少您的工作量。


    此致,

    塞德里克

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

    您好,Cedrick,

    我对计时器做了很多测试。 在倒计时模式下,时间间隔是预计算器的 TIMER TBILR 值*。 当我更改 TIMER TBILR 值或预分频器时,周期将相应地更改 。 但在计数上升模式下,只有当预计算器=0时,时间间隔才会与 Time_TBILR 值成比例变化。 当 TIMER 不是0时,间隔看起来像65535×预先计算器+ TIMER TBILR。

    我不清楚为什么它会如此。 它需要时间来了解。

    客户可以使用停机模式作为解决方法。  对于最终实现的功能,向上和向下模式之间没有差异。

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

    您好,Cedrick,

    《技术参考手册》18.3中有相关说明。 随着倒计时模式预计算器充当真正的分隔符。 但在计数模式下,它是一个分机,而不是  

    真正的预分频器。 这就是为什么点点算/点算有不同的行为。