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.

[参考译文] CCS/MSP432P401R:切换 GPIO

Guru**** 2213890 points
Other Parts Discussed in Thread: ENERGYTRACE, ADS1220
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/789422/ccs-msp432p401r-toggle-gpio

器件型号:MSP432P401R
主题中讨论的其他器件:ENERGYTRACEADS1220

工具/软件: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);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我对调试器与您描述的问题之间的关系感到困惑。 如果您的代码正在/正在工作、则请返回工作状态、只需连接3V 电源轨并断开与 JTAG 和反向通道 UART 相关的所有其他 IO、然后使用能量跟踪测量电流。

    e2e.ti.com/.../2755877

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ´m、我现在只是在引脚5.2和接地之间连接一个 LED。

    我的脚本仅在调试时使用 CCS8时关闭引脚5.2。 如果我将午餐垫连接到电池或任何其他电源、引脚5.2将始终保持高电平... 触发第一个 RTC 警报后、LED 将发出光。 但它永不停止。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我唯一能想到的是调试器会阻止器件实际进入 LPM3。 我建议查看 LPM3示例并与 LPM3的处理方式进行比较。

    dev.ti.com/.../

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

    我´ve 解决了这个问题。 ´ve 使用 SysTick 中断、我将其更改为使用 Timer32。 现在、LED 变化按预期工作。

    代码保持不变。 仅在"timer32_periode_mode_led_toggle.c"示例之后、使用"activateTimer32 (int delay)"更改了'activateSysTick (int delay)'调用函数。 一种罕见的事情只能在一个中断时工作、而不能在另一个中断时工作。

    明天´ll、我将使用传感器检查代码、并让您知道情况如何。 幸运的是、我们可以消除这种威胁。

    感谢您的所有回答。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的反馈。 是的、这是有道理的、因为 SysTick 是从 MCLK 运行的。 当请求转换到 DeepSleep (lpm3)时、如果在 DeepSleep 模式下不支持时钟请求、则该请求将被拒绝、除非时钟请求逻辑被禁用或启用了粗鲁模式。 由于外设仍在请求相同的时钟、Timer32正常工作毫无意义。 我会继续看。

    您使用的是 RTOS 还是配置 SysTick 的调度程序?

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

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

    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);
    } 





  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    粗鲁模式不会影响 RTC、但会确保进入深度睡眠(LPM3)的请求被批准。

    此致、
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有关于此问题的任何更新?

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

    Chris、

    现在一切都正常。 ´re 感谢您的帮助。