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.
工具/软件:Code Composer Studio
您好!
我在´m MSP432 Launchpad 开发低功耗应用时遇到了一些问题。 想法是将微控制器保持在 LPM3下、每分钟唤醒一次以打开某些传感器、使用 SysTick 延迟、测量、关闭传感器电源、最后返回休眠状态。 这种´s 不是什么,而且运行良好。
当我´m CCS8调试模式时、一切都正常。 但是、当我重新启动 launchpad 并尝试使用 EnergyTrace 测量功耗时、情况开始发生故障。 传感器电源引脚永远不会再次变为低电平。
我´ve 了´m 位的代码、因此我不再使用传感器、而是每分钟从 LPM3唤醒、在引脚5.2上打开 LED、在 SysTick 延迟并关闭 LED。 LED 仅在使用调试模式时关闭... 我´ve ^了 MAP_GPIO_setOutputLowOnPin 和 P5OUT´m = 0x04;此时我完全丢失。
void main (void) { // ULP 模式 WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;//停止看门狗计时器 PADIR = 0xFFFF; PBDIR = 0xFFFF; PCDIR = 0xFFFF; PDDIR = 0xFFFF; pedir = 0xFFFF; PJDIR = 0xFFFF; PAOUT = 0; PBOUT = 0; PCOUT = 0; PDOUT = 0; PEOUT = 0; PJOUT = 0; MAP_SYSCTL_enableSRAMBankRetention (SYSCTL_SRAM_BANK1); //将频率降级到12MHz CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 12); /* el modo ULP pone TODOS pines a 0。 ESO Hace que los canales I2C consuman。 很棒的一家餐馆值得推荐 * ADS1220_init(); //调试 int epoch = 1552733990; TIME_startRTC (epoch); /* Bucle Infiniband。 Mantiene el micro en Estado de ultra bajo consumo * while (1) { MAP_Interrupt_enableSlepOnIsrExit(); MAP_Interrupt_enableMaster(); _enable_interrupt (); __LOW_POWER_MODE_3(); } } void activateSysTick (int delay) { //将 SysTick 配置为在6.000.000处触发是1秒 MAP_SysTK_enableModule(); MAP_SysTK_setPeriod (延迟); MAP_Interrupt_enableSlepOnIsrExit(); MAP_SysTK_enableInterrupt (); } void active_sensors (void) { GPIO_setOutputHighOnPin (ADS1220_POWER_PORT、ADS1220_POWER_PIN);//引脚5.2 //ADS1220_Beginptr (); stateMeasure = true; ActivateSysTick (1500000); } void shutdown 传感器(void) { //ADS1220_shutdown (); P5OUT ^= 0x04; //map_GPIO_setOutputLowOnPin (ADS1220_POWER_PORT、ADS1220_POWER_PIN);//引脚5.2 } void measure_sensors (void) { int hora = 0; Hora = time_secondsSinceEpchh (); SHUTDOWN_SENSORS (); } void SysTick 处理程序(void) { map_SysTick disableModule(); IF (状态测量) { stateMeasure = false; measure_sensors(); } } /********* * RTC ISR * Atiende las interruptiones generadas por / void RTC_C_IRQHandler (void) { uint32_t status; STATUS = MAP_RTC_C_getEncableInterruptStatus(); MAP_RTC_C_clearInterruptFlag (status); if (status & RTC_C_TIME_EVENT_INTERRUPT){ activate_sensors(); } }
在这里确实会得到一些帮助。
我忘记说、函数 ADS1220_init()(在 main 上调用)启用端口5.2作为输出:
void ADS1220_init (void){ /* SPI */ MAP_GPIO_setPeripheralModuleFunctionOutputPin (SPI_PORT_B2、SPI_CLK_PIN_B2 | SPI_MOSI_PIN_B2、GPIO_PRIMARY_MODULE_FUNCTION); GPIO_setPeripheralModuleFunctionInputPin (SPI_PORT_B2、SPI_MISO/PIN_B2、GPIO_PRIMARY_MODULE_Function); SPI_initMaster (EUSCI_B2_base、&spiMasterConfig); SPI_enableModule (USCI_B2_base); SPI_DisableModule (USCI_B2_base); MAP_GPIO_setAsOutputPin (ADS1220_POWER_PORT、ADS1220_POWER_PIN); MAP_GPIO_setAsOutputPin (ADS1220_CS_PORT、ADS1220_CS_PIN); }
Chris、
n´t 我昨天回答了你的问题。 度过了漫长的一天
我使用一些传感器(ADS120和 SHT35)测试了代码、一切正常。
我不´m RTOS。 纯 C。我的想法是将 MSP432作为状态机处理。
我的 MSP432始终处于 LPM3模式、并会中断唤醒。 想法是每分钟唤醒一次电路板(RTC 中断)并进行测量。 为了降低功耗、我仅在测量之前打开传感器。 我尝试在打开传感器和测量之间使用 SysTick、以便他们有时间自行"加热"。 正如您之前所说的、它只使用 timer32。
我对 MCLK 还有一个疑问。 在我的´m 中、我使用 MSP432内部 RTC、Timer32、SPI 和 I2C。 I θ´m 还将中心频率降低至12MHz。 我不´m RTC、但其他所有器件都使用 MCLK。 这会产生一些冲突吗? 这是否会导致 RTC 中出现错误(未给出正确的日期-时间)?
感谢您提供更多信息。 RTC 只能使用系统 BCLK、该系统可由内部 REFOCLK 或外部 LFXTCLK 提供。 MCLK 是一个单独的系统时钟、因此没有冲突或交互。 MCLK 将在 LPM3中消失、而 REFOCLK 或 LFXTCLK (RTC 使用的任何一个)将保持打开。 除了1分钟的中断、您还在从 RTC?
在进入 LPM3之前、您是否使用"粗鲁模式"?
MAP_PCM_enableRudeMode();
谢谢、
Chris
Chris、
是的、´m´ve RTC 中断发生时、我将会堆叠时间戳。想法是测量传感器并知道传感器的数据时间。
我´m 不使用
MAP_PCM_enableRudeMode();
如果我这么做、它会如何影响 RTC? I´m 用来启动 RTC 的代码为:TC:
void time_startRTC (int epoch) { RTC_C_Calendar CurrentTime = TIME_环氧树脂(epoch); /*为外设/晶体使用配置引脚、为输出配置 LED */ MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN0 | GPIO_PIN1、GPIO_PRIMARY_MODULE_Function); /*设置外部时钟频率。 此 API 是可选的、但会是可选的 *如果用户想使用 getMCLK/getACLK/etc、就来方便 函数 * cs_setExternalClockSourceFrequency (32000、12000000); /*在非旁路模式下启动 LFXT 而不超时。 * CS_startLFXT (CS_LFXT_DRIVE3); /*按照定义部分中的时间说明使用当前时间初始化 RTC */ MAP_RTC_C_initCalendar (&CurrentTime、RTC_C_FORMAT_BINARY); /*指定一个中断,每分钟发出一次*/ MAP_RTC_C_setCalendarEvent (RTC_C_CALENDAREVENT_INTOTECHANGE); /*启用 RTC 就绪状态中断、当 RTC 时该中断有效 *日历寄存器已准备好读取。 *此外,为日历警报和日历事件启用中断。 * MAP_RTC_C_clearInterruptFlag (RTC_C_TIME_EVENT_INTERRUPT); MAP_RTC_C_enableInterrupt (RTC_C_TIME_EVENT_INTERRUPT); /*启动 RTC 时钟*/ MAP_RTC_C_startClock(); /*启用中断并进入睡眠模式。 * MAP_Interrupt_enableInterrupt (INT_RTC_C); }
Chris、
现在一切都正常。 ´re 感谢您的帮助。