请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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秒。
导致此问题的原因是什么?如何解决?