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:Timer32周期配置错误

Guru**** 2562120 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/603481/msp432p401r-timer32-period-is-configured-incorrectly

器件型号:MSP432P401R

您好! 我正在尝试在 MSP-EXP432P401R 修订版1.0板上使用 Timer32 (DriverLib - v4_00_00_11)。 这是我每1秒用于切换 LED1的代码:

int main (void)
{
//启用 FPU,启用堆栈以进行浮点计算
map_fpu_enableModule();
MAP_FPU_enableLazyStacking();

//停止看门狗
MAP_WDT_A_HOLDTimer();
MAP_Interrupt_disableMaster();

//设置外部时钟频率
MAP_CS_setExternalClockSourceFrequency (32768、48000000);
MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);

//配置用于晶振的引脚
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN0 | GPIO_PIN1、GPIO_PRIMARY_MODULE_Function);// LFXT
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);// HFXT

MAP_FlashCtl_setWaitState (FLASH_BANK0、2);//针对48MHz
MAP_FlashCtl_setWaitState (FLASH_BANK1、2);//针对48MHz

//启动 LFXT
MAP_CS_startLFXTWithTimeout (CS_LFXT_Drive0、10);
//启动 HFXT
MAP_CS_startHFXT (false);

//初始化 MCLK、HSMCLK、SMCLK 和 ACLK
MAP_CS_initClockSignal (CS_MCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_1);
MAP_CS_initClockSignal (CS_HSMCLK、CS_HFXTCLK_SELECT、CS_CLOCK_DEVIDER_1);
MAP_CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_SELECT、CS_Clock_divider);//最大 CS_HSMCLK / 2.
MAP_CS_initClockSignal (CS_ACLK、CS_LFXTCLK_SELECT、CS_CLOCK _divider _1);//最大128kHz
MAP_CS_initClockSignal (CS_BCLK、CS_LFXTCLK_SELECT、CS_CLOCK 分频器_1);//最大值为32768kHz

GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);

MAP_Interrupt_enableSlepOnIsrExit();
MAP_Interrupt_enableMaster ();//启用主中断

while (1)
{
Timer32_SLEEP_CYCLES (5000000);
}
}

void Timer32_sleep_cycles (uint32_t cycles)
{
/*将 Timer32配置为周期模式下 MCLK 的"uint32_t 周期"*
MAP_Timer32_initModule (TIMER32_0_base、TIMER32_prescaler_1、TIMER32_32位、TIMER32_PERiod_MODE);
MAP_Interrupt_enableInterrupt (INT_T32_INTC);

if (周期<= 4294967295) map_Timer32_setCount (TIMER32_0_BASE、周期);
else map_Timer32_setCount (TIMER32_0_BASE、4294967295);

MAP_Timer32_enableInterrupt (TIMER32_0_BASE);
MAP_Timer32_startTimer (TIMER32_0_base、true);

MAP_Interrupt_enableSlepOnIsrExit();
MAP_Interrupt_enableMaster();
MAP_PCM_gotoLPM0 ();//进入睡眠状态直到计时器达到周期数
}

void T32_INTC_IRQHandler (void)
{
MAP_Timer32_clearInterruptFlag (TIMER32_0_BASE);

GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);

MAP_Interrupt_disableSlepOnIsrExit();
} 

问题是定时器周期比设定的值大大约10倍。

例如、对于48MHz 频率、MCLK 周期为~20.8ns、为了休眠1秒、需要将计时器设置为大约50毫秒周期。 在上面的代码中、我使用500万个周期使其 休眠  1秒。 如果我使用5、000万个周期、则周期约为10秒。

导致此问题的原因是什么?如何解决?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    感谢您在论坛上发帖。 在我研究您的问题时、我希望您注意到最新器件支持文件不再支持版本1.0 (黑色) Launchpad。 该板已~2年使用、支持预发布 MSP432器件。 相反、我们建议更新为:

    a)具有最新器件版本的 Rev2.0 (红色) LaunchPad: www.ti.com/.../msp-exp432p401r
    b) SimpleLink MSP432软件开发套件(SDK)是一套全面的示例和演示、构建于 TI 驱动程序的基础之上。
    www.ti.com/.../simplelink-msp432-sdk


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

    感谢您提供相关信息。 我预计下周将收到修订版2.0 Launchpad、 在我拥有电路板时、我将再次测试代码。

    我目前正在使用 MSP432 SDK 1.30.00.40。

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

    我已经在修订版2.0电路板上尝试过代码、它工作正常。 问题是我使用 的是芯片的较旧版本。